Redis缓存常用的读写策略

缓存常用的读写策略

缓存与DB的数据不一致问题,大多数都是指DB的数据已经修改,而缓存中的数据还是旧数据的情况。

旁路缓存模式

对于读操作:基本上所有模式都是先尝试从缓存中读,没有的话再去DB读取,然后写到缓存中

在这里插入图片描述

对于写操作:先更新数据,再删除旧缓存
在这里插入图片描述

为什么先修改数据库,而不是先删除缓存?

如果是先删除缓存的话,很容易引起数据不一致的问题。

比如写操作的过程中来了个读操作。在删除完缓存但数据库没有修改完的期间,来了个读请求,它就会把没有修改的数据进行缓存,后续再更新数据库之后,数据库的内容和缓存的内容就不一致了。

同样地,读取操作的过程中(DB读完了,但没有写入缓存中)来了个写请求,把DB数据改了,那么最终写入的缓存将会是旧的数据,因为DB已经被更新了。(只不过这次情况概率小,因为写入缓存的速度特别快,期间DB的数据很难被修改完成)

为什么修改数据库后要删除缓存,不能修改完数据库后直接修改缓存吗?

不能,在高并发场景下,同时处理多个写请求,如果某个写请求中间,完成了另外一个写请求,那么最后更新的缓存就会是旧的数据。但如果是先更新数据库,再删除缓存的话就不用考虑这么多了,因为下次访问会重新加载最新数据。

这种模式会有一致性问题吗,举个例子?

也会有的,但是概率比较小,具体如下:

  • 第一种情况,写操作的过程中来了读请求。更新完DB但缓存没有删掉的期间,如果来了一个读请求,此时会命中缓存,读取到的是缓存中的旧数据,但是这个缓存马上会被删掉,影响几乎可以忽略不计。
  • 第二章情况,读操作的过程中来了个写请求。请求1读取了DB的值,准备写入缓存但还没有写入,此时如果来了个写请求,将DB的数据修改了,那么之前读请求写入的缓存就是过期的缓存了。不过这种情况概率也比较小,因为写缓存的速度非常快,写缓存的期间数据被修改不太可能(除非高并发场景)。

解决方案,使用分布式锁保证更新DB和删除缓存的操作同步进行,不会受其它线程影响。

特点:

  • 实现简单,能保证最终一致性
  • 所有数据的首次读取都要经过DB,之后才能命中缓存(可以将热点数据可以提前放入 cache 中)
  • 写操作比较频繁的话导致 cache 中的数据会被频繁被删除,会影响缓存命中率

适用场景:读多写少(大多数场景)、不需要保证和数据库的强一致性

注意:根据CAP理论,如果需要数据库和缓存数据保持强一致,就不适合使用缓存,换句话说用:用缓存的本质就是牺牲一致性去换速度

读写穿透模式

旁路缓存模式是由用户去分别控制cache和DB的读写,而读写穿透是由cache服务去直接完成对DB的读写,这样减轻了程序员的职责,但是Redis没有提供直接将缓存数据写入DB的功能,所以比较少见。

对于读操作:也是先去缓存中找,然后再去DB中找,唯一不同的就是从DB找的过程是由cache程序自动进行的。

对于写操作:在更新DB的同时也更新cache本身(而不是删除),这个步骤是由缓存服务去实现的。

适用场景:需要保证数据的强一致性

缺点

  • 使用要求高,要求缓存程序对自身修改时能同步对DB进行更新,Redis就不支持

异步写入模式(写后模式)

也是由 cache 服务来负责 db 的读写,更新数据时先更新缓存中的数据,然后过一段时间再异步批量去更新db,常用在实时变化且又是非核心的数据中,比如点赞量、阅读量等等。

适用场景:对响应速度要求很高,但对一致性要求不高

缺点:如果写入DB前缓存挂了,数据就会丢失

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/420404.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode172. 阶乘后的零,遍历每个因数中5的个数

leetcode172. 阶乘后的零 给定一个整数 n ,返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * … * 3 * 2 * 1 示例 1: 输入:n 3 输出:0 解释:3! 6 ,不含尾随 0 示例 2: 输…

c++188深拷贝和浅拷贝

