Redis缓存管理机制

在当今快节奏的数字世界中,性能优化对于提供无缝的用户体验至关重要。缓存在提高应用程序性能方面发挥着至关重要的作用,它通过将经常使用或处理的数据存储在临时高速存储中来减少数据库负载并缩短响应时间,从而减少系统的延迟。Redis 是一种流行的内存数据存储,它提供了强大的缓存解决方案,可以显着提高应用程序的速度和效率。

在深入研究 Redis 缓存之前,让我们先了解缓存的基础知识。缓存涉及将经常访问或计算成本高昂的数据存储在快速且易于访问的位置(例如内存)中,以加快后续请求的速度。通过将数据存储在缓存中,应用程序可以避免从速度较慢的数据源(如数据库或外部 API)获取数据的需要,从而缩短响应时间并减少服务器负载。

Redis就像是一个超级快的小助手,站在数据库和应用程序之间(可以类比CPU,缓存,内存): Redis把数据存在内存里,就像把常用的东西放在手边一样,取用起来超快。相比之下,数据库就像是要去仓库找东西,慢很多。

使用 Redis 缓存时,请务必考虑以下内容:

确定要缓存的正确数据:并非所有数据都需要缓存。专注于缓存经常访问或生成计算成本高昂的数据。这包括不经常更改或可以在多个请求之间共享的数据。

设置过期策略:为缓存的数据确定适当的过期策略。这可确保缓存保持最新状态,并避免提供过时的数据。根据数据更新的频率和缓存数据所需的新鲜度设置过期时间。

实现缓存失效:当基础数据发生变化时,必须使相应的缓存条目失效或更新。这可以通过使用缓存失效触发器或监视数据源中的更改等技术来完成。

监控缓存性能:定期监控缓存性能,确保其有效性。密切关注缓存命中率、缓存未命中率和整体缓存利用率。监控可以帮助识别潜在的瓶颈或需要优化的领域。

针对高流量扩展 Redis:随着应用程序流量的增长,请考虑扩展 Redis 以处理增加的负载。这可能涉及使用 Redis 集群或复制在多个实例之间分配数据并提高读取和写入吞吐量。


缓存策略

a) 读取数据时:

  • 应用程序先问Redis:"嘿,你有这个数据吗?"

b) 写入数据时:

  • 如果Redis说"有",应用程序就直接用了,省去了问数据库的时间。
  • 如果Redis说"没有",应用程序就去数据库拿,然后告诉Redis:"保存一下,下次可能用得着。"
  • 应用程序更新数据库,然后告诉Redis:"嘿,数据更新了,你也更新一下。"

Redis的缓存策略主要涉及如何有效地管理缓存数据,以及如何保持缓存与数据源的一致性。让我们通过几个主要的缓存策略来深入了解:

1. Cache-Aside(旁路缓存)

想象Redis是一个效率极高的助手,而数据库是一个大型档案室。

工作流程

  • 读取数据:应用先查Redis,没有则去数据库取,然后放入Redis。
  • 写入数据:先更新数据库,再删除Redis中的对应键。

比喻:你想找一份文件。首先问助手(Redis)有没有,如果没有,你就去档案室(数据库)找,找到后给助手一份副本。当你需要更新文件时,先更新档案室的原件,然后告诉助手丢掉手中的旧副本。

优点:实现简单,Redis挂掉不影响系统正常运行。保证数据一致性。

缺点:第一次访问数据时会比较慢(称为"缓存穿透")。

2. Read/Write Through(读写穿透)

想象Redis现在变成了一个聪明的管家,所有的数据请求都必须经过他。

工作流程:

  • 读取数据:应用只和Redis交互,如果Redis没有数据,Redis负责从数据库读取并缓存。
  • 写入数据:应用把数据写入Redis,Redis负责同步更新到数据库。

比喻:你需要任何文件都告诉管家(Redis)。如果管家没有,他会去档案室(数据库)取,然后保存一份。当你要更新文件时,你把新文件交给管家,由他负责更新档案室。

优点:对应用层透明,应用不需要关心缓存的细节。数据一致性好。

缺点:增加了Redis的复杂度。可能会带来一定的性能损失。

3. Write-Behind Caching(异步写入)

把Redis想象成一个能暂存数据的智能助理。

