redis常用设计模式

news2024/10/6 14:29:03

Redis常用的设计模式分为读,写,读写三种

一、概要说明

读操作

  1. Read Through Pattern 读穿透

写操作

以Redis统一视图为准:先更新缓存,后更新数据库。

  1. Write Through Pattern 直写模式(首先将数据写入缓存,再将数据立即同步到数据库。)

  2. Write Behind Pattern 写后模式(首先将数据写入缓存,再将数据异步的批量同步到数据库)

写操作不经过缓存。

  1. Write Around Pattern 绕写模式(数据直接写入数据库,不经过缓存)。

读写操作

  1. Cache Aside Pattern 旁路模式(缓存操作是由应用程序显式控制的,开发者可以根据特定业务需求来自定义管理缓存数据,更加灵活可控)

二、详细说明

1 读模式

1.1 Read Through Pattern

读穿透模式:在这种模式下,应用程序在读数据时,首先直接对缓存发起请求(先查缓存),如果缓存未命中(缓存中不存在该数据),缓存中间件会自动触发一个回源操作,从数据库或其它数据源中获取数据,然后将数据写入缓存中,最终由缓存返回数据给应用程序。

步骤

  1. 应用程序请求读数据。
  2. 首先查询缓存中是否有数据的键存在。
  3. 如果缓存命中(缓存中存在该数据),则直接从缓存中获取数据,返回给应用程序。
  4. 如果缓存未命中,缓存层会从数据库中获取数据。
  5. 将数据写入缓存。
  6. 缓存返回新加载的数据给应用程序。
    在这里插入图片描述
    优点

降低数据库的负载:一旦数据被加载到缓存中,后续的读取请求将直接从缓存中获取数据,减少了对数据库的直接访问。

提高系统的性能和并发读取能力:读操作从缓存中进行,缓存的读取速度快,从而提高了系统的性能。

缺点

高并发请求下的数据不一致:连续两次写入请求,由于写入操作存在先后顺序问题,当数据被更新时,其它并发请求可能还在读取缓存中的旧数据,导致数据不一致。

回源延迟:如果缓存未命中,回源操作会导致数据的获取有一定的延迟,特别是当数据量较大时,延迟会更加明显。

解决方案

设置合适的缓存数据过期时间,采用适当的缓存数据过期策略和缓存淘汰策略确保缓存的有效性。

“定期删除+惰性删除”策略:用于删除过期的缓存数据。

内存淘汰策略:用于在内存不足时,选择要淘汰的缓存数据。

适用场景

适用于读取频繁写入较少,对数据一致性要求不高,对速度和性能要求较高的场景。

2 写模式

2.1 Write Through Pattern

写穿透模式(直写模式):在这种模式下,应用程序在写数据时,首先将数据写入缓存,然后再将数据立即写入到数据库,确保数据库和缓存中的数据保持一致。

步骤

  1. 应用程序发起写操作。
  2. 首先将数据写入缓存。
  3. 再将数据立即写入到数据库。

先更新缓存再立即更新数据库
在这里插入图片描述
优点

数据一致性:每次写操作都要同时更新缓存和数据库,保证了缓存和数据库之间的数据一致性。

即时的数据访问:由于缓存始终保持最新状态,读取操作可以立即从缓存中获取最新的数据,提高了数据访问的速度。

缺点

写操作延迟:对于写操作频繁的场景,每次写操作都要同时更新缓存和数据库,导致写操作延迟。

资源消耗:缓存和数据库的同步更新会消耗更多的计算和内存资源。

适用场景

适用于对数据一致性要求较高,写操作不频繁的场景。

例如:电商平台的订单处理,当用户下单时,订单信息既写入缓存,也同步写入数据库,保证了数据的实时性和一致性。

2.2 Write Behind Pattern

写后模式:在这种模式下,应用程序在写数据时,首先将数据写入缓存,然后再将数据异步的批量写入到数据库。

步骤

  1. 应用程序发起写操作。
  2. 首先将数据写入缓存。
  3. 再将数据异步的批量写入到数据库。

