redis 三种缓存更新策略

news2024/10/6 0:35:54

今天聊聊redis 三种缓存更新策略分别是:

  • Cache Aside(旁路缓存)策略;

  • Read/Write Through(读穿 / 写穿)策略;

  • Write Back(写回)策略;

其中 Cache Aside策略是redis和Mysql使用的更新策略,另外两种策略主要使用在计算机系统上。

Cache Aside(旁路缓存)策略

Cache Aside(旁路缓存)策略是最常用的策略,应用程序直接与「数据库、缓存」交互,并负责对缓存的维护,该策略又可以细分为「读策略」和「写策略」

读策略:

从缓存中读取数据

如果缓存命中,则直接返回数据

如果缓存不命中,则从数据库中查询数据

查询到数据后,将数据写入到缓存中,并且返回给用户

写策略:

更新数据库中(MYSQL,Redis)的记录

删除缓存记录

需要注意的是:写策略的步骤顺序不能倒过来(即不能先删除缓存,再更新数据库)。因为在「读+写」并发的时候,会出现缓存和数据库的数据不一致性的问题。如下图:

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

那么,也会有同学会问先更新数据库再删除缓存不会出现数据不一致吗?

理论上也是会的。

如下图:

先更新数据库再删除缓存, 理论上会出现数据不一致

但是,在实际中,这种出现的概率并不高。因为缓存的写入通常要远远快于数据库的写入。所以在实际中很难出现请求 B 已经更新了数据库并且删除了缓存,请求 A 才更新完缓存的情况。而一旦请求 A 早于请求 B 删除缓存之前更新了缓存,那么接下来的请求就会因为缓存不命中而从数据库中重新读取数据,所以不会出现这种不一致的情况。

 总结起来,Cache Aside(旁路缓存)策略是我们日常开发中最常使用的一种缓存策略,不过我们也要根据情况而定。比如新注册一个用户,如果按照先更新数据库再删除缓存的策略,可当我们注册用户之后立即读取用户信息,而且有数据库主从分离的情况下,很容易出现因为主从延迟而读不到用户数据。为了解决这个问题,我们应该更新数据库之后马上更新缓存数据,这样就算数据库主从延迟,也可以在缓存中查到数据

Cache Aside 策略适合读多写少的场景,不适合写多的场景,因为当写入比较频繁时,缓存中的数据会被频繁地清理,这样会对缓存的命中率有一些影响。如果业务对缓存命中率有严格的要求,那么可以考虑两种解决方案:

  • 一种做法是在更新数据时也更新缓存,只是在更新缓存前先加一个分布式锁,因为这样在同一时间只允许一个线程更新缓存,就不会产生并发问题了。当然这么做对于写入的性能会有一些影响;

  • 另一种做法同样也是在更新数据时更新缓存,只是给缓存加一个较短的过期时间,这样即使出现缓存不一致的情况,缓存的数据也会很快过期,对业务的影响也是可以接受

Read/Write Through(读穿 / 写穿)策略

Read/Write Through(读穿 / 写穿)策略原则是应用程序只和缓存交互,不再和数据库交互,而是由缓存和数据库交互,相当于更新数据库的操作由缓存自己代理了。

Read Through 策略

先查询缓存中数据是否存在,如果存在则直接返回。

如果不存在,则由缓存组件负责从数据库查询数据,并将结果写入到缓存组件,最后缓存组件将数据返回给应用。

Write Through 策略

当有数据更新的时候,先查询要写入的数据在缓存中是否已经存在:

  • 如果缓存中数据已经存在,则更新缓存中的数据,并且由缓存组件同步更新到数据库中,然后缓存组件告知应用程序更新完成。

  • 如果缓存中数据不存在,直接更新数据库,然后返回

如下图:

Read/Write Through(读穿 / 写穿)策略

Read Through/Write Through 策略的特点是由缓存节点来和数据库打交道,在我们开发过程中相比 Cache Aside 策略要少见一些,原因是我们经常使用的分布式缓存组件,无论是 Memcached 还是 Redis 都不提供写入数据库和自动加载数据库中的数据的功能。而我们在使用本地缓存的时候可以考虑使用这种策略

Write Back(写回)策略

Write Back(写回)策略在更新数据的时候,只更新缓存,同时将缓存数据设置为脏的,然后立马返回,并不会更新数据库。对于数据库的更新,会通过批量异步更新的方式进行。

实际上,Write Back(写回)策略也不能应用到我们常用的数据库和缓存的场景中,因为 Redis 并没有异步更新数据库的功能。

Write Back 是计算机体系结构中的设计,比如 CPU 的缓存、操作系统中文件系统的缓存都采用了 Write Back(写回)策略。

Write Back 策略特别适合写多的场景,因为发生写操作的时候, 只需要更新缓存,就立马返回了。比如,写文件的时候,实际上是写入到文件系统的缓存就返回了,并不会写磁盘。

但是带来的问题是,数据不是强一致性的,而且会有数据丢失的风险,因为缓存一般使用内存,而内存是非持久化的,所以一旦缓存机器掉电,就会造成原本缓存中的脏数据丢失。所以你会发现系统在掉电之后,之前写入的文件会有部分丢失,就是因为 Page Cache 还没有来得及刷盘造成的。

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

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

相关文章

php通过IP获取用户当前所在城市