工作流程:

  • 读取数据:与Read Through相同。
  • 写入数据:数据写入Redis后立即返回,Redis异步地将数据更新到数据库。

比喻:你把所有更新的文件都交给助理(Redis)。助理先记录下来,然后在空闲时统一更新到档案室(数据库)。

优点:写操作性能高。可以合并多次写操作,减少数据库压力。

缺点

数据丢失风险高,Redis宕机可能导致未同步的数据丢失。

数据一致性较弱,可能出现Redis和数据库数据不一致的情况。

4. 预加载策略

将Redis视为一个预习室。

工作流程:在系统启动或者定时任务中,主动将热点数据加载到Redis中。

比喻:在开始工作前,助理(Redis)主动去档案室(数据库)取出可能会用到的文件,放在手边以备不时之需。

优点:可以提前准备热点数据,提高访问速度。减少缓存穿透的情况。

缺点:需要提前预测热点数据,如果预测不准确可能会浪费资源。

5. 多级缓存策略

将Redis作为多级缓存系统中的一环。

工作流程
构建本地缓存(如应用服务器的内存) -> Redis -> 数据库的多级缓存架构。

比喻:你的办公室有个小抽屉(本地缓存),办公室外有个文件柜(Redis),大楼里有个档案室(数据库)。你会先看抽屉,然后是文件柜,最后才去档案室。

优点:进一步提高数据访问速度。减轻Redis的压力。

缺点:增加了系统复杂度。多级缓存一致性维护变得更加困难。

选择哪种缓存策略取决于你的具体需求,如对数据一致性的要求、系统的读写比例、性能需求等。在实际应用中,常常会综合使用多种策略来达到最佳效果。

redis把登入的数据都登录在了缓存内存中,避免了浪费时间的IO操作,但是随着数据量的增加redis存储的数据也会越来越多,所以接下来引入了过期策略


过期策略

设置过期策略:为缓存的数据确定适当的过期策略。这可确保缓存保持最新状态,并避免提供过时的数据。根据数据更新的频率和缓存数据所需的新鲜度设置过期时间。

Redis不会永远保存所有数据,它会给数据设置"保质期"。

  • 就像冰箱里的食物,过期了就自动扔掉。
  • 这样可以保证Redis里always存着新鲜的数据。

Redis 主要使用三种策略来管理过期的键:定时删除、惰性删除和内存淘汰。让我们用简单的比喻来理解这些概念。

1. 定时删除(主动删除)

想象 Redis 是一个图书管理员,而键就是借出去的书。

  • 工作原理:Redis 会为每个设置了过期时间的键都创建一个定时器,一旦到期,就立即删除。
  • 比喻:图书管理员给每本借出去的书都设置了一个闹钟。闹钟一响,他就立即去找到这本书并将其下架。
  • 优点:内存友好,过期键能被及时删除。
  • 缺点:CPU 不友好,可能会占用大量 CPU 时间去处理过期键。

实际上,Redis 用的是一种折中的策略:每秒进行 10 次过期键的检查,每次随机检查一些设置了过期时间的键,删除其中已过期的。

2. 惰性删除(被动删除)

想象 Redis 现在变成了一个懒惰的图书管理员。

  • 工作原理:Redis 不主动删除过期键,只有当你尝试访问一个键的时候,才会检查它是否过期,如果过期了就删除。
  • 比喻:图书管理员不主动检查书的借阅期。只有当有人来借书时,他才会检查这本书是否已经过期,如果过期了就将其下架。
  • 优点:CPU 友好,不会浪费 CPU 时间去检查未被使用的过期键。
  • 缺点:内存不友好,过期的键可能会在很长一段时间内占用内存。

3. 内存淘汰(内存不足时的被动删除)

想象 Redis 是一个书架空间有限的图书馆管理员。

  • 工作原理:当 Redis 的内存不足以容纳新的数据时,会根据选定的淘汰策略来删除一些键,为新数据腾出空间。
  • 比喻:当书架快满时,图书管理员会根据某种规则(比如最少使用、最近最少使用等)来决定哪些书要被移除,以便放入新书。

Redis 提供了几种内存淘汰策略:

a) noeviction:不淘汰任何数据,当内存不足时直接报错。

比喻:书架满了就不再接受新书,并告诉借书人"对不起,没位置了"。

