Redis一致性问题

news/2024/10/30 11:31:36/

(1)何为一致性?

  • 1、定义:

    • 指系统中各节点数据保持一致。
      • 分布式系统中,可以理解为多个节点中的数据是一致的。
  • 2、分类:

    • 强一致性:写进去的数据是什么,读出来的数据就是什么。
    • 弱一致性:只保证到某个时间级别后,数据能达到一致。
      • 最终一致性:在某个时间点后数据会达到一致。

(2)Redis与数据库如何保证一致性?/Redis一致性问题?

  • 1、先删除缓存,再更新数据库;
  • 2、先更新数据库,再删除缓存;
  • 3、先更新缓存,再更新数据库;
  • 4、先更新数据库,再更新缓存;

(3)更新缓存和删除缓存如何选择?

  • 更新缓存:
    • 使用场景:数据使用较为频繁
  • 删除缓存:
    • 使用场景:数据使用频率不高

(4)先删除缓存,再更新数据库存在问题?及其解决方案?

在这里插入图片描述

  • 存在问题:
    • 删除缓存成功,更新数据库失败:导致缓存中的数据被B更新为旧数据。
  • 解决方案:
    • 失败重试 + 延时双删:
      • 对于数据库更新失败,加入更新失败重试机制,数据库更新成功后,延时一段时间,再次删除缓存。

(5)先更新数据库,再删除缓存存在问题?及其解决方案?

  • 存在问题:
    • 更新数据库成功,删除缓存失败:此时缓存中为旧数据,导致其他线程读取到旧数据。
  • 解决方案:
    • 对于删除缓存失败:
      • 订阅binlog:数据库的每一步操作均会写入binlog日志,可以通过监听binlog,实时感知数据变化情况,根据数据变化情况删除redis并添加重试机制,直至redis删除成功。
      • 引入消息队列
        若Redis删除失败,则将Redis key放入消息队列,消费端监听消息队列并删除Redis直至删除成功。

(5)总结

  • 数据库更新失败:失败重试,延时双删。
  • 缓存删除失败:订阅binlog/引入消息队列。

http://www.ppmy.cn/news/43946.html

相关文章

JavaEE企业级应用开发教程——第十一章 Spring MVC的核心类和注解(黑马程序员第二版)(SSM)

第十一章 Spring MVC的核心类和注解 11.1 DispatcherServlet DispatcherServlet 是 Spring MVC 框架中的核心组件,它的全限定名是 org.springframework.web.servlet.DispatcherServlet。作为 Spring MVC 的前端控制器,DispatcherServlet 可以拦截客户端…

C++模拟go defer

go defer介绍 在Go语言中,defer语句用于在函数返回之前执行一些代码。这对于释放资源或记录函数执行时间非常有用。当函数中有多个defer语句时,它们将按照后进先出(LIFO)的顺序执行。 以下是一个简单的示例,演示了如何使用defer语句: package mainimport "fmt"…

利用在线Linux内核代码阅读分析网站linux kernel map分析CFS调度器代码调用链路

linux kernel map网址 https://makelinux.github.io/kernel/map/ 源码分析 点击Scheduler标签内的kernel/sched/ 左侧菜单,选择一个内核版本 Search Identifier搜索框输入要搜索的函数,回车执行搜索 结果列出了一处函数定义及两处引用 新窗口打开定义 …

MySQL优化——Explain分析执行计划详解

文章目录前言一. 查看SQL执行频率二. 定位低效率执行SQL三. explain分析执行计划3.1 id3.2 select_type3.3 table3.4 type3.5 key3.6 rows3.7 extra四. show profile分析SQL前言 在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能…

【MySQL】索引优化与查询优化(重点:索引失效的11种情况)

【大家好,我是爱干饭的猿,本文重点介绍MySQL的内连接、外连接、索引失效的11种情况、关联查询优化、子查询优化、排序优化、GROUP BY优化、优化分页查询、覆盖索引、索引条件下推和其它查询优化策略的一些问题。 后续会继续分享MySQL和其他重要知识点总…

4.18、TCP滑动窗口

4.18、TCP滑动窗口1.滑动窗口的介绍2.滑动窗口通信的例子1.滑动窗口的介绍 滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数…

Linux系统调用之mmap,munmap函数

前言 如果,想要深入的学习Linux系统调用中的mmap,munmap函数,还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令: man 2 mmap/munmap即可查阅到完整的资料信息。 mmap函数 在Linux中,mmap()是一个用于创建内存映射的系统…

Python 字符串format()格式化 / 索引

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 为了确保字符串按预期显示,我们可以使用 format() 方法对结果进行格式化。 字符串 format() format() 方法允许您格式化字符串的选定部分。 有时文本的一部分是你无法控制的,也许它们来自数据库或…