在写x联帮项目时遇到一个问题:编写获取社团列表接口时,需要加入Redis缓存,但是给分页结果和多条件模糊查询结果添加Reids缓存时应该如何实现呢?于是去搜索了一些实现方案。
传统分页
传统分页做缓存是直接查找出来,按页放入缓存,这种方式有许多缺点:
缓存不能及时更新,一旦数据发生变化,所有之前的分页缓存都会失效;
同时这种方案无法满足按条件存入缓存。
按照条件分页
如果是按照不同的分页条件来缓存多个key,比如分页查询社团:pageNumber=1&condition=10
缓存的key就可以设置成:community:page:1:condition:10
同样这种方法也存在着一些问题:
缓存的value存在冗余,例如:community:page:1:condition:10中就可能包括了community:page:1:condition:5中的内容(数据没有发生变化的情况下)
当改变查询条件为community:page:1:condition:5时,就会导致缓存未命中,降低缓存命中率;
为了保证数据一致性,需要清理缓存的时候,很难处理,redis的keys命令会对性能造成很大影响,从而导致redis很大的延迟。在生产环境中,需要手动拼接缓存key,如果条件很多,不知道会拼到哪一个条件为止(虽然我的项目没有那么多条件)。
放弃数据一致性,当设置了过期时间时,可能会出现查询第一页命中了缓存,查询第二页的时候未命中缓存,但数据发生了变化,第二页查询返回和第一页相同的结