科学城做网站公司,ppt模板免费下载 素材红色主题,泗阳网站设计,初级网页设计实训报告今天我们来写redis最后一篇#xff1a;redis作为缓存时如何与数据库实现数据一致的问题。
最近看redis看得有点麻了#xff0c;这篇就简单描述吧
目录
1.什么是缓存与数据库一致性问题
1.1 缓存一致性的概念
1.2 缓存不一致的场景
2.缓存不一致的解决思路 1.什么是缓存…今天我们来写redis最后一篇redis作为缓存时如何与数据库实现数据一致的问题。
最近看redis看得有点麻了这篇就简单描述吧
目录
1.什么是缓存与数据库一致性问题
1.1 缓存一致性的概念
1.2 缓存不一致的场景
2.缓存不一致的解决思路 1.什么是缓存与数据库一致性问题
1.1 缓存一致性的概念
只要使用redis做缓存就必然存在缓存和DB数据一致性问题。若数据不一致则业务应用从缓存读取的数据就不是最新数据可能导致严重错误。比如将商品的库存缓存在Redis若库存数量不对则下单时就可能出错这是不能接受的。
缓存和DB的数据一致性包含如下情况
缓存有数据 缓存的数据值需和DB相同缓存无数据 DB必须是最新值
不符合这两种情况的都属于缓存和DB数据不一致。
1.2 缓存不一致的场景
目前常见的方式是先删缓存再更新数据库等请求获取缓存时发现没有从db获取 再重新赋值到缓存这是最典型的缓存操作
在正常请求下是不会有问题的一但并发量起来了就会产生如下问题
可能发生的问题1:
先删除缓存数据库还没有更新成功此时如果读取缓存缓存不存在去数据库中读取到的是旧值缓存不一致发生。 可能发生的问题2:
没有按照规范操作对于缓存未删除直接更新数据库数据库更新成功了但是缓存更新失败了导致缓存取到的值是旧值。 2.缓存不一致的解决思路
对于这个问题我们公司采取的措施简单粗暴
查询的时候先查缓存没有了再查数据库。删除或者更新的时候先更新数据库成功之后再删缓存等待缓存下一步被自动更新。
这个很明显是有漏洞的如果在查询的过程中被修改了就会出现不一致的情况。不过我司并发度没那么高。
我们看到比较多的一种方案是这样的延时双删 线程1删除缓存然后去更新数据库 线程2来读缓存发现缓存已经被删除所以直接从数据库中读取这时候由于线程1还没有更新完成所以读到的是旧值然后把旧值写入缓存 线程1根据估算的时间sleep由于sleep的时间大于线程2读数据写缓存的时间所以缓存被再次删除 如果还有其他线程来读取缓存的话就会再次从数据库中读取到最新值(不用线程sleep这个耗线程池) 再一个思路是利用mq 这里可以利用类似于 阿里的canal 中间件模仿slave订阅mqsql的binlog日志一当日志新增(add,update)就调用mq。不过这种方式需要加中间件需要耗费mq资源改动量大结构也比较复杂。
还有一种简易的方式就是设置缓存的过期时间
每次放入缓存的时候设置一个过期时间比如5分钟以后的操作只修改数据库不操作缓存等待缓存超时后从数据库重新读取。
如果对于一致性要求不是很高的情况可以采用这种方案。
这个方案还会有另外一个问题就是如果数据更新的特别频繁不一致性的问题就很大了。
在实际生产中我们有一些活动的缓存数据是使用这种方式处理的。
因为活动并不频繁发生改变而且对于活动来说短暂的不一致性并不会有什么大的问题。 这个问题在腾讯云社区有一个比较复杂的讨论
Redis缓存与数据库一致性解决方案-腾讯云开发者社区-腾讯云