🌟前言
在上一篇学习了Redis的过期Key删除策略,此篇文章主要学习Redis引入内存淘汰机制,从而解决Redis中内存不足的问题,提高Redis的性能。有需要看上一篇文章内容的可以前往专栏查看。
🌟概述
内存淘汰策略:Redis中的运行内存超过最大内存(maxmemory)后,由其内存淘汰策略(maxmemory-policy)来控制内存的回收。
重要配置项
- maxmeory-最大内存,如果配置为0,在64位系统下则表示无最大内存限制,在32位系统下则表示最大内存限制为 3 GB
maxmemory 0 或者通过命令 config set maxmemory 0
- maxmemory-policy-内存淘汰策略
maxmemory-policy 策略名称 或者通过命令 config set maxmemory-policy 策略名称
八大内存淘汰策略
淘汰策略 | 描述 |
noeviction |
不淘汰策略,当内存不足时新写入操作会报错 |
allkeys-lru |
最近最少使用策略,从所有键中选择最近最少使用的键进行淘汰 |
volatile-lru |
带过期时间的最近最少使用策略,只在设置了过期时间的键中选择最近最少使用的键进行淘汰 |
allkeys-random |
随机淘汰策略,随机选择一个键进行淘汰,释放内存空间 |
volatile-random |
带过期时间的随机淘汰策略,只在设置了过期时间的键中随机选择一个键进行淘汰 |
volatile-ttl |
带过期时间的TTL策略,只在设置了过期时间的键中选择剩余过期时间最短的键进行淘汰 |
volatile-lfu |
带过期时间的最不经常使用策略,只在设置了过期时间的键中选择访问频率最低的键进行淘汰 |
allkeys-lfu |
最不经常使用策略,从所有键中选择访问频率最低的键进行淘汰 |
🌟内存淘汰算法
LRU-最久未使用算法
传统实现:传统实现中,采用哈希表+双向链表进行缓存维护。如果缓存被命中则放到链表头结点,淘汰时淘汰尾部节点。
Redis实现:因为传统实现,存储链表需要空间以及指针的移动影响性能,在redis中采用近似LRU算法。Redis中设计了一个全局时钟和局部时钟。全局时钟(lrulock)为redis共享时钟,可以理解为系统时间戳;而局部时钟为独有时钟(key最近被访问时的系统时间戳)。通过随机取样结合时钟时间差来淘汰内存。
LFU-最近使用频率最少
因为LRU只关心缓存的访问时间,并且具有随机性。这样有时会导致经常被访问的Key被淘汰,Redis引入了LFU算法。通过访问时间以及访问次数来进行内存淘汰。优先淘汰访问次数少的key,如果访问次数相同则根据访问时间差进行淘汰。
🌟Key删除策略与内存淘汰策略的区别
Key删除策略 |
内存淘汰策略 | |
描述 | 在Redis中设置Key的过期时间,并设置相应的过期处理策略。 | 当Redis内存使用达到限制或超过可用内存时,选择淘汰哪些数据。 |
目的 | 自动删除过期的Key及其对应的数据。 | 释放内存空间,避免Redis因内存不足而发生错误或宕机。 |
应用场景 | 需要精确控制Key的过期时间以及及时删除过期Key的场景。 | 在内存不足时清理一部分数据以腾出空间的场景。 |
🌟写在最后
此文对Redis的8种内存策略进行了总结,简要概述了Redis中使用的LRU和LFU淘汰算法以及对redis的过期key进行了对比,来帮助大家更好的理解Redis内存淘汰机制!
有关于Redis中过期KEY内存淘汰策略到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论或者有什么不足之处还望提出。感谢大家!!!