Redis内存淘汰策略全解析:LRU&LFU与持久化机制深度探讨
Redis源码剖析之内存淘汰策略(Evict)
(或多或少使用),分别得到频率。Redis中的LRULFU包含多种移除策略,包括随机移除和基于过期时间的数据移除策略。
全局或特定数据过期策略共有8种配置。
源码分析部分重点关注LRU和LFU策略的实现。
LRU策略记录每个key最近的访问时间戳,并通过排序找到最长的不可访问数据进行移除。
LFU策略使用相同的字段来记录循环次数,并通过时间衰减和概率增长机制来优化淘汰逻辑。
文章结论是,出于性能原因,Redis接受LRU和LFU策略的近似实现,并且在实际应用中表现良好。
这种设计思想为软件开发提供了一个新的视角,即在精度和性能之间做出权衡。
希望这篇文章能够对深入学习Redis的同学有所帮助,欢迎大家关注仓库并star以获得更多资源。
Redis的淘汰策略与持久化:数据保障与性能兼顾的独特之道
深入探讨Redis的淘汰策略和持久化机制,旨在保证数据安全的同时兼顾系统性能,实现高效的数据管理和内存资源利用。
本文将为您剖析Redis的智慧,包括如何避免数据溢出、实现高效的内存管理、掌握Redis的持久化技术保证数据永不丢失。
同时我们也会分享一些优化消除策略和持久化的技巧,帮助大家提高系统性能,最大化利用内存资源。
Redis通过maxmemory-policy参数来选择淘汰策略。
默认情况下,消除策略处于禁用状态。
当数据达到最大内存限制时,向Redis写入数据会导致错误。
有多种策略可供选择:
密钥过期:expire/pexpire。
当key的生命周期结束时,对应的key-value将会被删除。
对象空闲时间:通过丰富的数据结构,每次操作一个值时,Redis都会记录操作的时间,并统计键值操作的次数(8位统计,16位记录时间)。
lru字段用于记录操作值的时间。
使用objectidletimekey查询key的空闲时间(单位为秒)。
配置:maxmemory和maxmemory-policy参数。
maxmemory限制Redis可以使用的最大内存(以字节为单位)。
一般设置为当前系统可用内存的一半;maxmemory-policy制定淘汰策略。
volatile-lru:删除最近最少使用的密钥(最长时间没有使用过的密钥)。
volatile-lfu:删除使用次数最少的密钥。
volatil-ttl:删除最近即将过期的密钥。
volatile-random:随机淘汰过期的key。
allkeys-lru:删除所有key中最近最少使用的key。
allkeys-lfu:删除所有键中使用次数最少的键。
allkeys-random:随机消除所有key。
Redis持久化技术包括aof和rdb。
背景:Redis是内存数据库,需要将数据持久化到磁盘,以便重启时可以恢复数据;当程序崩溃时,数据也需要恢复。
策略:共有三种策略:always、every_sec和no。
调用fsync()的时机不同。
它们在write()之后立即调用,并且每秒调用一次,这是由系统决定的。
缺点:aof会记录所有写命令,包括冗余数据,使得文件体积较大,数据恢复缓慢。
当aof文件过大时,通过fork进程,根据内存数据生成命令协议,优化aof文件大小,避免冗余数据。
背景:RDB以内存为单位进行持久化,效率很高。
优点:文件小,数据恢复速度快。
缺点:数据丢失风险较高,持久化过程成本较高。
记录RDB持久化过程中的aof缓冲区,避免数据丢失,弥补RDB的缺点。
Redis淘汰策略提供了多种选择,以应对不同场景下的数据管理需求。
Redis的持久化方式提供了aof和rdb两种选择,平衡了数据的可靠性和效率。
大key对持久化的影响主要体现在fsync()压力大、fork时间长。
Redis-数据过期清除策略+缓存淘汰策略
使用Redis时,设置缓存大小并考虑数据过期和缓存驱逐策略非常重要。Redis缓存空间大小可以通过`CONFIGSETmaxmemory4gb`命令设置。
当缓存填满时,需要决定如何清除数据。
数据过期删除策略有两种:定期删除和惰性删除。
在定期删除策略中,Redis会每隔100ms随机检查一些有过期时间的key,检查是否过期,过期则删除。
这种方法避免了定时删除的CPU占用率高的问题,但是在并发环境下仍然需要注意对CPU的影响。
惰性删除会检查key是否过期,在获取key时将其删除,但可能会导致过期key不能及时清理,造成内存堆积。
缓存消除策略在Redis中提供了多种选择,包括但不限于volatile-ttl、易失性-随机、易失性-lru、易失性-lfu、allkeys-random、allkeys-lru、allkeys-lfu。
其中,建议优先使用`allkeys-lru`策略。
它利用LRU算法来保留最近访问的数据并提高应用程序性能。
allkeys-lru适合冷热数据有明显区分的场景,而allkeys-random在没有明显区分的情况下效果不佳。
对于没有设置过期时间的键值对,淘汰策略的行为与noeviction类似,不执行任何数据淘汰。