先更新缓存再异步更新数据库
在这里插入图片描述
优点

提高写操作性能:写操作首先发生在缓存中,通常比写入数据库快得多。

减轻数据库负载:异步批量写入数据库,减少对数据源的即时写操作。

提高响应时间:写操作首先发生在缓存中,可以更快的响应写请求。

缺点

数据一致性问题:由于数据是异步写入数据库的,导致缓存和数据库之间在一定时间内的数据不一致。

适用场景

适用于写操作远多于读操作,且对数据一致性要求不高的场景。

例如:用户行为日志收集,用户在网站上的点击行为被记录在缓存中,然后异步批量写入到日志数据库。

2.3 Write Around Pattern

绕写模式:在这种模式下,应用程序在写数据时,直接将数据写入数据库,写操作不经过缓存(写数据绕过缓存),缓存仅用于读取操作。
在这里插入图片描述
优点

提高缓存效率:写操作不需要同步到缓存,缓存不会应为写操作而频繁的失效或更新。

提高内存利用率:防止那些不会再次被读取到的数据占用缓存空间,提高资源利用率。

缺点

无法保障数据一致性:如果更新的数据同时存在于缓存和数据库中,则会造成缓存和数据库中的数据不一致。由于缓存数据没有被及时更新,导致从缓存中获取到脏数据。

适用场景

适用于数据写入后很少被读取的场景。

例如:对于数据备份操作直接写入到备份存储中,不经过缓存;或者是针对报告、归档信息的操作。

3 读写模式

3.1 Cache Aside Pattern

旁路缓存模式:在这种模式下,读数据时先查询缓存,缓存命中则直接返回数据;缓存未命中,则查询数据库,查询成功后,更新缓存中的数据。

写数据时先更新数据库,更新成功后删除缓存。

读数据

  1. 首先查询缓存中是否有数据的键存在。

  2. 如果缓存命中,则直接从缓存中获取数据,返回给应用程序。

  3. 如果缓存未命中,则从数据库中查询数据。

  4. 查询成功后,将数据写入缓存。

  5. 最后,将数据返回给应用程序。

写数据

  1. 直接将数据写入数据库。

  2. 写数据库成功后,删除缓存。
    在这里插入图片描述

优点

确保缓存中存放的是真热点数据:只有在实际需要时,才加载数据到缓存,避免缓存中填充未使用或很少使用的数据,保证缓存中存放的是当前窗口的活跃数据。

内存占用小:只缓存真正的热点数据,减少缓存空间的浪费,更有效的利用缓存空间。

提高灵活性:缓存操作是由应用程序显式控制的,开发者可以根据特定业务需求来管理缓存数据。

缺点

代码复杂性:需要额外的代码逻辑去处理缓存的加载和失效。

数据一致性问题:由于缓存更新依赖于应用程序逻辑,如果处理不当,可能会导致缓存和数据库之间的数据不一致。

适用场景

适用于读多写少,对数据实时性要求不高的场景。

例如:新闻内容展示、博客文章的阅读。

如果缓存删除失败设置缓存过期时间兜底。---- 保证最终一致性

一. 缓存数据的类型

  • 静态缓存数据

例如:字典表,静态缓存数据没有时间窗口,即没有设置过期时间。

  • 动态的缓存

当前窗口的活跃数据,需要设置合适的缓存过期时间。

2. 过期时间的设置

建议:过期时间 <= 业务时间 — 续期

总结:

即使缓存删除失败了,这个缓存数据也是带有过期时间的,采用“定期删除+惰性删除”的策略。

定期删除:Redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。 定期删除可能会导致很多过期的key到了时间并没有被删除掉,此时就要用到惰性删除。

惰性删除:在你请求某个key的时候,redis会检查这个key是否设置了过期时间,并判断是否过期了,如果过期就删除。

所谓延时双删

A读数据 --> 发现缓存失效了 --> A读数据库(假设读到5) --> 更新缓存(缓存中数据为5)

