redis过期策略

Redis的key有过期策略,包括noeviction、allkeys-lru、volatile-lru、allkeys-random、volatile-random和volatile-ttl。默认策略是volatile-lru。 Redis3.0的LRU使用候选池提高性能。内存和过期策略可通过config命令设置和查看,例如设置最大内存、选择过期策略等。


一、redis的key有六种过期策略

1、noeviction:一旦内存满则返回错误

2、allkeys-lru:对所有的key进行LRU

3、volatile-lru:只对设置了过期的key进行LRU(默认的方式)

4、allkeys-random:随机剔除一个key

5、volatile-random:对设置过期的key进行随机剔除一个

6、volatile-ttl:删除即将过期的key

根据官网的描述,redis使用的LRU并非真正的LRU算法,精确度并不高。redis3.0版本的LRU会维持一个候选池,性能会更加好。


二、一些内存和过期策略的设置和查看

1、设置实例的内存大小(本地执行可以不用-h $host,单位是B)

redis-cli -h $host -p $port config set maxmemory 1024 

2、获取实例的内存大小

redis-cli -h $host -p $port config get maxmemory

3、设置过期策略

redis-cli -h $host -p $port config set maxmemory-policy volatile-lru

4、查看过期策略

redis-cli -h $host -p $port config get maxmemory-policy


说明:测试过volatile-lru,确实在满了之后如果有设置了过期时间的key就会执行LRU,可以继续插入。如果没有设置了过期时间的key了就会报错






Redis 提供了丰富的键过期策略和机制,以支持灵活的数据生命周期管理。在 Redis 中,可以通过设置键的生存时间(TTL, Time To Live)来控制键的自动删除行为。一旦键的 TTL 过期,它将被自动从数据库中移除。 ### 键的过期设置 Redis 支持多种方式为键设置过期时间: - **EXPIRE**:以秒为单位设置键的生存时间。 - **PEXPIRE**:以毫秒为单位设置键的生存时间。 - **EXPIREAT**:指定一个绝对时间点(Unix 时间戳,以秒为单位),当到达该时间点时,键将失效。 - **PEXPIREAT**:与 `EXPIREAT` 类似,但以毫秒为单位指定绝对时间点。 例如: ```bash SET mykey "Hello" EXPIRE mykey 60 # 设置键 mykey 的生存时间为 60 秒 ``` ### 键的过期策略 Redis 实现了以下几种主要的过期策略来平衡性能和内存使用: 1. **惰性删除(Lazy Expiration)** Redis 不会主动检查并删除已过期的键,而是等到客户端尝试访问某个键时才检查其是否过期。如果键已经过期,则将其删除并返回空值给客户端。这种策略的优点是节省 CPU 资源,但可能导致过期键长时间驻留在内存中,直到被访问为止。 2. **定期删除(Active Expiration)** Redis 每隔一段时间(默认每 100 毫秒)会随机检查一部分设置了过期时间的键,并删除其中已经过期的键。这一过程是渐进式的,不会一次性扫描所有键,从而避免对性能造成显著影响。这种方式可以在一定程度上减少内存浪费,同时保持系统的响应速度。 3. **混合模式** Redis 实际采用的是惰性删除和定期删除相结合的方式。这样既保证了大部分情况下不会因为检查过期键而消耗过多资源,又能及时清理掉一些长期未被访问但仍过期的键。 ### 过期键的存储结构 为了高效地处理设置了过期时间的键,Redis 使用了一个专门的字典(称为 `expires` 字典)来保存这些键及其对应的过期时间。每个设置了过期时间的键都会在这个字典中有一个条目,键本身仍然存在于主字典中,但其过期时间则记录在 `expires` 字典中。 ### 查看过期时间 用户可以使用以下命令来查询键的过期时间: - **TTL**:返回键的剩余生存时间(以秒为单位)。如果键没有设置过期时间,则返回 `-1`;如果键不存在或已过期,则返回 `-2`。 - **PTTL**:与 `TTL` 类似,但返回值是以毫秒为单位的剩余生存时间。 例如: ```bash TTL mykey ``` ### 复杂度与性能考虑 对于大多数实际应用场景来说,Redis 的键过期机制是非常高效的。然而,在某些极端情况下,比如大量键在同一时间点过期,可能会导致短暂的性能波动。为了避免这种情况,建议合理分布键的过期时间,或者通过程序逻辑引入一定的随机性来分散过期时间。 此外,需要注意的是,当数据量较大且频繁设置过期时间时,定期删除操作可能无法完全覆盖所有过期键,因此系统内存占用可能会有所增加。在这种情况下,可以适当调整 Redis 的配置参数(如 `maxmemory` 和 `maxmemory-policy`)来优化内存使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值