一.简介
客户端缓存机制不仅可以减轻服务器端的压力,同时也能让用户在网速较慢的情况下获取良好的用户体验。所以构建一个优秀的APP,缓存是很重要的一个环节。
二.处理方案
客户端从服务器获取最新数据,假如是20条,同时将数据缓存到本地,当加载下一页数据时不仅将数据添加到内存中,还要同步到缓存中。这样以此类推,内存中的数据和缓存的数据保持一致。
当用户重新下拉刷新界面时,会出现两种情况:
一种是此时用户数据更改小于一页,第二种是用户数据更改大于一页。
第一种情况比较简单,数据变动小于一页,说明刷新返回的数据加上缓存的数据就可以构建出用户的全部数据,所以此时只需要合并刷新返回的最新数据和缓存的数据,将重复的数据去掉即可。
第二种情况比较复杂,数据变动大于一页,说明刷新返回数据和缓存数据之间还遗漏了部分的数据,那如何去同步这部分的数据呢?
简单的方案是,如果出现这种情况,则重构缓存,重构缓存的意思就是删除旧的缓存信息重新添加建立缓存。这个方案的优点就是实现简单不容易出错,当然缺点就是如果频繁的重构缓存则失去了缓存的意义。
真正的解决中间数据获取的问题,可以通过新建临时的数组的方式,将当前在内存中的数据放入临时的变量中,然后把刷新返回的数据加入内存中,当用户触发加载更多事件时,判断最新返回的数据是不是和临时变量中的数据有重合,有重合说明中间的遗漏数据已经获取完毕,则将临时变量的数据合并到内存中即可。当然内存中的操作都需要同步到缓存中。
用户每次重新进入该模块都会先从缓存中加载数据到内存,然后自动获取最新的数据与内存中的数据合并即可。若用户网络不通的情况下直接展示缓存数据。
异常处理:
网络异常--显示缓存数据
内存溢出--限制缓存条数
三.问题
上述方案中会遇到以下几个问题:
- 加载更多时,传入分页的page和size,当用户数据频繁的更新时,会出现冗余的数据,比如第一页的最后两条可能就是第二页的前两条。
- 同步问题,在有些业务中,数据大部分是不变的,但是有些数据是会变化的,比如在微博中,微博内容不会变化,但是转发条数,评论数是在变化的。如果仅仅展示缓存中的数据会出现和服务器端不同步的问题
- 缓存没有一个清理功能,随着时间的增长,总会出现内存溢出的情况
解决:
问题1:获取数据时分页中加入sinceID和maxID,用以来控制最大和最小的数据ID,这样就能防止冗余的重复数据
问题2:对于频繁的小数据块(如阅读数,分享数)可以制定同步协议,更新这些小数据块时无需更新整体的数据
问题3:内存的增长可以通过限制缓存的条数来控制,当缓存条数超过限制后,为用户重构缓存(大数据块的更新也可以通过定时重构缓存来实现)
版权声明:本文为博主原创文章,未经博主允许不得转载。