Redis缓存淘汰策略
文章目录
- noeviction
- allkeys-lru
- allkeys-lfu
- volatile-lru
- volatile-lfu
- allkeys-random
- volatile-random
- volatile-ttl
- 近似LRU算法
- 近似LFU算法
Redis缓存淘汰策略 cache eviction policy有8种之多。
noeviction
当内存到达配置的最大值时新数据不会被保存,这个策略就是noeviction,可以说是非常坑的。
allkeys-lru
关于最近最少使用Least Recently Used,其实是按最后一次访问时间进行的排序。可以在逻辑上用一个队列来建模,左边代表可以清理的,右边代表需要保留的。当内存不足时,从左到右清除队列里的数据。那么当一个元素被使用时,就移动到最右边。所以这个算法对跟使用次数是没关系的,只和最后一次的使用时间有关系,但是翻译为“最近最少使用”,这个最少就容易让人误解为要使用次数最少。其实他的英文Least没有加the,说明不是形容词的最高级,真正的意思是至少、起码,所以准确的翻译应该为“起码最近使用”。而allkeys是覆盖了所有的key,与通过redis命令加在key上面的过期时间无关。所以这个策略也是不建议使用的。这个算法常见的实现是LinkedHashMap,用Hash快速找到使用的key,用LinkedList维护淘汰队列。
allkeys-lfu
LFU的翻译是最不经常使用frequently used,但是这个翻译是意译,中文算是准确了,就是访问次数最少的被淘汰。算法很简单,使用一个小顶堆来实现,使用次数最少的在堆顶,然后每次内存不足时从堆顶移除。随便插一句,Java的堆为什么叫堆?其实这是个历史名词,因为以前的时代,就是用小顶堆来维护内存的,内存的使用次数最小的(一般为0)在堆顶,所以每次要空闲内存的时候,就从堆顶拿内存就可以了,后来的内存分配算法已经不用堆了,但是堆这个历史名词还是保留了下来。同allkeys-lru一样,allkeys-lfu也是忽略key的过期时间,所以也不建议使用。
volatile-lru
从设置了超时的key,也就是expire=true的key中使用LRU算法进行淘汰,不再赘述。但是要注意的是这个时候key不一定是过期的key,极有可能是还存活者的key。
volatile-lfu
从设置了超时的key中使用LFU算法进行淘汰,不再赘述。
allkeys-random
这从字面就可以理解,随机选个key淘汰,这也太坑了吧、
volatile-random
从设置了超时的key里随机淘汰,还不算太坑。
volatile-ttl
从设置了超时的key里淘汰剩余存活时间time-to-live最小的key,TTL就是time-to-live的缩写。
近似LRU算法
Redis的LRU算法不是精确的LRU算法,也就是说并不是对所有的key进行最后一次访问时间管理,只是取一定的样本数据来进行粗略估算,所以样本数量取得越大,算法就越精确,具体需要用户自己根据实际情况配置。
近似LFU算法
Redis的LFU算法虽然同LRU一样使用的是近似的抽样统计算法,但是原理有点不一样,内部使用了莫里斯计数器Morris counter进行次数统计。其默认是这样,100万次请求后,将莫里斯计数器设置为最大值,也就是使莫里斯计数器饱和Saturate ,然后每隔一个衰减周期decay time减少一次计数器的值。
Redis缓存淘汰策略相关推荐
- redis数据结构、持久化、缓存淘汰策略
Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题.redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放 ...
- Redis缓存(二)缓存淘汰策略,脏数据/脏页,缓存污染
一.应该给Redis分配多少内存空间 八二原则:80%的请求都是访问数据库中同样的20%的数据(热点数据只占20%),所以一般给Redis分配15% - 30%数据总量的内存空间(只保存热点数据,冷数 ...
- Redis缓存失效策略思考
1 删除过期数据 我们设置Redis元素时可以指定过期时间,那么Redis如何删除这些超时元素?Redis采用了两种策略:定期删除和惰性删除. (1) 定期删除 Redis每隔一段时间就检查哪些KEY ...
- oracle procedures批量删除带索引条件数据很慢_redis数据结构、持久化、缓存淘汰策略...
Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题.redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放 ...
- 源码角度详解Redis缓存淘汰机制(Eviction)
本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...
- Redis 缓存删除策略
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...
- Redis缓存淘汰机制
Redis缓存淘汰机制 当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换,这样会使得redis的性能急剧下降. 在生产环境中,是不允许redis出现交换行为的,为了限制最大使 ...
- Redis缓存淘汰之LRU
我们知道Redis是基于内存来存储数据的,这也是它之所以查询速度这么快的原因之一.但是在数据量较大的场景下如果一直网缓存中存数据那么就会报OOM异常,因此我们就需要使用下面八种缓存淘汰策略对缓存进行删 ...
- 缓存淘汰策略:LRU、LFU、FIFO 算法原理
通常来说,Redis 一共有 6 种缓存淘汰策略,其中,常用的 allkeys-lru 和 volatile-lru 里面都提到了 LRU 的概念,实际上 LRU 就是缓存淘汰策略的基础算法.现在,就 ...
最新文章
- 如何优雅的设计一个告警系统?远没有你想的那么简单!
- HTML代码编写规范
- 安卓开发笔记(二十六):Splash实现首页快速开屏功能
- UIScrollView控件常用属性
- mysql5.7 sqlmode_mysql 5.7 sql mode
- Python实训day10am【Python中的地址引用、os模块】
- 使用form上传文件到application server的另一种办法
- android 锁屏 home,android 锁屏界面禁用长按home 和menu(recent apps)
- vb串口 任意波特率_串口通讯基本知识
- Find命令使用详解及实例分析
- 【软件测试】使用C++ Test 进行静态测试
- 小程序源码:收款码三合一制作
- 前东家欠款 1.4 亿?我看贝店爆雷事件
- AirPods Pro 一直断线?如何修复
- hdu 1849 nim博弈
- 鸿蒙系统运行内存为啥只有8g,明明8G内存,系统却显示只有4G!为啥会这样?
- 嵌入式linux开发04-roottfs移植
- 浅谈Zebra斑马打印机三种打印方式的利弊
- 数字和罗马数字的的转换
- golang实现的布隆过滤器_Golang中的布隆过滤器
热门文章
- 快速打开Android离线文档
- [计算机视觉] 手把手教你如何生成高清的AprilTag
- ECharts 史上最复杂的仪表盘
- Caputo 分数阶微分方程-慢扩散方程初边值问题基于快速 L2-1σ 逼近的空间二阶方法及其Matlab程序实现
- Chome和Edge通过组策略配置IE模式和总是允许Flash(官方方案)
- 中鸣教育计算机二级,中鸣机器人教育套装使用指南2012.11.02.pdf
- 网站降权排名下降的原因及解决办法
- 最齐全的鼠标3dm犀牛模型素材,速来收藏
- 2018北邮网研机试-B
- 《腾讯政务协同平台安全白皮书》发布,助力“智慧政务”夯实安全底座