在A读数据后到更新缓存的过程中,发生了:

B写数据 ----> 写入数据库(数据库中值被更新为6) —> 删除缓存

这个写操作正好卡在A读后到更新的过程中。

于是有人提出了延时双删:

先更新数据库 --> 更新成功后,立刻删除缓存 --> 延时后再删除缓存

延时双删并没有彻底解决问题,也带来了数据延时一致性的窗口期。

所以增加延时双删反而使得问题更复杂了,还不如直接给缓存中的数据设置合适的过期时间,采用缓存淘汰策略兜底。

即使有第三方直接更新了数据库,而不是通过请求进来更新的,用设置缓存数据过期时间兜底的方案仍然可以解决问题。

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

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

相关文章

github删除某个仓库

在GitHub上删除一个仓库&#xff0c;按照以下步骤操作&#xff1a; 1、登录到GitHub账户。 2、导航到想要删除的仓库页面。 3、点击仓库页面上的"Settings"&#xff08;设置&#xff09;选项卡。 4、向下滚动到页面底部&#xff0c;找到"Danger Zone"&…

数字证书-USBKey使用指导

在商用密码应用安全性评估&#xff08;密评&#xff09;场景下&#xff0c;您可以通过数字证书管理服务控制台申请带有私钥的合规CA证书。只有在安装了USBKey控件并将USBKey插入本地操作系统后&#xff0c;才能选择本地密钥容器来申请合规CA证书。本文介绍如何安装和使用USBKey…

10_JavaWeb过滤器

文章目录 过滤器1.过滤器的实现1.1 实现过滤器1.2 配置过滤器1.2.1 过滤器的xml方式1.2.2 过滤器的注解方式 2. 过滤器的生命周期3. 过滤器链使用 过滤器 生活举例: 公司前台,停车场安保,地铁验票闸机 java中过滤仅仅是对请求做出过滤 客户端向服务器发出请求&#xff0c;在服…

使用 Hugging Face 推理终端搭建强大的“语音识别 + 说话人分割 + 投机解码”工作流...

Whisper 是当前最先进的开源语音识别模型之一&#xff0c;毫无疑问&#xff0c;也是应用最广泛的模型。如果你想部署 Whisper 模型&#xff0c;Hugging Face推理终端能够让你开箱即用地轻松部署任何 Whisper 模型。但是&#xff0c;如果你还想叠加其它功能&#xff0c;如用于分…

0531作业 链表

结果 整体代码 主要实现 /**实现* */ #include "./linklist.h"linklist* create_linklist(datatype param){linklist* node(linklist*)malloc(sizeof(linklist));if(NULLnode){puts("节点创建失败");}node->paramparam;node->pnextNULL;puts("…

每天CTF小练--ctfshow新手村

easy_base 密文&#xff1a;0XezFWZfNXafRjNlNXYit3dvh2cmR3Y 等号在前面&#xff0c;直接倒序后解码 ctfshow{base64_is_easy} 代码解&#xff1a; s 0XezFWZfNXafRjNlNXYit3dvh2cmR3Y print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转…

运放应用2 - 同相放大电路

1. 前置知识 同相放大电路存在 负反馈电路 &#xff0c;工作在线性区&#xff0c;可以利用 虚短 概念来分析电路。 注&#xff1a;运放的 虚断 特性是一直存在的&#xff0c;虚短 特性则需要运放工作在 线性区 有关运放的基础知识&#xff0c;可以参考我的另外一篇文章&#x…

【深度学习】目标检测,Faster-RCNN算法训练,使用mmdetection训练

文章目录 资料环境数据测试 资料 https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/config.html 环境 Dockerfile ARG PYTORCH"1.9.0" ARG CUDA"11.1" ARG CUDNN"8"FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}…

掘金AI商战宝典-系统班:2024掘金AIGC课程(30节视频课)

课程下载&#xff1a;掘金AI商战宝典-系统班&#xff1a;2024掘金AIGC课程(30节视频课)-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程目录 1-第一讲学会向Al提问&#xff1a;万能提问公式_1.mp4 2-第二讲用AI写视频脚本_1.mp4 3-第三讲…

