redis分页查询后增加条件处理方式
程序员文章站
2023-12-26 21:40:27
...
说一种情况:
比如我的订单,缓存是按照pin做key来做的
突然加一个过滤条件,比如轻松购订单不显示了,有以下几种解决方式
1、数据库条件改一下,缓存查询时简单按过滤一下,问题是,分页1-10页,可能第一页有3条,所以返回前端的就是7条
缺点:不严谨,并且要看前端分页是怎样判断最后一页的,如果是根据“当前页条数”<“每页固定条数”就算最后一页,那这种做法不可取
2、还是简单过滤,如果发现当前页不足10条,继续查,补足
缺点:处理复杂,并且有可能影响一点性能
3、强制缓存失效,重新放到缓存中,要做标记,比如pin:XXXX已经做过强制更新这种
具体做法,建立缓存标记位(增加一份新缓存,但空间占用很小,只是一个标记),伪代码如下:
orderList = null;
if(redis.get(pin+"flag")==null){
//强制更新缓存
orderList = dao.from(db);
redis.set(pin,orderList,TimeOutA)
redis.set(pin+"flag",true,TimeOutB)
}else{
redis.get(pin)
}
return orderList;
其中TimeOutB<=TimeOutA
这种方案,只在用户使用列表时,才更新缓存,比较平缓,缺点,需要额外逻辑处理,容易让人不解,并占用一定缓存空间
缺点:处理麻烦,主要是怎样设计标记缓存,这样做和第四种比较相对省空间,但一样面临击穿缓存的问题
4、直接换key
缺点:有垃圾数据(如果有过期时间,并且较短,可以用),另外会短时间击穿缓存,直接打到数据库
3、接入其它更复杂的系统,比如es等(这种方式是不是更适合大中台概念),缺点,对于某一个系统来讲,动辄就引入es,太复杂,成本较高。