查询条件变更后的缓存数据怎样处理
在公司的项目里,负责过个人中心模块,需要向用户展示订单列表,因为涉及到性能问题,所以直接将最新的100条订单缓存到redis中,结构非常简单,key是用户pin,值是顺序的订单list。
突然产品提出,需要将自助收银的订单过滤掉,这时该怎么做呢,数据库使用条件查询就过滤出来了,但是缓存数据怎样处理
0、直接在读出缓存列表,使用程序过滤不满足条件的订单,这种方式一般不考虑,如果前100条都不满足,可能就直接吐出空了,要考虑更多的机制弥补。
1、如果考虑到业务的急迫性和严格性不高,无需立刻下线所有人的,缓存有效期是7天,这样,根本不用动,反正7天后所有人的订单列表都是根据数据库查询出来的,都不会再有自助收银的单子(从业务的角度考虑就能方便解决问题)
2、使用程序扫数据,强制所有缓存过期,重新覆盖,这种优缺点明显,优点简单求,缺点,面对千万甚至上亿的数据量时数据库和缓存压力山大。(满足小数据量情况)
3、建立缓存标记位(增加一份新缓存,但空间占用很小,只是一个标记),伪代码如下
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、接入其它更复杂的系统,比如es等(这种方式是不是更适合大中台概念),缺点,对于某一个系统来讲,动辄就引入es,太复杂,成本较高。