当前位置: 首页 > article >正文

详解Redis相关缓存问题

目录

缓存更新策略

定期⽣成

实时⽣成

缓存淘汰策略

Redis内置缓存淘汰策略

缓存预热

缓存穿透

缓存雪崩

缓存击穿


缓存更新策略
定期⽣成

每隔⼀定的周期(⽐如⼀天/⼀周/⼀个⽉), 对于访问的数据频次进⾏统计. 挑选出访问频次最⾼的前 %N的数据.

实时⽣成

先给缓存设定容量上限(可以通过 Redis 配置⽂件的 maxmemory 参数设定).
接下来把⽤⼾每次查询:
• 如果在 Redis 查到了, 就直接返回.
• 如果 Redis 中不存在, 就从数据库查, 把查到的结果同时也写⼊ Redis.

如果缓存已经满了(达到上限), 就触发缓存淘汰策略, 把⼀些 "相对不那么热⻔" 的数据淘汰掉.
按照上述过程, 持续⼀段时间之后 Redis 内部的数据⾃然就是 "热⻔数据" 了.

缓存淘汰策略

FIFO (First In First Out) 先进先出
把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉.

LRU (Least Recently Used) 淘汰最久未使⽤的
记录每个 key 的最近访问时间. 把最近访问时间最⽼的 key 淘汰掉.

LFU (Least Frequently Used) 淘汰访问次数最少的
记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉.

Random 随机淘汰
从所有的 key 中抽取幸运⼉被随机淘汰掉.

Redis内置缓存淘汰策略

Redis 内置的淘汰策略如下:

• volatile-lru 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中使⽤LRU(最近最
少使⽤)算法进⾏淘汰
• allkeys-lru 当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LRU(最近最少使⽤)算法进⾏淘汰.
• volatile-lfu 4.0版本新增,当内存不⾜以容纳新写⼊数据时,在过期的key中,使⽤LFU算法
进⾏删除key.
• allkeys-lfu 4.0版本新增,当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LFU算法进⾏
淘汰.
• volatile-random 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中,随机淘汰数
据.
• allkeys-random 当内存不⾜以容纳新写⼊数据时,从所有key中随机淘汰数据.
• volatile-ttl 在设置了过期时间的key中,根据过期时间进⾏淘汰,越早过期的优先被淘汰.
(相当于 FIFO, 只不过是局限于过期的 key)
• noeviction 默认策略,当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错.

缓存预热

定义

缓存预热是指在系统启动之前或系统达到高峰期之前,通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程。

目的

尽可能地避免缓存击穿和缓存雪崩。
减轻后端存储系统的负载,提高系统的响应速度和吞吐量。
减少冷启动影响,即系统重启或新启动时,避免首次请求处理缓慢。
提高数据访问速度,确保数据快速可用。
平滑流量峰值,帮助系统更好地处理高流量。
保证数据的时效性,特别是对于高度依赖于实时数据的系统。

预热方法

系统启动时加载:在系统启动时,将常用的数据加载到缓存中。
定时任务加载:定时执行任务,将常用的数据加载到缓存中,以保持数据的实时性和准确性。
手动触发加载:在系统达到高峰期之前,手动触发加载常用数据到缓存中。
用时加载:在用户请求到来时,根据用户的访问模式和业务需求,动态地将数据加载到缓存中。
缓存加载器:一些缓存框架提供了缓存加载器的机制,可以在缓存中不存在数据时,自动调用加载器加载数据到缓存中。

缓存穿透

定义

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。

产生原因

恶意攻击:攻击者故意查询不存在的数据,以此来消耗系统资源。
频繁查询不存在的数据:系统中的业务逻辑错误或设计不合理,导致频繁查询不存在的数据。

解决方案

对查询结果为null的数据进行缓存,设定短时限,例如30~60秒,最高5分钟,并定期进行清理。
使用布隆过滤器,通过哈希思想快速判断一个数据是否存在于集合中,从而避免无效的查询。
对URL中的key id值进行对称加密,防止黑客攻击。

缓存雪崩

定义

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。

产生原因

Redis宕机。
采用了相同的过期时间,导致大量缓存同时失效。

解决方案

给不同的Key的TTL(Time To Live)添加随机值,避免大量缓存同时失效。
利用Redis集群提高服务的可用性。
给缓存业务添加降级限流策略。
给业务添加多级缓存。

缓存击穿

定义

缓存击穿是指一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。

产生原因

某个热点的key失效了,此时有大量请求同时访问该数据。
并发查询:多个请求同时查询一个数据,导致缓存未命中,请求直接访问数据库。

解决方案

使用互斥锁:当缓存数据为空时,使用互斥锁保证只有一个线程可以访问数据库,其他线程等待该线程查询数据库并将结果写入缓存。
使用布隆过滤器快速判断一个key是否存在于缓存中,从而避免无效的查询。
预加载:在缓存中设置短暂的过期时间,当缓存数据即将过期时,提前异步更新缓存。


http://www.kler.cn/news/368349.html

相关文章:

  • iPhone SE 4:定了
  • 对角双差速轮AGV平移、直行、转弯、原地旋转案例
  • 【STM32】单片机ADC原理详解及应用编程
  • qt EventFilter用途详解
  • 简化深度学习实验管理:批量训练和自动记录方案
  • 【C++】抱C++中的函数式编程:使用`std::function`和Lambda表达式简化代码
  • Java中的反射(2)——调用构造方法和获取继承关系
  • shodan搜索引擎——土豆片的网安之路
  • <项目代码>YOLOv8路面病害识别<目标检测>
  • python中使用pymobiledevice3与手机交互(一)获取udid
  • 【C++】函数的返回、重载以及匹配、函数指针
  • 线程池(重要)
  • 位运算算法及习题 ,丢弃的数字 , 两整数之和 ,只出现一次的数字II
  • Java 线程池:深入理解与高效应用
  • C语言 | Leetcode C语言题解之第515题在每个树行中找最大值
  • 《Knowledge Graph Enhanced Multimodal Transformer for Image-Text Retrieval》中文校对版
  • NtripShare Cloud平台之CORS服务之基准站RTCM坐标编辑
  • Apache paino DML操作实战
  • Python数据分析——Numpy
  • Git快速上手
  • Java实现 itext PDF文件打印水印(文字和图片水印)
  • Vue前端开发:双向数据绑定之v-model与修饰符
  • 基于STM32的水产品运输监测系统设计与实现
  • 湖南(满意度调查)源点咨询 市场调研中定量调研方式的运用技巧
  • 使用ceph-csi把ceph-fs做为k8s的storageclass使用
  • 基于vite和vue3、 eslint、prettier、stylelint、husky规范