b) allkeys-lru:从所有键中驱逐使用频率最少的键。

比喻:移除最长时间没人看过的书。

c) volatile-lru:从设置了过期时间的键中驱逐使用频率最少的键。

比喻:只在有"借阅期限"的书中,移除最长时间没人看过的书。

d) allkeys-random:随机驱逐键。

比喻:随机选择书本移除。

e) volatile-random:从设置了过期时间的键中随机驱逐。

比喻:在有"借阅期限"的书中随机选择移除。

f) volatile-ttl:驱逐快要过期的键。

比喻:优先移除快到"借阅期限"的书。

g) volatile-lfu 和 allkeys-lfu(Redis 4.0 新增):驱逐使用频率最低的键。

比喻:移除借阅次数最少的书。

实际应用中,Redis 会综合使用这些策略。定时删除和惰性删除是主要的过期键处理方式,而内存淘汰策略则是在内存紧张时的一种补充措施。选择合适的策略需要根据实际应用场景和需求来权衡。


缓存问题及它们的解决方案

1. 缓存击穿(Cache Penetration)

概念
缓存击穿指的是对于一个特定的高频热点key,在缓存过期的一刻,同时有大量的请求到达,这些请求同时发现缓存过期,于是同时去数据库中查询数据,导致数据库瞬间压力剧增。

比喻
想象一个热门商品在电商平台上的缓存刚好过期,而此时正值促销高峰,大量用户同时刷新页面,导致所有请求都直接冲向数据库。

解决方案

a) 互斥锁(Mutex Key)
   - 原理:第一个请求获取锁并从数据库加载数据,其他请求等待。
   - 实现:使用Redis的SetNX命令,成功设置则获取锁。
   - 优点:简单有效,保证只有一个请求会穿透到数据库。
   - 缺点:可能会造成某些请求的等待时间较长。

b) 设置热点数据永不过期
   - 原理:对于某些特别热点的数据,设置一个较长的过期时间或干脃不设置过期时间。
   - 实现:定期异步更新这些热点数据。
   - 优点:能有效防止缓存击穿。
   - 缺点:维护成本较高,需要额外的更新机制。

c) 提前更新缓存
   - 原理:在缓存即将过期前,异步更新缓存。
   - 实现:设置一个缓存刷新线程,检测即将过期的key并提前更新。
   - 优点:能有效避免缓存过期瞬间的压力。
   - 缺点:实现相对复杂,需要额外的系统资源。

2. 缓存雪崩(Cache Avalanche)

概念
缓存雪崩指的是大量缓存数据在同一时间集中过期,或者缓存服务器宕机,导致大量请求直接落到数据库上,引起数据库压力骤增,可能导致整个系统崩溃。

比喻
想象一场大型促销活动结束,所有商品的缓存同时失效,或者Redis服务器突然宕机,导致所有的请求如雪崩般冲向数据库。

解决方案

a) 均匀分布过期时间
   - 原理:在设置缓存过期时间时加入一个随机值,避免大量缓存同时过期。
   - 实现:过期时间 = 基础过期时间 + random(0, 300秒)
   - 优点:简单有效,易于实现。
   - 缺点:可能会稍微增加缓存不一致的概率。

b) 构建高可用的缓存集群
   - 原理:使用Redis Cluster或者哨兵模式,确保缓存系统的高可用性。
   - 实现:配置主从复制,并使用哨兵监控和自动故障转移。
   - 优点:大大提高系统的可用性和稳定性。
   - 缺点:增加了系统复杂度和维护成本。

c) 设置多级缓存
   - 原理:在Redis之上再增加一层本地缓存(如Guava Cache)。
   - 实现:请求首先访问本地缓存,miss后再访问Redis。
   - 优点:即使Redis完全不可用,系统仍能提供部分服务。
   - 缺点:增加了系统复杂度,且可能带来数据一致性问题。

d) 熔断降级机制
   - 原理:当检测到缓存服务不可用时,暂时屏蔽部分非核心功能,只提供最基本的服务。
   - 实现:使用类似Hystrix这样的熔断框架。
   - 优点:能够保护系统核心功能,防止整体崩溃。
   - 缺点:会暂时降低用户体验。