教科书般的充电桩平台多租户技术架构设计,建议收藏!-慧哥充电桩开源平台

慧哥充电桩开源平台V2.5.2_----- SpringCloud 汽车 电动自行车 云快充1.5、云快充1.6 https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001.5502 一、多租户的概念 多租户本质上是一种软件的技术架构&#xff0c;它最核心的特征是多个租户可以共享一…

Mamba v2诞生:1 儒(Transformers)释(SSD)道(Mamba)本是一家?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

基于MinGW64 GCC编译Windows平台上的 libuvc

安装cmake 打开cmake官网 https://cmake.org/download/&#xff0c;下载安装包&#xff1a; 安装时选择将cmake加到系统环境变量里。安装完成后在新的CMD命令窗口执行cmake --version可看到输出&#xff1a; D:\>cmake --version cmake version 3.29.3 CMake suite mainta…

Hotcoin精彩亮相Consensus 2024 Austin,探索行业风向标

5 月 31 日&#xff0c;由CoinDesk主办的“Consensus 2024”大会在德克萨斯州的奥斯汀市正式落下帷幕。作为全球规模最大、最具影响力的加密货币、区块链、Web3盛会&#xff0c;本次Consensus 2024 Austin吸引来自 100 多个国家/地区的 15,000 多名与会者、6,800 家公司、850 多…

LeetCode-2246. 相邻字符不同的最长路径【树 深度优先搜索 图 拓扑排序 数组 字符串】

LeetCode-2246. 相邻字符不同的最长路径【树 深度优先搜索 图 拓扑排序 数组 字符串】 题目描述&#xff1a;解题思路一&#xff1a;找路径背诵版&#xff1a;解题思路三&#xff1a; 题目描述&#xff1a; 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&…

python中实现队列功能

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python中实现队列功能 选择题 以下代码最后一次输出的结果是&#xff1f; from collections import deque queue deque() queue.append(1) queue.append(2) queue.append(3) print(【显示】…

Nginx 配置:gzip动态压缩、静态压缩

动态压缩 动态压缩开启的现象 Nginx配置 http {# 启用 gzip 压缩gzip on;# 设置 gzip 压缩级别&#xff0c;范围是1-9&#xff0c;数字越大压缩率越高但CPU消耗也越大gzip_comp_level 5;# 设置最低压缩的文件大小&#xff08;大于1KB的文件才进行压缩&#xff09;gzip_min_le…

【Linux进程篇】Linux进程管理应用——虚假的shell脚本

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经了解了进程的工作原理&#xff0c;并且学习了进程创建、进程终止、进程等待以及进程程序替换。为了更好的巩固这些知识&#xff0c;我们可以创建一个简易的shell命令行。 目录 做一个简易的s…

【DevOps】网站安全案例分析:真实事件中的经验与教训

目录 一、常见的网站安全事故案例 1. Equifax 数据泄露事件&#xff08;2017年&#xff09; 2. WannaCry 勒索软件攻击事件&#xff08;2017年&#xff09; 3. GitHub DDoS 攻击事件&#xff08;2018年&#xff09; 二、网站安全事件的一般分析方法 1、事件背景调查 2、…

09-spring的bean创建流程(一)

文章目录 spring中bean的创建流程finishBeanFactoryInitialization(beanFactory)beanFactory.preInstantiateSingletons();getMergedLocalBeanDefinition(beanName);流程实现FactoryBean接口,里面的对象实例化过程 spring中bean的创建流程 finishBeanFactoryInitialization(be…

14-ShardingSphere的分布式主键实现

1 ShardingSphere自动生成键 MySQL自增键、Oracle自增序列等。分片场景下问题就复杂了&#xff0c;不能依靠单实例上的自增键来实现不同数据节点之间的全局唯一主键&#xff0c;分布式主键的需求应运而生。ShardingSphere 作为一款优秀分库分表开源软件&#xff0c;同样提供分…