php获取当前用户所在城市 php通过ip免申请api获取所在城市的代码包括省市区sql数据 <?php function getName($pinyin,$lv){$servername "localhost";$username "root";$password "root";$dbname "ttx";try {$conn new PDO(…

Blazor前后端框架Known-V1.2.4

V1.2.4 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

一款开源的Hitomi-Downloader视频下载工具,几乎支持所有主流视频网站

一款开源的Hitomi-Downloader视频下载工具&#xff0c;几乎支持所有主流视频网站 用过IDM的朋友可能知道IDM有个强大的功能就是可以嗅探网站各种视频、音频等资源&#xff0c;然后提供快捷下载&#xff0c;可不巧的是IDM是收费软件。对于不愿意付费购买IDM的朋友&#xff0c;能…

AssetBundle.Unload(true)无法卸载图集

1&#xff09;AssetBundle.Unload(true)无法卸载图集 ​2&#xff09;关于Unity 2D游戏地图预加载的问题 3&#xff09;Addressables能否支持某些资源不打Bundle直接加载源文件 这是第342篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答…

如何在CSDN博客平台上吸引铁粉

&#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f389;欢迎关注&#x1f5…

照片文件大小怎么修改为200k?图片压缩怎么指定大小?

日常生活和工作中&#xff0c;经常用到图片&#xff0c;但是有时候需要将图片压缩指定大小来符合各种规定&#xff0c;比如图片压缩到200kb&#xff0c;那么有没有简单方便的图片压缩&#xff08; https://www.yasuotu.com/imagesize&#xff09;的方法呢&#xff1f;下面就拿压…

Centos 7 安装 Oracle 11G

Oracle 11G 安装教程 准备环境 p13390677_112040_Linux-x86-64_1of7.zipp13390677_112040_Linux-x86-64_2of7.zipCentos 7- rhel7-英文版的系统–不想换语言的执行(LANGen_US)– 传输 文件到服务器上 创建用户和组 [rootlocalhost ~]# groupadd oracle [rootlocalhost ~]…

用cmd命令刷新dns缓存

DNS flush with “ipconfig /flushdns” To flush the DNS via CMD, use the command ipconfig. To do this, enter the following command and confirm it with enter: ipconfig /flushdns After successful execution, you will receive a message that the DNS resolution…

【Go语言开发】将logrus日志送到elasticsearch构成elk体系

写在前面 这篇文章我们来讲讲怎么把logrus日志送到es。 使用的日志库是 github.com/sirupsen/logrus&#xff0c;由于这个包中的日志对象是可以接入很多个hook的&#xff0c;所以我们可以使用hook来接入 elasticsearch 来操作 。 hook 就是钩子&#xff0c;当设置hook在某个点…

第一章 SegFormer(语义分割篇)——SegFormer: 简单高效的基于Transformer的语义分割设计

0.摘要 我们提出了SegFormer&#xff0c;这是一个简单、高效且强大的语义分割框架&#xff0c;它将Transformer与轻量级多层感知机&#xff08;MLP&#xff09;解码器结合在一起。 SegFormer具有两个吸引人的特点&#xff1a; 1&#xff09;SegFormer包含一个新颖的层次结构的…

【C语言】猜数字游戏

问题描述 猜数字游戏是令游戏机随机产生一个100以内的正整数&#xff0c;用户输入一个数对其进行猜测&#xff0c;需要你编写程序自动对其与随机产生的被猜数进行比较&#xff0c;并提示大了&#xff08;“Too big”&#xff09;&#xff0c;还是小了&#xff08;“Too small”…

springboot项目target下面没有mapper.xml文件

文件结构是这个样子,mapper.xml文件在resources/mappers/fdms目录下面 通常来说, 将mapper打包到target目录下只需要在maven下面配置 <resources><resource><directory>src/main/resources</directory><filtering>true</filtering><inc…

prometheus采集服务的jmx数据,grafana通过dashboard展示jmx数据

prometheus采集服务的jmx数据&#xff0c;grafana通过dashboard展示jmx数据 一、下载prometheus二、解压prometheus三、查看prometheus目录四、查看prometheus版本五、查看prometheus的配置文件六、启动prometheus七、登陆prometheus八、查看prometheus jmx九、下载grafana十、…

嵌入式内核及驱动开发高级

一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔 不支持一些针对所有设备的统一操作&#xff08;如电源管理&#xff09; 不能自动mknod 用户查看不了设备信息 设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离…

AI实现口语练习技术解决方案

最近AI技术取得了技术上的突破&#xff0c;可以非常智能化的实现人机交互。在应用场景上很自然会想到利用AI来实现口语练习&#xff0c;下面和大家分享AI实现口语练习的AI技术方案和开发流程&#xff0c;只列出的整体思路和概略步骤&#xff0c;具体的步骤可能会根据具体的需求…

HttpClient——入门案例(发送http请求)

前言介绍 总结就是使得可以在java程序中发送http请求。 导入依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency> 发送get请求 用…

分享电商平台美食产品—味尚拉面半干面

很高兴跟您分享电商平台上一款刚推出的热门美食产品——味尚拉面 半干面。 味尚拉面 半干面&#xff0c;由厂家精心制作而成&#xff0c;是一款十分劲道爽口的拉面&#xff0c;让您在繁忙的生活中享受到美味的口感。 作为一款电商平台上备受瞩目的产品&#xff0c;味尚拉面 半干…

​揭示嵌入式系统中的难题和解决方案

嵌入式系统设计和开发过程中存在一些常见难题&#xff0c;下面是这些难题以及相应的解决方案的简要概述。 处理资源受限&#xff1a;嵌入式系统通常具有有限的处理能力、存储容量和能源。解决方案包括&#xff1a;优化算法和数据结构&#xff0c;选择适合的硬件平台&#xff0c…

VUE2教程-基础-简介

Vue.js 是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一…

【教程】爬取和统计Google Scholar上指定关键词的文章信息

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 目录 背景介绍 未来改进 参考代码 背景介绍 通过自动点击页面来抓取文章信息。这个脚本对于用来看某个关键词在近几年的研究趋势很有用~半自动&#xff1a;当遇到谷歌人机验证&#xff0c;需要手动完成。注意…