redis更新缓存

当我们做项目时,总会遇到一些数据经常被查询,但是不会经常修改,对于这样的数据大家都会想到使用缓存处理。今天对使用redis更新缓存整理几个方案,有不足的地方还望多多指正。

第一种:

  • 方案 :后台设置更新缓存按钮由操作人员操作或者使用定时任务,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存;
  • 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这个时候返回的数据会是空,会影响用户体验;
  • 总结:影响用户体验一般不推荐使用;

第二种:

  • 方案:后台设置更新缓存按钮由操作人员操作或者使用定时任务,从DB查找最新数据集合,这里不删除缓存,通过遍历数据覆盖和删除掉无效的数据;
  • 问题:逻辑处理相对麻烦,数据量大处理起来也比较耗时,而且更新的机制也无法通用;
  • 总结:更新逻辑写起来比较麻烦,而且更新方案不能抽象通用;

第三种:

  • 方案:前台获取数据时先去读缓存,发现没有缓存数据在去数据库同步数据到缓存;
  • 问题:当并发请求获取缓存数据不存在的时候,就会产生并发的查询数据的操作,造成缓存穿透;
  • 总结:可以使用双重检测锁(示例代码:https://github.com/itxiaobaishu/java-code.git),锁住更新操作只能有一个进入DB查询,可以避免问题;

第四种:

  • 方案:前台获取缓存数据时先需要获取缓存的key,再根据缓存的key读取缓存数据;
  • 实现逻辑:举个简单的例子,完整的缓存由redis两条数据组成,第一条(key=cache,value=1111111111)、第二条(key=1111111111,value=缓存的具体数据),先通过第一条读出缓存的key,在根据key读取缓存数据。当有数据更新时,可以后台生成新的缓存数据(key=2222222222,value=新的缓存数据),同时更新(key=cache,value=2222222222),再把旧数据(key=1111111111,value=缓存的具体数据)设置一个过期时间,注意旧数据不要删除,可能有的业务还在使用;
  • 总结:使用预加载到缓存,然后在切换需要显示的缓存数据,可以很好的解决问题;

你可能感兴趣的:(Java,redis,缓存)