Redis——过期删除键策略和内存淘汰机制

本文介绍Redis中的过期键管理机制,包括设置过期时间的方法、过期键删除策略及内存淘汰机制。Redis采用定期删除与惰性删除相结合的方式管理过期键,并提供了多种内存淘汰策略以应对内存不足的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、设置过期时间

 EXPIRE key seconds  //将key的生存时间设置为ttl秒
 PEXPIRE key milliseconds  //将key的生成时间设置为ttl毫秒
 EXPIREAT key timestamp_s  //将key的过期时间设置为timestamp所代表的的秒数的时间戳
 PEXPIREAT key timestamp_ms  //将key的过期时间设置为timestamp所代表的的毫秒数的时间戳
 TTL key //返回键剩余生存秒数
 PTTL key //返回键剩余生存毫秒数
 PERSIST key //移除键的过期时间

二、过期键删除策略

定时删除

在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

定期删除

每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作

惰性删除

key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。

三、Redis采用的过期策略

定期删除+惰性删除

定期删除: redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。

惰性删除:在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。

四、内存淘汰机制

redis 内存淘汰机制有以下几个:

  • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

策略规则

如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,
将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存
 

Redis是一款高性能的Key-Value存储系统,它提供了多种数据结构丰富的功能,能够满足各种存储需求。在Redis中,内存淘汰是一种非常重要的机制,通过控制内存使用来保证系统的稳定性性能。 内存淘汰是Redis中的一个重要机制,它可以将一部分数据从内存删除,以释放更多的内存空间。在Redis中,内存淘汰一般有几种策略,包括LRU(Least Recently Used)、LFU(Least Frequently Used)、Random等等,而Redis默认的内存淘汰策略是LRU。 但是,在一些场景中,Redis中的数据并不是按照间顺序进行访问的,而是需要在指定的间点过期。为了解决这个问题,Redis还提供了一种特殊的内存淘汰策略——volatile-lruvolatile-ttl。这两种内存淘汰策略的特点是:它们只会淘汰过期数据或者TTL(Time To Live)值到期的数据,而不会淘汰未过期的数据。 在使用这两种策略,需要加上volatile选项,例如指定maxmemory-policy为volatile-lru或volatile-ttl。此Redis会将未过期的数据已经过期但未被删除的数据分别保存在两个不同的哈希表中,内存淘汰只会针对已过期但仍在内存中的数据进行操作。 因此,Redis可以通过特殊的内存淘汰策略来解决不会过期的数据的问题。通过使用可volatile-lruvolatile-ttl两种策略Redis只会淘汰过期的数据,而不会淘汰未过期的数据,从而保证系统的正确性稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值