e) 预加载热点数据
   - 原理:系统启动时或者定时任务中提前加载热点数据到缓存。
   - 实现:编写脚本或定时任务,定期刷新热点数据的缓存。
   - 优点:可以有效减少缓存雪崩的影响范围。
   - 缺点:需要额外的维护成本,且可能会占用更多的缓存空间。

在实际应用中,通常会综合使用多种策略来防范缓存击穿和缓存雪崩。选择哪种方案或组合要根据具体的业务场景、系统架构和性能需求来决定。同时,良好的监控和告警机制也是必不可少的,可以帮助我们及时发现并解决问题。

3. 缓存失效( Cache Invalidation)

1. 避免缓存失效

a) 定时刷新策略

  • 原理:定期更新缓存中的数据,不依赖于单个数据变更。
  • 优点:简单可靠,适合变更频率较低的数据。
  • 缺点:可能存在短暂的数据不一致。

b) 基于消息队列的实时更新

  • 原理:数据变更时发送消息,专门的服务消费消息并更新缓存。
  • 优点:实时性高,系统解耦。
  • 缺点:需要额外的消息中间件,增加系统复杂度。

c) 双写一致性(Write-Behind)

  • 原理:更新数据时同时更新缓存和数据库,通过异步队列保证最终一致性。
  • 优点:保证缓存和数据库的最终一致性。
  • 缺点:实现复杂,需要处理各种异常情况。

2. 缓存监测方法

a) 健康检查

  • 原理:定期检查缓存服务的可用性和响应时间。
  • 作用:及时发现缓存服务的异常。

b) 缓存命中率监控

  • 原理:统计缓存的命中次数和未命中次数,计算命中率。
  • 作用:评估缓存效率,指导缓存策略优化。

c) 过期键监控

  • 原理:监控即将过期或已过期的键数量。
  • 作用:预防大规模缓存失效,避免缓存雪崩。

d) 内存使用监控

  • 原理:监控Redis的内存使用情况。
  • 作用:防止内存溢出,指导容量规划。

e) 慢查询日志分析

  • 原理:分析Redis的慢查询日志,找出性能瓶颈。
  • 作用:优化缓存查询性能,改进缓存策略。

参考

Redis Cache - GeeksforGeeks

【趣话Redis第一弹】我是Redis,MySQL大哥被我坑惨了!_哔哩哔哩_bilibili

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

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

相关文章

【有为己之心方能克己】

私欲会让人难受,为了自己舒服而去拔除,去除私欲小我,就可以为自己展现大我 “人不为己天诛地灭”,其实这句话不是自私自利的意思, 原意是:人如果不修为自己,不为那个真己而活,不活出…

【设计模式】【行为型模式】【责任链模式】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…

Java 微信小程序自建平台开发票保存到微信卡包

Java 微信小程序自建平台开发票保存到微信卡包 1 获取Access token2 获取自身的开票平台识别码3 设置商户联系方式4 获取授权页ticket5 获取授权页链接6 小程序打开授权页7 收取授权完成事件推送8 创建发票卡券模板9 上传PDF10 将电子发票卡券插入用户卡包 1 获取Access token …

分文件编译(简单学生系统)

定义学生基本信息 ①输出所有学生信息 ②删除某个学生后,输出所有学生信息 ③修改某个学生信息后,输出所有学生信息 ④查找某个学生的信息 main.c #include"k11*.h" int main(int argc, const char *argv[]) {struct student p[4]{{"…

3.js - 纹理的 magfilter、minFilter、各向异性过滤(各项异性解决倾斜模糊问题)

效果图,就是一个PlaneGeometry,加了一个贴图,再设置下面这些属性,你就放大缩小着看吧,反正我看不出什么来 代码 // ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitContro…

Open3D 删除点云中重复的点

目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份   构造重叠区域   合并点云获得重叠点 2、主要…

产品设计的8大步骤

产品设计,通俗来说就是将创新想法或概念转化为落地实体的过程。一般来说,一个成功的产品应当具有创新性、美观性、实用性、可持续性以及经济效益,从而满足用户的使用需求以及市场的发展需求。产品设计也并不是一件简单的事情,产品…

医院挂号系统:基于JSP和MySQL的现代化医疗预约平台

