Redis过期策略以及淘汰机制

微信公众号:Java患者
专注Java领域技术分享

redis 过期策略

前言

Redis中可以通过expire设置键的过期,那么Redis又是什么时候删除键的呢?

Redis有三种删除策略:

  • 定时删除:在设置键的过期时间同时,会创建一个定时器,通过设置的时间来执行键的删除操作。

  • 惰性删除:不管设置键的过期时间,只有当每次获取键的同时,检查获取到的键是否已经过期,如果过期就删除该键。

  • 定期删除:每隔一段时间,就对Redis数据库进行一次检查,删除里面过期的键。每次要检查多少个数据库,以及要删除多少个过期的键,由Redis的算法决定。

定时删除

定时删除对内存是比较友好的,毕竟通过定时器删除,可以保证过期就删除不占用多的内存,但是每一个键设置了过期时间就给予一个定时器,这种情况下如果过期键比较多的情况下就很占用CPU。

如果有大量的命令请求到redis服务器,而且服务器当前不缺少内存,那么服务器本应该优先将CPU时间用在处理客户端的七年跪求,但是由于此时有定时器在跑,就会占用CPU在删除过期键上面。

惰性删除

惰性删除策略相对定时删除来看是相反的,程序只会在取出键的时候才会对键进行过期检查,这就可以保证删除过期键的操作只会在获取的时候才会执行,这个策略相对来说不会花费额外的CPU资源,但是如果有一个过期键一直保存在数据库中,而没有获取这个键,这个时候就会对内存造成浪费,没有获取就不会进行资源释放。

定期删除

键的定时删除会在Redis的周期性执行任务(serverCron)中执行,默认 每100ms执行一次。

首先会依次遍历每个db,然后针对每个db,每次循环随机选择20个key来判断是否过期,如果一轮所选择的key少于25%过期,则终止迭次。此外在迭代过程中如果超过了一定的时间限制则终止过期删除的任务。

淘汰机制

Redis中不同位数操作系统中最大占用内存不同,在64位的操作系统中,Redis不限制占用内存,在32位系统中最大占用内存为3GB。也可以通过配置文件修改。

# maxmemory <bytes>

当Redis的内存快耗尽的时候,Redis会启动内存淘汰机制,将部分key清理以腾出内存。

redis中提供了8种淘汰策略,也可以在配置中配置。

# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
# Both LRU, LFU and volatile-ttl are implemented using approximated
# randomized algorithms.
#
# Note: with any of the above policies, Redis will return an error on write
#       operations, when there are no suitable keys for eviction.
#
#       At the date of writing these commands are: set setnx setex append
#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
#       getset mset msetnx exec sort
#
# The default is:
#
# maxmemory-policy noeviction

lru:算法 Least Recently Used 最近最少使用
  • volatile-lru:表示从已经设置过期时间的数据中挑选出最近使用次数最少的数据进行淘汰;

  • allkeys-lru:表示从所有键数据中挑选出最近最少使用的数据进行淘汰

lfu: 算法 Least Frequently Used 最少频率使用
  • volatile-lfu:在设置了过期时间的key中使用LFU算法淘汰

  • allkeys-lfu:在所有键中使用LFU算法淘汰数据

  • volatile-random: 从已设置了过期时间的数据中选择任意数据进行淘汰

  • allkeys-random:在所有键中随机选择任意数据进行淘汰

  • volatile-ttl:从已设置了过期时间的数据中挑选即将要过期的数据淘汰

  • noeviction:默认配置是这个,当内存使用达到阈值的时候,只读不可写。

可以通过配置maxmemory-policy修改淘汰机制。

资料 · 福利

回复 【加群】即可加入Java技术交流修仙群

回复 【Java】即可获取最新零基础Java视频资料

回复 【激活】即可获取IDEA、datagrip等系统激活方式

回复 【面试题】即可获取Java技术相关面试题

往期 · 精彩

盘点那些互联网APP出现的奇葩bug
Redis中String数据类型原理实现

十月一号之后,github新建的默认分支不叫master了

Java面试锦囊(十二)-- Eureka与Zookeeper区别
你连volatile都不在意,你在意什么,在意大利吗

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

### Redis过期策略和淘汰策略 #### 过期策略 Redis过期策略主要用于处理设置了生存时间(TTL)的键。当一个键被设置为在某个时间点后自动删除时,Redis 并不会立即删除该键,而是采用惰性删除和定期删除两种机制来管理这些过期键。 - **惰性删除**:只有当客户端尝试访问一个键时,Redis 才会检查该键是否已过期。如果已过期,则删除该键[^1]。 - **定期删除**:Redis 会在后台周期性地检查数据库中是否存在过期键,并主动删除它们。这种机制可以减少内存占用,但也会增加 CPU 负载。定期删除的频率和每次删除的键数量由 Redis 配置决定[^1]。 #### 淘汰策略 Redis 的淘汰策略用于解决内存不足的问题。当 Redis 内存达到最大限制时,它会根据配置的淘汰策略选择一些键进行删除,以释放内存空间。常见的淘汰策略包括: - **LRU (Least Recently Used)**:删除最近最少使用的键。此策略假设最近未使用的键在未来也不太可能被使用[^2]。 - **LFU (Least Frequently Used)**:删除最不常使用的键。此策略基于访问频率,认为访问频率低的键在未来也不太可能被频繁使用[^3]。 - **TTL (Time To Live)**:删除剩余生存时间最短的键。此策略适用于那些设置了较短生存时间的键[^4]。 - **Random**:随机删除键。此策略简单粗暴,但可能导致重要数据被删除[^5]。 #### 使用场景 不同的淘汰策略适用于不同的使用场景: - **LRU**:适合缓存场景,尤其是当数据访问模式具有明显的局部性时,例如网页缓存、API 响应缓存等[^2]。 - **LFU**:适合需要长期保存某些数据的场景,例如分布式系统中的元数据存储,其中某些数据可能长时间未被访问但仍然重要[^3]。 - **TTL**:适合短期任务或临时数据存储,例如会话管理、验证码存储等[^4]。 - **Random**:适合对数据丢失敏感度较低的场景,例如日志存储、统计分析等[^5]。 #### 示例代码 以下是一个简单的 Redis 配置示例,展示如何设置淘汰策略: ```bash # 设置 Redis 的最大内存限制 maxmemory 100mb # 设置淘汰策略为 LRU maxmemory-policy allkeys-lru ``` #### 注意事项 - 在生产环境中,建议根据实际需求选择合适的淘汰策略,并监控 Redis 的内存使用情况。 - 对于关键数据,避免使用容易被淘汰的策略,如 Random 或 TTL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值