Redis 过期策略详解:从基础到高级 (redis过期策略六种)
Redis 是一个流行的开源、内存数据库,以其高性能和灵活性而闻名。过期策略是 Redis 的一项重要特性,它允许您设置键的有效期,当超过该有效期时,键和相关值将自动从数据库中删除。
过期策略的类型
Redis 提供了六种不同的过期策略:
-
无过期策略
键没有任何过期时间,将永久存在于数据库中。
使用场景:当您需要存储永久数据时,例如用户配置文件或统计信息。
-
定期过期策略
键有一个固定的过期时间,超过该时间后将被删除。
使用场景:当您需要存储临时数据时,例如会话令牌或购物篮内容。
-
空闲过期策略
键有一个空闲过期时间,在该时间段内如果键没有被访问,则将被删除。
使用场景:当您需要存储不经常访问的数据时,例如日志记录或审计信息。
-
驱逐策略
当 Redis 内存不足时,使用驱逐策略来删除过期键。
使用场景:当您需要防止 Redis 因内存耗尽而崩溃时,例如在高流量的情况下。
-
渐进式过期策略
渐进式过期策略将过期键分成多个时间段,并在每个时间段中删除一部分键。
使用场景:当您需要平滑地释放 Redis 内存时,例如在系统负载较低时。
-
随机过期策略
随机过期策略在给定的时间范围内随机删除过期键。
使用场景:当您需要防止攻击者通过猜测过期时间来预测键何时会被删除时。
选择最佳过期策略
选择最佳的过期策略取决于您的具体应用程序需求。
以下是一些准则:
- 无过期策略:用于存储永久数据。
- 定期过期策略:用于存储临时数据,例如会话令牌或购物篮内容。
- 空闲过期策略:用于存储不经常访问的数据,例如日志记录或审计信息。
- 驱逐策略:用于防止 Redis 因内存耗尽而崩溃。
- 渐进式过期策略:用于平滑地释放 Redis 内存。
- 随机过期策略:用于防止攻击者预测键何时会被删除。
配置过期策略
要为键配置过期策略,可以使用以下 Redis 命令:
SET key value EX seconds
其中:
-
key
是键的名称。 -
value
是要存储的值。 -
EX
指定使用定期过期策略。 -
seconds
是要设置的过期时间(以秒为单位)。
例如,要为键
mykey
设置定期过期策略,有效期为 30 秒,可以使用以下命令:
SET mykey myvalue EX 30
管理过期键
Redis 提供了以下命令来管理过期键:
-
EXPIRE key seconds
:为指定的键设置定期过期策略。 -
EXPIREAT key timestamp
:为指定的键设置定期过期策略,并使用 Unix 时间戳指定过期时间。 -
TTL key
:返回指定键的剩余存活时间(以秒为单位)。 -
PERSIST key
:清除指定键的过期策略,使其成为永久键。
结论
过期策略是 Redis 的一项重要特性,可让您控制键和相关值在数据库中的生命周期。通过了解不同的过期策略类型以及如何选择和配置它们,您可以优化 Redis 以满足您的特定应用程序需求。
Redis数据的过期与淘汰
懒惰处理 Redis在get操作时遇到过期的key会进行删除操作。
集中处理 Redis会将设置了过期时间的key放到一个独立的字典里,默认每秒10次过期扫描。扫描方式:
为防止扫描时间过长,扫描时间限制为25ms,开发时应尽量避免大量key同时过期。 从库不会进行过期扫描,主库删除时,会在AOF文件里增加一条del指令,同步到所有从库,从库通过此指令来删除。由于指令的同步存在异步,所以会出现主从数据不一致的情况。
当Redis内存超出物理内存限制时,内存数据会开始和磁盘产生频繁的交换,使得性能急剧下降。为了限制内存的使用,Redis提供参数 maxmemory 来限制最大内存,当内存超出后,会有以下策略( maxmemory-policy )来淘汰key以腾出空间:
由于LRU算法需要消耗大量的额外内存,redis采用一种近似的LRU算法。它给每个 key 增加了一个额外的小字段(24bit),也就是最后一次被访问的时间戳。每次执行写操作时,如果发现内存超出 maxmemory ,就随机采样5个(参数 maxmemory_samples 配置)key,然后淘汰最旧的。如果淘汰之后还是超出,那就继续随机淘汰,直到不超出为止。如果 maxmemory-policy 是volatile-xxx,就从设置过期时间的key里采样,否则就从所有key里采样。 Redis3.0里增加了一个淘汰池,就是一个大小为 maxmemory_samples 的数组。每次淘汰时会将随机出来的key和数组里的key融合,淘汰掉最旧的一个,然后将剩下的较旧的key放到淘汰池里给下个循环用。
redis的删除del在删除一个大对象的时候有可能造成卡顿。为了解决这个问题Redis4.0引入了unlink指令,将这个key的对象引用从Redis内存数据里删除,将删除操作封装成一个任务丢到一个异步队列里。然后有个异步线程会从这个队列里取出任务并执行。 清空操作 flushdb 和 flushall ,在Redis4.0后,在指令后面增加 async ,就也可以像上面一样异步执行。
《Redis深度历险:核心原理和应用实践》
Redis缓存过期机制
一、针对与设置了过期时间的key值 1.(主动)定期删除:定时随机的检查过期的key,如果过期则清理删除 (每秒检查的次数1-500)配置: hz 10 2.(被动)惰性删除:当客户端请求到一个已经过期的key时,redis会检查是否过期并删除 所以,虽然key过期了,但是没被清理的话,还是会占内存的。 二、内存淘汰管理机制Memory Management 当内存占满之后,redis提供缓存淘汰机制。 : maxmemory <bytes> * noeviction:旧缓存永不过期,新缓存设置不了,返回错误 * allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用) * allkeys-random:在所有的缓存中随机删除(不推荐) * volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存 * volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存 * volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的
redis八种淘汰策略是什么
1、noeviction:默认策略,不淘汰数据;大部分写命令都将返回错误(DEL等少数除外)。
2、allkeys-lru:从所有数据中根据 LRU 算法挑选数据淘汰。
3、volatile-lru:从设置了过期时间的数据中根据 LRU 算法挑选数据淘汰 。
4、allkeys-random:从所有数据中随机挑选数据淘汰。
5、volatile-random:从设置了过期时间的数据中随机挑选数据淘汰。
6、volatile-ttl:从设置了过期时间的数据中,挑选越早过期的数据进行删除。
7、allkeys-lfu:从所有数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)。
8、volatile-lfu:从设置了过期时间的数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)。
LRU算法:
LRU(Least Recently Used)最近最少使用。优先淘汰最近未被使用的数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
LRU底层结构是 hash 表 + 双向链表。hash 表用于保证查询操作的时间复杂度是O(1),双向链表用于保证节点插入、节点删除的时间复杂度是O(1)。
单链表可以实现头部插入新节点、尾部删除旧节点的时间复杂度都是O(1),但是对于中间节点时间复杂度是O(n),因为对于中间节点c,我们需要将该节点c移动到头部,此时只知道他的下一个节点,要知道其上一个节点需要遍历整个链表,时间复杂度为O(n)。
LRU GET操作:如果节点存在,则将该节点移动到链表头部,并返回节点值。
LRU PUT操作:
1、节点不存在,则新增节点,并将该节点放到链表头部。
2、节点存在,则更新节点,并将该节点放到链表头部。
若对本页面资源感兴趣,请点击下方或右方图片,注册登录后
搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源
如有其他疑问,请咨询右下角【在线客服】,谢谢支持!
相关文章
- 提升您的视觉传播:发现我们前沿的动态海报生成器如何改变游戏规则 (提升您的视觉能力)
- 告别静态内容!用我们的革命性的动态海报生成器让您的内容脱颖而出 (告别静态内容怎么写)
- 释放您的营销潜力:体验我们的颠覆性的动态海报生成器 (释放您的营销潜力)
- 用我们的动态海报生成器瞬间提升您的社交媒体影响力 (用我们的动态描写句子)
- 小说封面设计变轻松,一键生成个性化封面提升作品竞争力 (小说封面设计教程)
- 释放你的小说创作潜力,一键生成精美封面引爆读者眼球 (释放你的小说在线阅读)
- 无需设计功底,一键生成高质量封面助你打造畅销小说 (无需设计功底的成语)
- 告别封面设计瓶颈,一键生成专业级小说封面助力作品成功 (告别封面设计图片)
- 让你的小说封面不再枯燥,用一键生成功能打造视觉震撼
- 写小说不再为封面烦恼,一键生成定制化封面提升作品档次 (写小说不再为自己而活)
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~