中间件专栏之Redis篇——Redis中过期key删除和内存淘汰策略

在Redis中,过期键的删除内存淘汰策略是管理Redis内存的重要机制,确保Redis可以高效地使用内存,并避免由于内存不足导致的性能问题。以下是这两个概念的详细介绍:

一、过期键删除机制

Redis支持对存储的键设置过期时间(TTL, Time to Live),过期时间到达后,Redis会自动删除这些键。Redis对过期键的删除机制并不是严格的"实时"删除,而是采用了一些优化策略。

1. 过期键的删除方式

Redis中,过期键删除的方式分为两种:

  • 定期删除:Redis每隔一定时间会随机检查一部分带有过期时间的键,并删除那些已经过期的键。默认情况下,每100毫秒会进行一次检查。

  • 惰性删除:每次访问某个键时,如果发现该键已过期,Redis会在访问时删除这个键。这意味着过期的键不会立即删除,直到被访问时才会删除。

这两种方式的结合保证了Redis能够在保证性能的同时,避免内存占用过多的过期键。

2. 过期键的删除策略
  • 惰性删除:即键在被访问时,如果发现其过期,则立即删除。虽然这种方法简单,但如果没有被访问到的过期键仍然占用内存,可能会导致内存浪费。

  • 定期删除:Redis每隔一定时间会扫描一定比例的过期键并删除,这可以有效防止过期键占用内存,但也有一定的性能开销。

3. 过期策略的缺点
  • 延迟删除:由于过期键是在访问时被删除的,如果某个过期键长时间没有被访问到,它会一直占用内存,直到它被随机扫描到。
  • 性能开销:定期删除机制会消耗CPU和内存资源,尤其在大规模数据集和高并发环境下。

二、内存淘汰策略

Redis采用内存淘汰策略来管理内存使用,确保Redis在内存使用达到限制时不会出现崩溃。Redis提供了多种内存淘汰策略,这些策略决定了在内存不足时,Redis会如何选择和删除数据。

1. 内存淘汰策略类型

在Redis配置中,maxmemory-policy设置了内存淘汰的策略,当Redis的内存使用超过了maxmemory配置指定的限制时,会根据选择的策略决定如何处理内存:

  • noeviction (默认):当内存达到限制时,Redis会拒绝所有写入请求,并返回一个错误提示(OOM command not allowed when used memory > 'maxmemory')。这意味着在内存不足时,Redis会拒绝写入操作,而不会自动删除数据。

  • allkeys-lru:Redis会从所有键中删除最少使用的键(LRU,Least Recently Used)。LRU算法会选择最近最少使用的键进行删除。

  • volatile-lru:只从设置了过期时间的键中删除最少使用的键。如果某个键已经过期并且被选中进行删除,则删除该键。

  • allkeys-random:从所有键中随机删除一些键。

  • volatile-random:只从设置了过期时间的键中随机删除一些键。

  • volatile-ttl:只从设置了过期时间的键中,删除那些剩余时间最短的键(TTL,Time to Live)。

  • allkeys-lfu(Redis 4.0+):Redis会从所有键中删除最不常使用的键。LFU(Least Frequently Used)算法会选择那些使用频率最低的键进行删除。

  • volatile-lfu(Redis 4.0+):只从设置了过期时间的键中删除最不常使用的键。

2. 内存淘汰策略的选择

不同的内存淘汰策略适用于不同的使用场景,下面是一些常见策略的适用情况:

  • noeviction:适用于对数据的完整性有很高要求的场景,在这种场景下,Redis会拒绝写入操作,直到有足够的内存为止,避免丢失数据。

  • allkeys-lru:适用于希望缓存数据可以被替换的场景。LRU算法能够较好地保证常用数据的保留,淘汰不常用的数据。

  • volatile-lru:适用于希望对过期数据进行管理的场景,确保只有那些设置了过期时间的数据被淘汰。

  • allkeys-random:适用于需要简单且不需要考虑过期的场景,或者数据集较小且内存不紧张的场景。

  • volatile-ttl:适用于希望淘汰即将过期的数据的场景,例如会话管理中,接近过期的会话优先被清除。

  • allkeys-lfu:适用于缓存热点数据的场景,LFU算法能够根据数据的访问频率来选择需要淘汰的数据,避免热门数据被删除。

总结

  • 过期键删除:Redis通过惰性删除和定期删除相结合的方式来管理过期键。惰性删除在键被访问时删除过期键,而定期删除则定期扫描并删除过期的键。这些方法虽然能够有效减少内存的浪费,但仍可能导致延迟删除和性能开销。

  • 内存淘汰策略:Redis提供多种内存淘汰策略,在内存达到配置限制时,Redis根据不同的策略删除键,以释放内存。用户可以根据业务需求选择合适的策略,如LRU、LFU等。

相关推荐
暴怒的代码2 小时前
云原生监控篇——全链路可观测性与AIOps实战
数据库·sql·mysql
小张-森林人4 小时前
Oracle 字符串分割革命:正则表达式与 Lateral Join 的优雅解法
数据库·oracle·正则表达式
m0_748250936 小时前
SQL Server Management Studio的使用
数据库·oracle·性能优化
车载诊断技术6 小时前
人工智能AI在汽车设计领域的应用探索
数据库·人工智能·网络协议·架构·汽车·是诊断功能配置的核心
没有十八岁6 小时前
云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书
java·数据库·spring·汽车
pitt19977 小时前
Redis 高可用性:如何让你的缓存一直在线,稳定运行?
redis·redis集群·哨兵·redis主从·redis高可用
爱搞技术的猫猫7 小时前
微店商品详情API接口实战指南:从零实现商品数据自动化获取
大数据·linux·运维·数据库·自动化
大地爱7 小时前
如何使用Spring Boot框架整合Redis:超详细案例教程
spring boot·redis·后端
若云止水8 小时前
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(1)
数据库·nginx·ubuntu
WannaRunning10 小时前
MySQL中的共享锁和排他锁
数据库·mysql