服务器与客户端的数据同步

问题

  • 从一个例子提及,咱们的客户端从服务器获取数据,这里假定获取文章。第一次使用,咱们获取服务器端最新发表的几篇文章。
  • 咱们能够每次都从新获取,但这样费时又费流量。好的设计应该是咱们把获取过的文章存下来,下次只获取最新发表的文章。
  • 这样就有个问题,若是某一篇文章,咱们已经获取过了,可有一天它更新了。。。。
  • 还有个问题,文章持续获取下去,咱们手机没空间了。。。。
  • 如何使咱们客户端能保存有限的文章,而且同时能够获得更新呢?

解决方法

  • 为了保证客户端不存过多文章,咱们应该设置一个过时期限,当缓存的文章比较老旧,删除掉便可。
  • 为了保证客户端的文章可以获得更新,服务器的文章表应该有个最后修改时间字段。同时服务器端保存客户端最后一次获取文章的时间,保存在session里。

一、文章表设计

  • | index | content | ts | dl |
  • index 索引;
  • content 内容;
  • ts 文章最后一次的修改时间。把ts的格式设计为:NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,即默认为当前的时间戳,且随着文章更改,自动更新为更改时间。
  • dl 文章是否被删除了;

二、客户端查询文章时服务器端的工做

  1. 从session中查询该用户对文章的最后一次获取时间,last_gotten_ts;
  2. 若是有该记录,说明只须要给客户端发送last_gotten_ts只后的文章(dl != 1 AND ts > last_gotten_ts);
  3. 若是没有该记录,表示是这个用户第一次获取,那发送最近的若干条文章(dl != 1 ORDER BY index DESC LIMIT 10)。
  4. 将session里的last_gotten_ts设置为结果集里最大的ts.

三、客户端查询到最新文章时的工做

  1. 根据接收到的文章,新增或更新本地缓存。这里使用REPLACE INTO更合适。同时,根据dl字段判断是否已经被删除,若是是,删除本地的文章;
  2. 删除过时的缓存文章;
  3. 展现文章列表,注意这里应该以index,而不是ts排序。这样保证文章是以建立时间排序,而非更新时间。

四、向前查询

  1. 这种状况适用于上拉列表时加载更多文章的功能。目标是获取某个文章以前的文章。所以客户端请求时,应该带着最后一条文章的index,服务器返回该index以前的若干文章。注意这时候,不该该存储last_gotten_ts。

五、为何将last_gotten_ts存到session而不是数据库

  1. 咱们也能够新建一个表。相似这样的结构: | user_index | last_gotten_ts | 可是这样会有以下两个问题:
  2. 用户在其它设备登陆了,这时候服务器会觉得是从老设备上请求的,只发送last_gotten_ts后的文章,致使两个设备相互干扰。
  3. 当客户端好长时间没有使用时,可能致使服务器这段时间累积的文章量比较大。而事实上当客户端再次使用时,客户端不必所有接受,只须要接收最新的若干文章(就像第一次使用时那样)。
  4. 使用session则能够巧妙解决这两个问题。
  5. 两个设备相互干扰,显然不是咱们但愿的。而session是跟设备相关的,在服务器端每一个设备有本身的session,这样的话至关于每一个设备都相互独立,能够巧妙避开干扰。
  6. 若是咱们把session的过时时间设置恰当,当客户端再次使用时,旧session已通过期。新的session里并无任何查询历史。正如客户端第一次使用那样。这样就完美地解决了服务器端文章累积的问题。

六、客户端的文章“断层”

  1. 当客户端长时间不用,后面再使用时,由于没有所有获取,可能致使与缓存的老文章之间不连续,有“断层”。这样的话,若是用户再想加载更多文章时,可能咱们的代码会跳过这个断层,直接加载老文章以前的文章。这样的话这个“断层”就没机会获取到了,丢失了。
  2. 如何解决这个问题呢?其实很简单,只要设置好客户端本地的过时期限便可。客户端每次启动,都检查是否是有缓存文章过时了,若是过时了,就删除之。很明显,这个时间期限不能大于服务器端的session的过时时间。

七、服务器端的文章的dl字段

  1. 这个字段既然是删除的意思,那为何不直接删除该记录呢?这个字段的实质目的,是要告诉客户端该记录被删除了。若是直接删除了该记录,客户端无从得知这个删除信息,那本地的缓存也就没法删掉。
  2. 若是已经被删了,还留在表里,是否是不太好?的确很差。服务器按期检查这些被删记录的删除时间(ts),若是超过必定期限了,那也删除之。注意这个期限不能小于客户端缓存的时间,即:保证在客户端删除了本地缓存记录以后,再删除该记录。
相关文章
相关标签/搜索