开头语:您好,我是专注于医疗系统开发的IT学长。如果您对医院挂号系统感兴趣,欢迎联系我。 开发语言:Java 数据库:MySQL 技术:JSP技术,B/S架构 工具:Eclipse,MyEclips…

最新CRMEB商城多商户java版源码v1.6版本+前端uniapp

CRMEB 开源商城系统Java版,基于JavaVueUni-app开发,在微信公众号、小程序、H5移动端都能使用,代码全开源无加密,独立部署,二开很方便,还支持免费商用,能满足企业新零售、分销推广、拼团、砍价、…

[方法] 为Cinemachine添加碰撞器

选中场景中的Cinemachine物体,在 Inspector 面板的最下方单击 Add Extension 下拉框,选择 CinemachineCollider。 之后在添加的碰撞器组件中选择要与之碰撞的层(Collide Against)和忽略的层(Transparent Layers&#x…

非静压模型SWASH学习(8)——三维孤立波在锥形岛屿上的爬坡过程(Runup of solitary waves on a conical island)

三维孤立波在锥形岛屿上的爬坡过程(Runup of solitary waves on a conical island) 算例简介模型配置网格及参数设置网格与地形初始条件与边界条件数值求解方法输出设置模拟时间 波浪(孤立波)入射边界的时间序列.bnd文件模拟结果注…

机械设备制造企业MES系统解决方案介绍

机械设备制造行业涵盖了各类工业设备、工程机械、农业机械等多个领域,对生产精度、质量控制和效率提出了较高要求。为了提升生产效率、保证产品质量并满足客户需求,越来越多的机械设备制造企业引入了MES系统。本文将详细介绍MES系统在机械设备制造行业的…

5.Android逆向协议-初识HTTP和HTTPS协议

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:微尘网校 上一个内容:4.Android逆向协议-详解二次打包失败解决方案 从现在开始正式进入协议分析了。 首先客户端与服务端之…

Docker 一篇到位

目录 01. Docker使用导航 02. Build Share Run 样例 03. 理解容器 04. 安装 Docker 05. Docker 样例(常见命令使用) 下载镜像 启动容器 修改页面 保存镜像 docker commit docker save docker load 分享社区 docker login docker tag do…

MySQL 9.0 发布了!

从昨晚开始,在DBA群里大家就在讨论MySQL 9.0发布的事情,但是Release Note和官方文档都没有更新,所以今天早上一上班就赶紧瞅了下具体更新了哪些内容? 整体看来,基本没什么创新。下面是9.0新增或废弃的一些特性。 &…

【Qt知识】Geometry属性

一、走进Geometry的世界 Geometry属性是Qt框架中用于处理和操作几何形状的一系列类的集合。它包括了QPoint、QPointF、QSize、QSizeF、QRect和QRectF等。这些类分别代表点、大小、矩形等基本几何概念,它们的存在让图形界面的创建变得既简单又直观。 位置和尺寸。 其…

如何获取音频伴奏

如何获取音频伴奏 在今天的互联网上,有许多好听的音乐.面对这些音乐,我们有时需要伴奏音频,许多音频在网站上可以查找到,但有些不行,今天,我们要通过audacity软件截取音频伴奏. 下载audacity软件 audacity-64.exe 访问密码:8221 或官方网站(访问较慢) 选择简体…

Modbus TCP与TCP/IP协议间的差异与应用场景

Modbus TCP概述 Modbus协议简介 Modbus是一种专为工业自动化系统设计的通信协议,采用主从模式,即一个主设备(通常是计算机或可编程逻辑控制器)与多个从设备(如传感器、执行器等)进行通信。Modbus协议具有…

(漏洞检查项) | 任意文件包含漏洞 file-include

(漏洞检查项)|任意文件包含漏洞 file-include 漏洞场景 1.含有动态包含语句 2.有类似于文件读取的url 漏洞描述 攻击者可以利用任意文件包含漏洞,读取任意文件,对服务器造成危害。 程序开发人员为了代码的灵活性,常常会将包含文件的路径…

Spring Cloud Circuit Breaker基础入门与服务熔断

官网地址&#xff1a;https://spring.io/projects/spring-cloud-circuitbreaker#overview 本文SpringCloud版本为&#xff1a; <spring.boot.version>3.1.7</spring.boot.version> <spring.cloud.version>2022.0.4</spring.cloud.version>【1】Circu…