redis学习笔记(四)redis缓存与数据库一致性问题
来源:互联网 发布:unity3d导出webgl 编辑:程序博客网 时间:2024/05/22 07:48
redis系列文章目录
- Redis 利用Hash存储节约内存
- Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储]
- Redis学习笔记(八)redis之lua脚本学习
- Redis学习笔记(七)jedis超时重试机制注意事项
- Redis学习笔记(六)redis实现分布式锁
- Redis学习笔记(五)jedis(JedisCluster)操作Redis集群 redis-cluster
- redis学习笔记(四)缓存与数据库一致性问题
- redis学习笔记(三)数据淘汰策略
- redis学习笔记(二)JedisCluster + redis 3.2.5集群
- redis学习笔记(一)redis3.2.5集群安装与测试
redis与数据库数据一致性问题是个老生常谈的问题了,这里也没啥新鲜玩意,就是总结一下
不一致产生的原因
我们在使用redis过程中,或者网上一些资料,通常会这样做:先读取缓存,如果缓存不存在,则读取数据库。伪代码如下:
Object stuObj = new Object(); public Stu getStuFromCache(String key){ Stu stu = (Stu) redis.get(key); if(stu == null){ synchronized (stuObj) { stu = (Stu) redis.get(key); if(stu == null){ Stu stuDb = db.query(); redis.set(key, stuDb); } } } return stu; }
上面加锁是为了防止过多的查询走到数据库层
写数据库伪代码:
public void setStu(){ redis.del(key); db.write(obj);}
不管是先写库,再删除缓存;还是先删缓存,再写库,都有可能出现数据不一致的情况
因为写和读是并发的,没法保证顺序,如果删了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。如果先写了库,再删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。
如果是redis集群,或者主从模式,写主读从,由于redis复制存在一定的时间延迟,也有可能导致数据不一致。
优化思路
双删 + 超时
在写库前后都进行redis.del(key)
操作,并且设定合理的超时时间。这样最差的情况是在超时时间内存在不一致,当然这种情况极其少见,可能的原因就是服务宕机。此种情况可以满足绝大多数需求。
当然这种策略要考虑redis和数据库主从同步的耗时,所以在第二次删除前最好休眠一定时间,比如500毫秒,这样毫无疑问又增加了写请求的耗时
异步淘汰缓存
通过读取binlog的方式,异步淘汰缓存。
好处:业务代码侵入性低,将缓存与数据库不一致的时间尽可能缩小。
参考文献
- 缓存与数据库一致性保证
- 主从DB与cache一致性
0 0
- redis学习笔记(四)redis缓存与数据库一致性问题
- redis学习笔记(15)---redis数据库
- Redis 学习笔记四
- Redis 学习笔记四 Mysql 与Redis的同步实践
- Redis 学习笔记四 Mysql 与Redis的同步实践
- Redis学习笔记(四) Spring与Jedis的集成
- Redis 缓存与 mysql 数据库
- Redis数据库学习笔记
- Redis复制与可扩展集群搭建——Redis学习笔记(四)
- Redis复制与可扩展集群搭建——Redis学习笔记(四)
- Redis 学习笔记(四):redis 面试题总结
- Redis学习笔记——(四)Redis集群调整
- Redis学习笔记(四) Redis哨兵(sentinel)
- Redis学习笔记(四)--过期时间
- redis学习笔记四(配置文件)
- Redis分布式部署,一致性hash;分布式与缓存队列
- redis学习笔记四(集合)
- Redis学习(四)
- mfc根据进程名删除后台运行的可执行文件
- Eclipse中通过Maven添加依赖自动提示配置
- java实现base64字符串转换成图片保存
- 立即刷新Chrome浏览器缓存的方法
- wxpython 加载网络图片并缩放
- redis学习笔记(四)redis缓存与数据库一致性问题
- MySQL5.7 group by新特性,报错1055
- Jenkins2插件Pipeline实现持续交付(CD)解决方案
- String的indexOf实现
- FreeCMS视频教程 将FreeCMS导入eclipse
- 取模公式
- OpenCV学习笔记(十五)形状检测
- 使用Logstash + Elasticsearch作为大数据索引、分析工具
- 51Nod-1524-可除图的最大团