缓存有效期与淘汰策略

有效期 TTL (Time to live)

设置有效期的作用:

  1. 节省空间
  2. 做到数据弱一致性,有效期失效后,可以保证数据的一致性

Redis的过期策略

过期策略通常有以下三种:

  • 定时过期

    每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

      setex('a', 300, 'aval')   setex('b', 600, 'bval') 
  • 惰性过期

    只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

  • 定期过期

    每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

    expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。

Redis中同时使用了惰性过期和定期过期两种过期策略。

Redis过期删除采用的是定期删除,默认是每100ms检测一次,遇到过期的key则进行删除,这里的检测并不是顺序检测,而是随机检测。那这样会不会有漏网之鱼?显然Redis也考虑到了这一点,当我们去读/写一个已经过期的key时,会触发Redis的惰性删除策略,直接回干掉过期的key

为什么不用定时删除策略?

定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.

定期删除+惰性删除是如何工作的呢?

定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。

于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。

采用定期删除+惰性删除就没其他问题了么?

不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。

缓存淘汰 eviction

Redis自身实现了缓存淘汰

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

redis 4.x 后支持LFU策略,最少频率使用

  • allkeys-lfu

  • volatile-lfu

LRU

LRU(Least recently used,最近最少使用)

LRU算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

基本思路

  1. 新数据插入到列表头部;

  2. 每当缓存命中(即缓存数据被访问),则将数据移到列表头部;

  3. 当列表满的时候,将列表尾部的数据丢弃。

LFU

LFU(Least Frequently Used 最近最少使用算法)

它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。

LFU需要定期衰减。不然有一些数据会倚老卖老

Redis淘汰策略的配置

  • maxmemory 最大使用内存数量

  • maxmemory-policy noeviction 淘汰策略

转载于:https://www.cnblogs.com/LiuXinyu12378/p/11328598.html

缓存的有效期和淘汰策略【Redis和其他缓存】【刘新宇】相关推荐

  1. 缓存模式【缓存使用几种模式】【刘新宇】

    缓存模式 1) Cache Aside 更新方式 先更新数据库,再更新缓存.这种做法最大的问题就是两个并发的写操作导致脏数据.如下图(以Redis和Mysql为例),两个并发更新操作,数据库先更新的反 ...

  2. 什么是缓存穿透和缓存雪崩?【缓存问题】【刘新宇】

    缓存问题 1 缓存穿透 缓存只是为了缓解数据库压力而添加的一层保护层,当从缓存中查询不到我们需要的数据就要去数据库中查询了.如果被黑客利用,频繁去访问缓存中没有的数据,那么缓存就失去了存在的意义,瞬间 ...

  3. Redis缓存过期和淘汰策略

    题记: 文章内容输出来源:拉勾教育Java高薪训练营. 本篇文章是 Redis 学习课程中的一部分笔记. Redis缓存过期和淘汰策略 Redis性能高: 官方数据 读:110000次/s 写:810 ...

  4. redis缓存的雪崩、击穿、穿透,淘汰策略,持久化

    1.redis缓存的雪崩.击穿.穿透,在实际中如何处理? 雪崩:缓存不存在,数据库存在,高并发,大量的key 原因:大量数据同时过期,Redis宕机 解决方案:给缓存数据的过期时间上加上小的随机数,避 ...

  5. Redis的持久化机制、过期策略、淘汰策略

    文章目录 一.持久化机制 1. RDB机制 2. AOF机制 RDB的优缺点 AOF的优缺点 持久化机制选择 二.过期策略 常见过期策略 Redis过期策略 1. 定期删除 2. 惰性删除 RDB对过 ...

  6. Redis 过期策略和淘汰策略

    1.Redis 过期策略 Redis 过期策略用于处理设置了缓存时间的数据,使用定时扫描和惰性删除机制删除到期的缓存数据. Redis 将设置了过期时间的 key 保存在一个独立的字典中,定时扫描就是 ...

  7. 【2020尚硅谷Java大厂面试题第三季 04】Redis 9种数据类型使用场景,分布式锁演变步骤,lua脚本,redis事务,Redisson,Redis内存占用,删除策略,内存淘汰策略,手写LRU

    1.安装redis6.0.8 2023 02 02 为:redis-7.0.8.tar.gz 2.redis传统五大数据类型的落地应用 3.知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的 ...

  8. Redis的内存回收机制和数据过期淘汰策略

    本文来说下Redis的内存回收机制和数据过期淘汰策略 文章目录 概述 为什么需要内存回收 过期删除策略 定时删除 惰性删除 定期删除 删除策略比对 过期删除策略原理 redisDb结构体定义 expi ...

  9. 广义表head tail 运算_双链表实现LRU缓存淘汰策略

    1.背景 LRU(Least Recently Used)是一种常用的缓存淘汰策略,即当缓存满了之后,删除最近最少使用的数据. LRU的实现,常用的编程语言在语言层面都有实现,可以直接使用.为了深入理 ...

最新文章

  1. ssl 接收到一个超出最大准许长度的记录_我所经历的一次Dubbo服务雪崩,这是一个漫长的故事...
  2. 利用python模块paramiko在CentOS 6.3 64上搭建SFTP环境
  3. UIScrollView属性和用法
  4. 【Python之旅】第七篇(二):Redis使用基础
  5. Android init.rc文件解析过程详解(二)
  6. openssl 添加自定义算法_GitHub:用PyTorch实现17种深度强化学习算法
  7. Centerface:开源实用的边缘设备无锚人脸检测与对齐算法
  8. ssms安装_SQLServer 2019下载及安装教程
  9. socket编程-客户端向服务器发送字符串,传文件
  10. 通用html解析器,razor-从外部存储的.cshtml解析Rarzor HTML帮助器
  11. 最全最新cpu显卡天梯图_2018 年新近详细CPU、显卡天梯图
  12. 深圳大学本科毕业论文答辩PPT模板
  13. 超级实习生计划项目练习——JavaScript 利用Ajax制作一个汇率转换器
  14. 平面设计师okr_掌握OKR工作法,教你快速提升工作效率
  15. 初探flask debug生成pin码
  16. 学习笔记 | 演化简单的程序用于玩 Atari 游戏
  17. WeBRTC IOS视频采集流程
  18. Cannot run code from this file in conjunction with non encoded files
  19. [网站建设] 深度解析搜索引擎的原理结构
  20. oracle数据库设计思维导图,Oracle

热门文章

  1. 微信小程序中引入ttf字体
  2. 自己搭建IOC容器(C#)(二)实现Ioc容器基本功能
  3. 查看mysql最大连接数_Mysql查看最大连接数和修改最大连接数
  4. 高德地图--- 会动的小汽车(行动轨迹回放)demo效果(整理)
  5. 合创视觉科技交互设计学的是什么东西?
  6. 2023江西理工大学考研择校
  7. 人工智能-浅谈人工智能
  8. 改善开发人员的工作环境-仅分三个阶段
  9. Bean named XXX is expected to be of type XXX but was actually of type 'com.sun.proxy.$Proxy28'
  10. 每次都戳到我的笑点,那个不同寻常的自黑达人,雷军