redis常用设计模式

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读后到更新的过程中。

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; int candy(int* ratings, int ratingsSize) {int ret 1;int inc 1, dec 0, pre 1;for (int i 1; i < ratingsSize; i) {if (ratings[i] > ratings[i - 1]) {dec 0;pre ratings[i] ratings[i - 1] ? 1 : pre 1;ret pre;inc…

表的设计与查询

目录 一、表的设计 1.第一范式&#xff08;一对一&#xff09; 定义&#xff1a; 示例&#xff1a; 2.第二范式&#xff08;一对多&#xff09; 定义&#xff1a; 要求&#xff1a; 示例&#xff1a; 3.第三范式&#xff08;多对多&#xff09; 定义&#xff1a; 要求…

MySQL中的数据库约束

目录 导读&#xff1a; 约束类型 1、not null&#xff08;不能为空&#xff09; 2、unique(唯一) 3、default(默认值约束) 4、primary key(唯一)与unique 相同点&#xff1a; 不同点&#xff1a; auto_increment&#xff1a; 5、foreign key(外键) 语法形式&#xff…

在WSL2下配置Pytorch(Linux+Anaconda+PyTorch-GPU)

之前使用过双系统、虚拟机的ubunutu 效果都不是很好&#xff0c;要么切换系统太麻烦&#xff0c;要么太卡顿 最近在尝试WSL子系统&#xff0c;没有想到还是有很多坑 记录一下配置的过程 一、NVIDIA显卡的安装 因为WSL和Windows的显卡驱动不能互通&#xff0c;所以在子系统上需…

在iPhone上恢复删除Safari历史记录的方法[2024]

您是否正在寻找恢复 iPhone 上已删除的 Safari 历史记录的最佳方法&#xff1f;好吧&#xff0c;这篇文章提供了 4 种在有/无备份的情况下恢复 iPhone 上已删除的 Safari 历史记录的最佳方法。现在按照分步指南进行操作。 iPhone 上的 Safari 历史记录会被永久删除吗&#xff1…

开源项目学习——vnote

一、介绍 vnote是一款免费且开源的markdown编辑器&#xff0c;用C开发&#xff0c;基于Qt框架&#xff0c;windows/linux/mac都能用。 二、编译 $ git clone --recursive https://github.com/vnotex/vnote.git $ cd vnote && mkdir build $ cd build $ cmake ../ $ …

国外媒体软文发稿-引时代潮流-助力跨国企业蓬勃发展

大舍传媒&#xff1a;开疆拓土&#xff0c;引领传媒新潮流 随着全球经济的一体化和信息技术的高速发展&#xff0c;跨国企业在国际市场上的竞争越来越激烈。这也给跨国企业带来了巨大的机遇和挑战。在这个时代背景下&#xff0c;大舍传媒凭借其独特的优势和创新的服务模式&…

代码随想录算法训练营第五十四 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html class Solution { public:bool isSubsequence(string s, string t) {if(s.size()0 )return true;if(t.size()0)return false;vector<vector<int>> dp(s.size(…

GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记&#xff0c;有一些简单的证明和原理&#xff0c;是根据李宏毅老师的课程整理的&#xff0c;下面有链接。本篇文章主要就是梳理基础的概念和训练过程&#xff0c;如果有什么问题的话也可以指出的。 李宏毅老师的课程链接 1.概述 GAN是…

不能访问huggingface、与GPU配置

不能访问huggingface解决方法 如果是从 huggingface.co 下载模型&#xff0c;由于国内不能访问&#xff0c;所以建议先配置一下环境变量&#xff0c; 通过访问国内镜像站点 https://hf-mirror.com来下载模型。 &#xff08;1&#xff09;Linux系统设置环境变量&#xff1a; e…

[Cloud Networking] Layer3 (Continue)

文章目录 1. DHCP Protocol1.1 DHCP 三种分配方式1.2 DHCP Relay (中继) 2. 路由协议 (Routing Protocol)2.1 RIP (Routing Information Protocol)2.2 OSPF Protocol2.3 BGP Protocol2.4 IS-IS Protocol2.5 ICMP&#xff08;Internet Control Message Protocol&#xff09; 1. …

Unity 设置默认字体(支持老版及新版TMP)

普通UI-Text设置 &#xff08;同一unity版本设置一次即可&#xff09; 1.首先工程的Resources目录下创建Fonts文件夹用于存放字体 如下图所示 2.找到Unity的安装目录下的Editor\Data\Resources\PackageManager\BuiltInPackages\com.unity.ugui\Runtime\UI\Core\Text.cs文件 …

YOLOv5改进 | 主干网络 | 用SimRepCSP作为主干网络提取特征【全网独家 + 降本增效】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; SimRepCSP 类似于 YOLOv7的主干网络&#xff0c;由卷积模块和重参数化卷积&#xff08;RepConv&#xff09;模块组合而成&#xff0c;以 Cro…

特种设备起重机指挥题库附答案

1、【多选题】力的三要素是指:( )。(ACD) A、力的大小 B、力的单位 C、力的方向 D、力的作用点 2、【多选题】司索作业规范正确的要求是( )(ABC) A、吊点正确 B、吊索挂设合理 C、绑扎牢靠 D、吊索长短一致 3、【多选题】圆柱形物体兜吊时&#xff0c;一定要放空圈&#…

从零开始,手把手教你文旅产业策划全攻略

如果你想深入了解文旅策划的世界&#xff0c;那么有很多途径可以获取知识和灵感。 首先&#xff0c;阅读一些专业书籍也是一个不错的选择。书店或图书馆里有许多关于文旅策划的书籍&#xff0c;它们通常涵盖了策划的基本理论、方法和实践案例。通过阅读这些书籍&#xff0c;你…

python项目(豆瓣电影)

目录 1、项目效果 2、项目源码 3、技术实现 4、总结 前言 我的这个项目是做的一个豆瓣电影爬取&#xff0c;爬取了豆瓣电影的TOP排行榜的数据 包括电影的名称 演员 评分 评价人数等等 运用了TK布局助手 布了4个界面 有登录 注册 首页 详情 注意&#xff1a;项目并没有连接数…

讨论C++类与对象

讨论C类与对象 C语言结构体和C类的对比类的实例化类对象的大小猜想一猜想二针对上述猜想的实践 this指针不同对象调用成员函数 类的6个默认成员函数构造函数析构函数拷贝构造函数浅拷贝和深拷贝 赋值运算符重载 初始化列表初始化顺序 C语言结构体和C类的对比 在C语言中&#x…

深入探讨跨域请求(CORS):原理、解决方案与详细示例代码

深入探讨跨域请求&#xff08;CORS&#xff09;&#xff1a;原理、解决方案与详细示例代码 &#x1f310; 深入探讨跨域请求&#xff08;CORS&#xff09;&#xff1a;原理、解决方案与详细示例代码 &#x1f310;摘要引言正文内容什么是跨域&#xff1f;为什么会有跨域问题&am…

三十七篇:大数据架构革命:Lambda与Kappa的深度剖析

大数据架构革命:Lambda与Kappa的深度剖析 1. 引言 在这个数据驱动的时代,我们面临着前所未有的挑战和机遇。随着数据量的爆炸性增长,传统的数据处理方法已无法满足现代业务的需求。大数据处理不仅涉及数据量的增加,还包括数据类型的多样化、数据来源的广泛性以及对实时数据…

两句话让LLM逻辑推理瞬间崩溃!!

一道简单的逻辑问题&#xff0c;竟让几乎所有的LLM全军覆没&#xff1f; 对于人类来说&#xff0c;这个名为「爱丽丝梦游仙境」&#xff08;AIW&#xff09;的测试并不算很难—— 「爱丽丝有N个兄弟&#xff0c;她还有M个姐妹。爱丽丝的兄弟有多少个姐妹&#xff1f;」 稍加思考…