怎样保证mysql和redis的双写一致性

王林
发布: 2023-05-28 18:16:23
转载
1222人浏览过

一、场景:

双写一致性指的是当我们更新了数据库的数据之后redis中的数据    也要同步去更新。使用redis读取数据的流程,当用户访问数据的时候,会先从缓存中读取数据,如果命中缓存的话,那么直接把缓存中的数据返回给用户,如果缓存中没有数据的话,先查询数据库把查询到的数据保存到缓存中,然后返回给用户。

怎样保证mysql和redis的双写一致性

二、保证双写一致性的策略

1、先更新缓存,再更新数据库

2、先更新数据库,再更新缓存

3、先删除缓存,再更新数据库

4、先更新数据库,再删除缓存

三,四种策略的优缺点

1、先更新缓存,再更新数据库

问题很明显如果更新缓存成功,更新数据库失败,就会造成缓存的脏数据

2、先更新数据库,再更新缓存

如果再高并发的情况下,可能会存在如下的情况,线程A更新了数据库,如果由于网络或者其他的原因,线程A还没来得及更新缓存,这时候有一个进程B更新了数据库,更新了缓存,这时候进程A才更新缓存,这时候就会导致线程B对缓存的更新丢失了,像事务丢失的情况

3、先删除缓存,再更新数据库

这种策略可能已经避免掉了,策略2中缓存丢失的情况,但是再高并发的情况下,也会有不一致的情况,比如线程A做写操作,首先删除缓存然后准备跟新数据库,这时候,线程B执行了写操作,没有命中缓存,然后查询数据库,这时候读取的是旧值,并把查询到的旧值保存到缓存中,接着线程A完成了数据库的更新,这时候数据库和缓存又出现了不一致的情况,解决方案:我们只要再线程A,完成数据库的更新之后,稍作延迟再删除一次缓存,也叫做延迟双删。这里的延迟时间一定要大于业务的一次读操作的时间。

4、先更新数据库,再删除缓存

再高并发的情况下,也会有不一致的情况,比如线程A做读取数据的操作,正准备写入缓存的时候,线程B更新了数据库,然后执行了删除缓存的操作,这时候线程A才把旧值写入到缓存中,虽然这种情况出现的概率比较低,因为写操作的时候要大于一次读操作的时间的。作为替换,可以将原话简化并重新组织结构: 为处理删除失败的情况,建议采用延迟双删方案。即使延时双删仍存在问题,也可反复进行删除操作,直到缓存被彻底清除。如果删除失败,我们可以将需要删除的键放入队列中,一遍又一遍地尝试删除,直到删除成功为止。

以上就是怎样保证mysqlredis的双写一致性的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:亿速云网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号