Redis缓存常用的读写策略

news2024/11/15 23:55:34

缓存常用的读写策略

缓存与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.coloradmin.cn/o/2117223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSCKF7讲:特征管理与优化

MSCKF7讲:特征管理与优化 文章目录 MSCKF7讲:特征管理与优化1 Feature.h2 OptimizationConfig3 initializePosition三角化LM优化3.1 计算归一化坐标深度初值generateInitialGuess① 理论推导② 代码分析 3.2 计算归一化误差cost① 理论推导② 代码分析 3…

模型和算力看板:Compute DashBoard

AGI 之路 AGI(通用人工智能)是整个计算机科学的圣杯,算力的增长和模型能力的提升(算法和数据)缺一不可。作为一个新质生产力,构建一个合理的评价体系是常用的方法论。针对模型和算力的评价,有类…

【AutoX.js】选择器 UiSelector

文章目录 原文:https://blog.c12th.cn/archives/37.html选择器 UiSelector笔记直接分析层次分析代码分析 最后 原文:https://blog.c12th.cn/archives/37.html 选择器 UiSelector 笔记 AutoX.js UiSelector 直接分析 用于简单、最直接的查找控件 开启悬…

code agent-自动写代码的AI工具整理(2024)

文章目录 cursorReplit Agentgithub-copilot cursor https://www.cursor.com/ 界面类似VSCODE,集成多种先进功能的AI驱动的代码编辑器,智能代码编辑与补全、使用自然语言指令来编辑和修改代码、版本控制与代码审查、自动化测试等; Replit…

路径规划——RRT算法

路径规划——RRT算法 算法原理 RRT算法的全称是快速扩展随机树算法(Rapidly Exploring Random Tree),它的思想是选取一个初始点作为根节点,通过随机采样,增加叶子节点的方式,生成一个随机扩展树,当随机树中的叶子节点…

基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践

作者:计缘 LLM Chat 应用大家应该都不陌生,这类应用也逐渐称为了我们日常的得力助手,如果只是个人使用,那么目前市面上有很多方案可以快速的构建出一个LLM Chat应用,但是如果要用在企业生产级别的项目中,那…

开源软件如何保证数据安全?从一下七个方面进行分析

1、加密软件来保护 在开源软件中,数据加密和保护是保障数据安全的重要手段。开发者应该使用强加密算法的加密软件来保护敏感数据,并确保数据传输和存储的安全性。通过驱动层加密技术,对开发源代码进行强制加密处理,文件创建自动进…

Mac在Python项目中通过opencv模版匹配定位不到图片

起因 原本一行代码的事情,但是在Mac上总能出现意外,如下 box pyautogui.locateOnScreen(obsidian.png) print(box) pyautogui.moveTo(box[0],box[1])上面的代码用来定位图片在屏幕中的位置,然后移动鼠标到定位到的屏幕位置坐标。 意外…

IT管理:我与IT的故事9-数字化转型7步思考行动法

四书即论语、孟子、大学、中庸,又称四子书,为历代儒学子首要研习之书。南宋朱熹取《礼记》之大学、中庸篇,分章注释,与论语、孟子合为“四书”。 四书及其注释包涵孔子弟子及再传弟子、孟子、程子、朱熹等,其编撰时长达…

代码随想录Day 38|背包问题完结,题目322.零钱兑换、279.完全平方数、139,单词拆分数

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 动态规划part06题目题目一:322. 零钱兑换解题思路:题目二:279.完全平方数题目三:139.单词拆分数解题思路:背包问题 多重背包(…

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积…

Unity使用自定义类型作为字典Key的最佳实践与避坑指南

自定义类型作为字典Key的最佳实践与避坑指南文章首发 问题背景 首先提一下之前项目开发时遇到的一个将自定义类型作为Dictionary键的坑。 项目中,我们有两个业务类BusinessA和BusinessB,因为某个需求,我们需要将这两个类建立一个映射关系&…

游泳馆收银系统源码解析之手牌管理--SAAS本地化及未来之窗行业应用跨平台架构

一、代码 if(手牌状态 "空"){结算界面 "";未来之窗_人工智能_通用页面_尺寸(title"游泳馆",收费,500,300);}else{未来之窗_人工智能_通用页面_尺寸(title"游泳馆",退款,1200,500);} 二、阿雪技术观 拥抱开源与共享,见…

探索图论中的关键算法(Java 实现)

“日出东海落西山 愁也一天 喜也一天 遇事不钻牛角尖” 文章目录 前言文章有误敬请斧正 不胜感恩!||Day031. 最短路径算法Dijkstra算法Java 实现: Bellman-Ford算法Java 实现: 2. 最小生成树算法Prim算法Java 实现: Kruskal算法Ja…

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时&#x…

读软件设计的要素05概念的特性

1. 概念的特性 1.1. 专一性原则(specificity principle)认为概念与目的应该一一对应 1.1.1. 专一性原则已被证明是概念设计中最有用的原则之一 1.1.2. 一个概念最多只能满足一个目的 1.2. 很少有没有目的的概念 1.2.1. 如果本应隐藏的用户机制被暴露,可能会产生…

通信工程学习:什么是2ASK/BASK二进制振幅键控

2ASK/BASK:二进制振幅键控 2ASK/BASK二进制振幅键控是一种数字调制技术,其全称是二进制振幅键控(Binary Amplitude Shift Keying)。该技术通过改变载波的振幅来传递二进制数字信息,而载波的频率和相位则保持不变。以下…

RISC-V (九)抢占式多任务

主要的思想:借用定时器中断实现。设置定时器寄存器,系统自动触发定时器中断时会跳到trap handler这个函数里。借用这个函数做上下文的切换,从而实现了抢占式多任务。 定时器中断:跳到trap handler函数,同时系统自动将…

清华计算几何--凸Polygon的相交问题

凸Polygon和相交定义 本节只讨论凸Polygon的问题,不涉及凹Polygon. 相交包含了边相交和完全包含。 凸Polygon相交的两个问题 Detection(检测) 判断两个凸Polygon是否相交,至于相交部分是什么不关心. Construction(构造) 求出两个凸Polygon具体相交…

Linux_kernel移植rootfs10

一、动态更改内核 1、low level(静态修改) 【1】将led_drv.c拷贝到kernel/drivers/char/目录中 【2】修改当前目录下的Makefile文件 obj-y led_drv.o #将新添加的驱动文件加入到Makefile文件中 【3】退回kernel目录,执行make uImage …