在全局区字符串 浅拷贝 拷贝指针变量的值而不是内存空间 obj2已经析构了 又进行了一次析构 深拷贝&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Name { public:Name(const char* myp){//开辟一个内存把dhfka传入int le…

NVIDIA Triton Inference Server 部署 yolov5

文章目录 一、拉取 tensorrt 、yolov5、tritonserver 镜像二、下载 yolov5-6.2、tensorrtx/yolov5-6.2源码三、pt转wts四、wts转engine五、创建triton推理服务器六、创建客户端进行测试 一、拉取 tensorrt 、yolov5、tritonserver 镜像 docker pull hakuyyf/tensorrtx:trt8.2_…

TAbleau 可视化 干货分享 | 简单三步助你打造完美仪表板

只需单击几下&#xff0c;你将能轻松创建美观、信息丰富的可视化效果、节省时间并推动业务向前发展&#xff01; 借助精心设计的仪表板&#xff0c;分析师可以更好地理解复杂数据背后的信息&#xff0c;更有效地向他人分享你的见解&#xff0c;从而做出更明智的决策。 值得思考…

vivado 时间汇总报告

步骤7&#xff1a;时间汇总报告 定时路径在时钟元素处开始和结束。输入和输出端口不是顺序的 元素&#xff0c;默认情况下&#xff0c;Vivado时序分析不会对进出I/O端口的路径进行计时 设计&#xff0c;除非指定了输入/输出延迟约束。 在此步骤中&#xff0c;您将在Vivado中生成…

单片机-STM32 看门狗(八)

目录 一、看门狗概念 1、定义&#xff1a; 二、单片机中的看门狗 1、功能描述&#xff1a; 2、看门狗设置部分 预分频寄存器(IWDG_PR) 3、窗口看门狗 特性&#xff1a; 4、看门狗配置&#xff1a; 一、看门狗概念 看门狗--定时器&#xff08;不属于基本定时器、通用定…

客户端绑定本地端口与服务器建立连接的详细实现

客户端绑定本地端口与服务器建立连接的详细实现 一、网络编程基础1.1 TCP/IP协议1.2 套接字(Socket)1.3 客户端与服务器模型二、客户端程序的设计2.1 需求分析2.2 流程设计三、具体代码实现3.1 伪代码3.2 C代码实现四、代码详解4.1 初始化套接字库4.2 创建套接字4.3 绑定本地…

十大护眼大路灯品牌怎么选比较好?护眼灯品牌排行榜前十名

十大护眼大路灯品牌怎么选比较好&#xff1f;作为一名资深家电测评师&#xff0c;我虽然比较认可护眼大路灯&#xff0c;平常自己也在使用&#xff0c;但也提醒广大用户&#xff0c;市场中有些品牌产品本身在生产中做工较为粗糙、使用廉价材质&#xff0c;更因缺乏核心技术&…

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民&#xff0c;网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席20…

你真的懂吗系列——GPIO

你真的懂吗 文章目录 你真的懂吗前言一、GPIO介绍二、GPIO基本结构三、GPIO的八种模式浮空输入输入上拉输入下拉模拟输入开漏输出推挽输出什么是推挽结构和推挽电路&#xff1f;开漏输出和推挽输出的区别&#xff1f;开漏式复用推挽式复用 前言 最近在做STM32的时候发现有些寄…

怎么利用短信接口发送文字短信

在当今这个快节奏的数字时代&#xff0c;即时通讯已成为人们日常生活和工作中不可或缺的一部分。而短信接口&#xff08;SMS Interface&#xff09;&#xff0c;作为传统与现代通讯技术结合的典范&#xff0c;凭借其高效、稳定、广泛覆盖的特性&#xff0c;在众多领域发挥着不可…

2024年最新微短剧系统重构版,短剧小程序源码开源源码搭建部署

技术栈 前端&#xff1a;vueuniapp 后端&#xff1a;php 数据库&#xff1a;MySQL <?php class Drama {private $title;private $description;private $cast;private $genre;public function __construct($title, $description, $cast, $genre) {$this->title $tit…

【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)

有关node-sass的深入分析可参考&#xff1a;又报gyp ERR&#xff01;为什么有那么多人被node-sass 坑过&#xff1f; 主要有如下三方面错误&#xff0c;请自查&#xff1a; 1.node&#xff0c;npm版本需与node-sass版本匹配&#xff0c;像node-sass&#xff08;^4.14.1&#x…

高性能反向代理--HAProxy

文章目录 Web架构负载均衡介绍为什么使用负载均衡负载均衡类型 HAProxy简介应用场景HAProxy是什么HAProxy功能 脚本安装HAProxy基础配置global多进程和线程HAProxy日志配置项 Proxies配置-listen-frontend-backendserver配置 frontendbackend配置实例子配置文件 HAProxy调度算法…

大数据-121 - Flink Time Watermark 详解 附带示例详解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【实战篇】为什么表数据删掉一半,表文件大小不变?

背景 日常使用中&#xff0c;当数据库占用空间太大&#xff0c;把一个最大的表删掉了一半的数据&#xff0c;但是表文件的大小还是没变&#xff0c;这是为什么呢&#xff1f; 针对 InnoDB 引擎&#xff0c;一个 InnoDB 表包含两部分&#xff0c;即&#xff1a;表结构定义和数…

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡&#xff0c;安装好之后发现lspci命令没有显示型号&#xff0c;这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …

AbyssFish单连通周期边界多孔结构2D软件 V2.0版本更新

软件更新 AbyssFish单连通周期边界多孔结构2D软件 V2.0&#xff08;以下简称软件&#xff09;新增颗粒双轴尺寸及颗粒走向控制功能&#xff0c;可实现各向异性多孔结构模型建立。关于V1.0版本功能可查看&#xff1a;http://t.csdnimg.cn/TgZmC 软件新增功能可实现颗粒长短轴…

【Leetcode152】乘积最大子数组(动态规划)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 &#xff08;0&#xff09;读懂题意&#xff1a;题目的“连续”是指位置的连续&#xff0c;而不是说数字的连续&#xff0c;这是个大坑。 &#xff08;1&#xff09;确定状态&#xff1a;定义两个状态来记录当前子数组的…

【C++】CLion配置cout打印语句快捷键

点击菜单栏的 File -> Settings->Editor -> Live Templates 点击 Define&#xff0c;选择 C。 点击Apply 和 OK 保存。 当我们sout时&#xff0c;自动出现打印语句。