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

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

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

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

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

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

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

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

相关文章

51建模网3D编辑器:一键为3D模型设置特殊材质

3D设计师要对3D模型设置玻璃或者钻石材质时&#xff0c;操作比较复杂&#xff0c;但是利用51建模网的3D编辑器&#xff0c;不用下载安装软件&#xff0c;在线通过浏览器即可编辑&#xff0c;具有一键设置特殊材质的功能。目前&#xff0c;它支持钻石材质、玻璃材质和水波纹材质…

Java——基础快速过

1.注释&#xff0c;标识符&#xff0c;关键字 1.1注释 单行注释&#xff1a;// 注释内容&#xff08;用的最多&#xff09; 多行注释&#xff1a;/* 注释内容*/&#xff08;不推荐&#xff09; 文档注释&#xff1a; /** 文档注释 */&#xff08;常见于方法和类之上描述方法和…

分布式任务队列系统 celery 进阶

通过前面的入门&#xff0c;我们大概了解了celery的工作原理及简单的入门代码示例&#xff08;传送门&#xff09;&#xff0c;下面进行一些稍微复杂的任务调度学习 多目录结构异步执行 在实际项目中&#xff0c;使用Celery进行异步任务处理时&#xff0c;经常需要将代码组织…

【面试题】创建两个线程交替打印100以内数字(一个打印偶数一个打印奇数)

阅读导航 一、问题概述二、解决思路三、代码实现四、代码优化 一、问题概述 面试官&#xff1a;C多线程了解吗&#xff1f;你给我写一下&#xff0c;起两个线程交替打印0~100的奇偶数。就是有两个线程&#xff0c;一个线程打印奇数另一个打印偶数&#xff0c;它们交替输出&…

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本&#xff1a;20.10.25 k8s版本&#xff08;kubeadm&#xff0c;kubelet和kubectl&#xff09;&#xff1a;1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …

MySQL的联合索引及案例分析

1. 联合索引 关于联合索引的详解参考博客【Mysql-----联合索引和最左匹配】&#xff0c;包含讲解 最左匹配 联合索引失效的情况 不遵循最左匹配原则范围查询右边失效原理like索引失效原理 比较关注的点在于&#xff1a; 对A、B、C三个字段创建一个联合索引&#xff08;A, …

在线建站流程分析

建站流程是指通过互联网创建一个个人或企业网站的过程。随着互联网的发展&#xff0c;越来越多的人和机构开始意识到网络的重要性&#xff0c;建站成为一种常见的行为。在线建站的流程一般包括以下几个步骤。 首先&#xff0c;选择一个合适的建站平台。目前&#xff0c;有很多在…

前端逆向之查看接口调用栈

一、来源 再分析前端请求接口数据的时候&#xff0c;其中有一个sid不知道是前端如何获取的&#xff0c;一般情况下只需要全局搜搜sid这个字符串或者请求接口的名称就可以了&#xff0c;基本都能找到sid的来源&#xff0c;但是今天这个不一样&#xff0c;搜什么都搜不到 接口地…

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

AI论文工具推荐

AI 在学术界的使用情况也比较疯狂&#xff0c;特别是一些美国大学&#xff0c;用 AI 来辅助阅读文献以及辅助写论文的越来越多&#xff0c;毕竟确实可以提高写作效率&#xff0c;特别是在文献综述和初稿生成方面。 但在科研界其实&#xff0c;发现看论文的速度已经赶不上发论文…

“粘土风格”轻松拿捏,基于函数计算部署 ComfyUI实现AI生图

阿里云函数计算 FC 一键部署火爆全球工作流 AI 生图平台—— ComfyUI &#xff0c;实现更高质量的图像生成&#xff0c;三步轻松完成“黏土”创意AI画作&#xff0c;晒图赢眼部按摩器等好礼&#xff01; 活动地址&#xff1a; https://developer.aliyun.com/topic/june/fcspma…

编写备份MySQL 脚本

目录 环境准备 增量备份 增量备份和差异备份 完整代码如下 测试脚本是否正常 星期天运行脚本&#xff08;完全备份&#xff09; 星期一运备份脚本&#xff08;增量备份&#xff09; 星期二备份数据&#xff08;其他天--增量备份&#xff09; 星期三备份数据&#xff08;差异备…

【强烈推荐】四元数与三维旋转

目录 1 强烈推荐讲解四元数与三维旋转的这篇文章&#xff0c;深入浅出2 笔记2.1 复数2.1.1 复数的定义2.1.2 复数的乘法与二维旋转 2.2 三维空间中的旋转2.2.1 角轴2.2.2 旋转的分解 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的乘法2.3.3 四元数与三维旋转2.3.4 三维旋转的矩阵…

数字影像产业园的三大赋能:科技、创新与无限可能

数字影像产业园作为文创产业的重要载体&#xff0c;以科技为核心驱动力&#xff0c;不断推动产业的技术革新和升级。 园区内汇聚了最前沿的数字技术资源&#xff0c;高清摄影设备、虚拟现实技术、人工智能应用等尖端科技在这里得到广泛应用&#xff0c;不仅提升了生产效率&…

能源SCI期刊,中科院4区,审稿快,IF=3.858

一、期刊名称 Frontiers in Energy Research 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;能源 影响因子&#xff1a;3.858 中科院分区&#xff1a;4区 三、期刊征稿范围 能源研究前沿出版了整个领域的严格同行评审研究&#xff0c;重点是可持续和环境…

java多线程原理

1.线程创建与启动&#xff1a;通过继承Thread类或实现Runnable接口创建线程&#xff0c;并调用start()方法启动线程。 1.线程状态&#xff1a;线程在其生命周期中有多种状态&#xff0c;包括新建、运行、阻塞、死亡等。了解这些状态以及如何在它们之间转换对于管理线程至关重要…

ICLR 2024 BACKDOOR FEDERATED LEARNING BY POISONING BACKDOOR-CRITICAL LAYERS

寻找后门攻击最有效的网络层。现有的 FL 攻击和防御方法通常关注整个模型。 他们都没有认识到后门关键&#xff08;BC&#xff09;层的存在——控制模型漏洞的一小部分层。 攻击 BC 层可达到与攻击整个模型相同的效果&#xff0c;但被最先进 (SOTA) 防御检测到的机会要小得多。…

如何卸载360安全卫士

不用像其他教程那么复杂 这篇教程比较友好 1.打开桌面&#xff0c;右键单击快捷方式 选择“打开文件位置” 2.然后&#xff0c;搜uninst.exe 3.运行 4.选择“继续卸载” 5.选择“下一步” 6.选择 “继续卸载” 7.选择“继续卸载” 8.选择“是” 9.静等卸载 10.把卸载程序关…

【因果推断python】16_工具变量2

目录 出生季度和教育对工资的影响 第一阶段 出生季度和教育对工资的影响 到目前为止&#xff0c;我们一直将这些工具视为一些神奇的变量 Z&#xff0c;它们具有仅通过干预变量影响结果的神奇特性。老实说&#xff0c;好的工具变量来之不易&#xff0c;我们不妨将它们视为奇迹…

Windows11系统 和Android 调试桥(Android Debug Bridge,ADB)工具安装,app抓取日志内容

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Android调试桥&#xff08;ADB&#xff09;是一种多功能命令行工具&#xff0c;它允许开发者与连接到计算机上的Android设备进行通信和控制。ADB工具的作用包括但不限于&#xff1a; 安装和卸载应用程序&…