微服务专题redis技术专题IT

Redis分页查询缓存方案

2016-08-25  本文已影响13085人  OneFish

常规分页查询缓存方案

我们都知道,通过缓存查询的结果,可以极大的提升系统的服务能力,以及降低底层服务或者是数据库的压力。
对于有分页条件的缓存,我们也可以按照不同的分页条件来缓存多个key,比如分页查询产品列表,page=1&limit=10和page=1&limit=5这两次请求可以这样缓存查询结果

基于SortedSet的分页查询缓存方案

首先想到的解决方法是使用@see ListOperations<K, V>不再根据分页条件使用多个key,而是使用一个key,也不分页将全部的数据缓存到redis中,然后按照分页条件使用range(key,start,limit)获取分页的结果,这个会导致一个问题,当缓存失效时,并发的写缓存会导致出现重复数据
所以想到通过使用set来处理并发时的重复数据,@see ZSetOperations<K, V>
代码逻辑如下:

  1. range(key,start,limit)按照分页条件获取缓存,命中则直接返回
  2. 缓存未命中,查询(没有分页条件)数据库或是调用(没有分页)底层接口
  3. add(key,valueScoreMap<value,score>)写入缓存,expire设置缓存时间
  4. 当需要清理缓存时,直接删除key,如果是因为数据新增和删除,可以add(key,value,score)或remove(key,value)

redis中会按照score分值升序排列map中的数据,一般的,score分值是sql语句的order by filedA的filedA的值,这样能保证数据一致性
但是这种方式也存在一定问题:


总结

这两种方式互有利弊,具体使用还是要按照具体场景,合理选择!有更好的方案也欢迎讨论:-)

上一篇 下一篇

猜你喜欢

热点阅读