Redis内存管理

本文详细阐述了为何在Redis中设定过期时间,以及如何通过惰性删除和定期删除策略来管理过期数据。此外,介绍了Redis的内存淘汰策略,包括volatile-lru、volatile-ttl等,以及从库的淘汰过程。

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

为什么要设定过期时间

  1. 内存是有限的,如果所有的对象都不设定过期时间,则很快Redis的内存就会不足。
  2. 在某些业务场景下需要使用到过期时间,例如验证码有效期等操作

Redis如何判断是否到达有效期

image.png

  1. Redis中维护了过期字典,存储在redisDb这个结构中。
  2. 过期字典的Key指向了redis的key
  3. value指向了该key所对应的过期时间,是毫秒级的时间戳

过期数据的删除策略

惰性删除

  1. 仅在用户查询时进行判断key所对应的过期时间是否达到,如果已经达到过期时间则返回空

定期删除

  1. 在过期字典内定期抽取20个key,进行过期时间的判断
  2. 查询出这20个key中已经过期的key,如果已经过期则进行删除。
  3. 如果已经过期的key超出查询key的1/4即5个,则会重复步骤1,继续抽取20个key判断是否删除

内存淘汰策略

为什么需要内存淘汰策略

  1. 即使已经存在过期时间的删除策略,包含惰性删除和定期删除,但是仍会有许多的情况下会导致内存满,当内存满的时候则需要进行内存淘汰。

Redis的内存淘汰策略

  1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
  4. allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
  6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
  7. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰。
  8. allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key。

从库的淘汰策略

  1. 在主库的key过期后,会向所有从库发送del指令
  2. 在读取从库时,如果key过期,会返回null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值