中间件专栏之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等。

相关推荐
JosieBook11 分钟前
【数据库】时序数据库选型指南:在大数据与工业4.0时代,为何 Apache IoTDB 成为智慧之选?
大数据·数据库·时序数据库
程序员三明治12 分钟前
详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
java·数据库·redis·分布式锁·redisson·watchdog·看门狗
chenzhou__21 分钟前
MYSQL学习笔记(个人)(第十五天)
linux·数据库·笔记·学习·mysql
一只自律的鸡1 小时前
【MySQL】第二章 基本的SELECT语句
数据库·mysql
liliangcsdn2 小时前
如何使用python创建和维护sqlite3数据库
数据库·sqlite
TDengine (老段)9 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)9 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
安当加密9 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a9 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽9 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库