当前位置: 首页 > news >正文

redis的缓存更新策略以及如何保证redis与数据库的数据一致性

redis的缓存更新策略有这么几种:

1、由应用直接和redis以及数据库相连接:
        查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;
        更新数据时,由应用去触发redis数据的删除以及数据库的update。
2、应用只跟redis相连接,redis跟数据库连接:
        查询时,应用去redis中查,查不到的话,由redis去数据库中查,将查询到的结果缓存在redis并返回给应用;
        更新时,由应用去更新redis,并且由redis将数据同步到数据库。
3、应用只跟redis相连接,redis跟数据库连接:
        查询数据时,由应用去redis中查询;
        更新数据时,由应用更新到redis中之后就返回,redis异步将数据更新到数据库。
4、应用只跟redis连接,后台服务跟数据库连接:
        查询数据时,由应用去redis中查询;
        由后台服务自动将数据库中的最新数据更新到redis。


        需要注意的是,第一种更新策略,无论是先删除redis中的数据还是先update数据库,都会存在redis中出现脏数据的问题。

        比如:如果我们先删redis再update数据库,那么可能某个请求1删完redis了,还没来得及update 数据库,有另外一个请求2到达要进行查询这条数据,请求2在redis中查不到,就去db查,在db中查到了旧数据,并将旧数据再次放进redis,在请求1完成db的update之后,redis和db出现了数据不一致的情况,redis中出现了脏数据。
        再比如,有一条数据在redis中不存在,在db中存在,有两个请求同时到达,请求1要查询这条数据,请求2要更新这条数据,请求1在redis中未查到这条数据,所以去db查,这时请求2还未完成对于db的更新,所以请求1在db中查到了旧数据,这时请求2完成了db的update,并且删除了redis中的数据[当然现在redis中还是没有这条数据,也就无数据可删],在请求2完成了redis的删除动作之后,请求1将手里之前查到的旧数据又放进了redis。

        解决这个问题,可以用延迟双删策略。


延迟双删策略:

        对于更新操作分三步:先删redis缓存 -> 再update数据库 -> 延迟N秒之后,再删一次redis缓存。

        之所以有第三步,是为了将在这期间其他请求存进redis中的脏数据删除,所以这个延迟时长一定要控制好,延迟必须大于向redis中执行一次写操作的耗时,以便保证在其他请求将脏数据向redis写完成之后再删,否则删了也没效果。但是这个N我们即便是控制得再好也无法完全避免redis的脏数据问题,因为有可能其他的向redis进行脏数据的写请求因为网络等原因而耗时延长,最终导致脏数据还是写进了redis。

        延迟双删策略只能在很大程度上解决redis的脏数据问题,让redis与db达到最终一致性,但不能完全避免,想要完全避免这种情况,可以使用同步锁,让整个的数据更新操作同步执行。

http://www.lryc.cn/news/117234.html

相关文章:

  • k8s--使用cornJob定时执行sql文件
  • Qt事件过滤器
  • Java基础集合框架学习(上)
  • 北京多铁克FPGA笔试题目
  • 从初学者的角度来理解指针常量和常量指针
  • C# OpenCvSharp 去水印 图像修复
  • 考研算法第40天:众数 【模拟,简单题】
  • MySQL:内置函数、复合查询和内外连接
  • 【HTML】label 标签
  • python视频流截图(按帧数)
  • MongoDB SQL
  • node js连接mysql数据库
  • 通过Python模拟计算附近WIFI密码,没有我蹭不到的网
  • ubuntu20.04 远程桌面配置记录【亲测好用】
  • 解决selenium的“can‘t access dead object”错误
  • Docker Dockerfile 使用方法
  • (6)(6.3) 复合连接的故障处理
  • 报考红帽认证难不,红帽认证考试容易吗?
  • 如何优雅地用VS编写C#代码——快捷键的使用
  • 微服务——操作索引库+文档操作+RestClient操作索引库和文档(java程序)
  • 【性能测试】性能数据采集工具nmon安装使用及报告参数含义详解
  • 『PostgreSQL』在 PostgreSQL中创建只读权限和读写权限的账号
  • 基于Java+SpringBoot+Vue的网上书城管理系统设计与实现(源码+LW+部署文档等)
  • 安全渗透——AWK知识整理
  • 计算机视觉的应用9-视觉领域中的61个经典数据集【大集合】的应用与实战
  • Go中for循环的遮挡效应
  • UE4 Cesium 学习笔记
  • 【LeetCode】322.零钱兑换
  • 中电金信:国际结算系统的“王冠”,为什么十年都戴在“它”的头上
  • java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis em