Redis 过期策略和内存淘汰机制
目录
- Redis 过期策略和内存淘汰机制
- 过期策略
- 淘汰过期 key 方式
- 内存淘汰机制
- 参考
Redis 过期策略和内存淘汰机制
众所周知,redis 是一个基于内存的,能够持久化到硬盘的缓存数据库,所以 redis 缓存服务器会配置较高的内存资源
一般而言,缓存总量小于数据总量,但如果对缓存数据不管不顾,内存资源总会有耗尽的时候,而为了节约成本,不能一直增加服务器的内存。因此在有限的资源下,为了支撑更多的业务,就必须将访问频率不高的缓存删掉,为新的缓存腾出内存空间
Redis 主要通过两种方式相互配合实现 key 的清理,即:过期策略和内存淘汰机制
过期策略
Redis 通过 Expire
命令设置 key
的过期时间,设置过期时间后, key 会被自动删除。通常称带有过期时间的 key 为易失的 (volatile);过期时间的 key,可以调用 EXPIPE
重新设置
过期时间计算
key
的过期时间以绝对 Unix
时间戳的方式存储,也就是无论 Redis 是否进行,过期时间都会流逝。即要求服务器的时间必须准确,否则但两个时间相差较多的机器之间移动 RDB 文件,那么可能会出现所有的 key 在加载的时候都过期。
测试:运行的 Redis 会不停检查服务器的时间,如果设置一个带有 1k 秒过期时间的 key,然后把服务器的时间向前调 2k 秒,那么这个 key 就会立刻过期,而不是等待 1k 秒后过期
淘汰过期 key 方式
被动方式
在用户访问某个 key 的时候,Redis 会检测 key 是否过期,如果没有过期,则返回给用户;过期则删除 key。也就是等 key 被访问才会知道是否过期,这种方式对于那些永远不会再次访问的 key 没有效果,所以 Redis 还会周期性主动随机检测一部分被设置过期时间的 key,将已经过期的 key 从 key 空间删除
主动方式
Redis 每秒会执行10次以下操作:
- 从带有过期时间的 key 集合中随机选 20 进行检查
- 删除所有过期的 key
- 如果里面超过 25% 的 key 过期,立刻继续执行步骤 1
一种狭义概率算法,假设选出来的样本 key 代表整个 key 空间,会一直执行过期检查直到 key 的比例降到 25% 以下;意味着在任意时刻已经过期但还占用内存 key 的数量,最多等于每秒最多写操作的 1/4
内存淘汰机制
Redis 的内存一般会根据 “八二原理” 进行配置,即80%的请求访问了20%的数据,将 Redis 内存大小设置为数据总量的20%。当然,对于不同的业务场景会有不一样的配置
当 redis 节点分配的内存使用到达最大值,Redis 会启动内存淘汰策略,Redis 4.0 之前主要是以下六种策略:
- noenviction:不清除数据,只是返回错误,这样会导致浪费掉更多的内存,对大多数写命令(DEL 命令和其他的少数命令例外)
- allkeys-lru:从所有的数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰,以供新数据使用
- volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰,以供新数据使用
- allkeys-random:从所有数据集(server.db[i].dict)中任意选择数据淘汰,以供新数据使用
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰,以供新数据使用
- volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰,以供新数据使用
Redis 4.0 新增了两种 LFU 淘汰策略:
- allkeys-lfu,淘汰整个键值中最少使用的键值,这也就是我们常说的LRU算法。
- volatile-lfu,淘汰所有设置了过期时间的键值中最少使用的键值。
LRU(Least Recently Used,最近最少使用),根据最近被使用的时间,离当前最远的数据优先被淘汰;在使用内存作为缓存的时候,缓存的大小一般是固定的。当缓存被占满,这个时候继续往缓存里面添加数据,就需要淘汰一部分老的数据,释放内存空间用来存储新的数据。这个时候就可以使用LRU算法了。其核心思想是:如果一个数据在最近一段时间没有被用到,那么将来被使用到的可能性也很小,所以就可以被淘汰掉
LFU(Least Frequently Used,最不经常使用),在一段时间内,缓存数据被使用次数最少的会被淘汰;根据key的最近被访问的频率进行淘汰,很少被访问的优先被淘汰,被访问的多的则被留下来
普适经验规则:
- 如果期望用户请求呈现幂律分布(power-law distribution),也就是,期望一部分子集元素被访问得远比其他元素多时,可以使用allkeys-lru策略。在你不确定时这是一个好的选择
- 如果期望是循环周期的访问,所有的键被连续扫描,或者期望请求符合平均分布(每个元素以相同的概率被访问),可以使用allkeys-random策略
- 如果你期望能让 Redis 通过使用你创建缓存对象的时候设置的TTL值,确定哪些对象应该是较好的清除候选项,可以使用volatile-ttl策略
- 当你想使用单个Redis实例来实现缓存和持久化一些键,allkeys-lru和volatile-random策略会很有用,但通常最好是运行两个Redis实例来解决这个问题
参考
[1] EXPIRE key seconds
[2] 使用Redis作为LRU缓存
Redis 过期策略和内存淘汰机制相关推荐
- Redis过期策略与内存淘汰机制
参考博客:https://blog.csdn.net/u010006156/article/details/124914082 Redis过期策略与内存淘汰机制 过期策略简介 作用 redis数据都是 ...
- @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...
大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...
- redis过期策略和内存淘汰机制
Redis的过期策略 1 定时过期 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据,对内存很友好:但是会占用大量的CPU资源去处理过期的数据,从而影 ...
- java 过期策略实现_Redis过期策略和内存淘汰机制
Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位作为秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制. 大家都知道,Re ...
- Redis的过期策略以及内存淘汰机制
Redis的过期策略以及内存淘汰机制 我们知道,redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样删除过期数据的?删除过期数据的策略是什么? ...
- 【带你重拾Redis】Redis过期策略 和 内存淘汰策略(key回收)
过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效. 如果假设你设置一个一批key只能存活1个小 ...
- stringredistemplate设置过期时间_Redis的过期删除策略和内存淘汰机制
Redis的key可以设置过期时间,那是否意味着时间一到就会马上被删除呢? Redis的数据存储大小是有限的,假如内存不足Redis有什么应对策略呢? 本篇文章将介绍一下Redis的过期策略和内存淘汰 ...
- Redis 过期键删除策略、内存淘汰机制
文章目录 过期键删除策略 定时删除 惰性删除 定期删除 Redis的选择 内存淘汰机制 redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样怎 ...
- redis同步效率秒_redis过期策略、内存淘汰策略、持久化方式、主从复制
一.Redis的过期策略以及内存淘汰策略: 1.过期策略:定期删除+惰性删除: ①定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除.注意这里 ...
- Redis基础(五)——删除策略和内存淘汰机制
文章目录 删除策略和内存淘汰机制 1 删除策略 1.1 定时删除 1.2 惰性删除 1.3 定期删除 2 内存淘汰机制 删除策略和内存淘汰机制 1 删除策略 Redis是一个内存级数据库,内存中的数据 ...
最新文章
- c++11 之模板定义别名(using)
- python readline_python文件读read()、readline()、readlines()对比
- Web测试与APP测试有哪些异同?
- Redis学习手册(实例代码)
- jQuery的HTML与CSS方法
- 小米刷第三方recovery_小米平板4/Plus LTE版本开启电话功能
- 埃及分数问题+迭代加深搜索
- 拓端tecdat|Prophet在R语言中进行时间序列数据预测
- 8848Android 版本,【8848钛金手机M5评测】拍照配置保持Android阵容顶配堆积_8848 钛金手机M5_手机评测-中关村在线...
- 应聘计算机程序员英文,计算机程序员英文简历模板
- matlab 关联矩阵,(案例)利用Matlab实践关联矩阵与邻接矩阵的转换
- 微信小程序登录注册界面
- oracle ap tp是什么,AP模式和Router模式区别是什么
- 使用OpenCV实现运动背景的重建
- 剑与家园服务器信息,《剑与家园》合服规则公示
- 数字格式化、大数据BigDecimal、随机数生成方法random()
- 2019TFE计算机科学排名,2019TFE Times 硕士专业排名
- 数据库安全性控制(授权:授予与收回)
- java 做日历_java编程实现日历
- STM32、NBIOT、Lora模块烧写方法-Hex文件烧录步骤详解-新大陆物联网设备-NEWLab开发板