文章目录

  • 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缓存淘汰策略相关推荐

  1. redis数据结构、持久化、缓存淘汰策略

    Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题.redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放 ...

  2. Redis缓存(二)缓存淘汰策略,脏数据/脏页,缓存污染

    一.应该给Redis分配多少内存空间 八二原则:80%的请求都是访问数据库中同样的20%的数据(热点数据只占20%),所以一般给Redis分配15% - 30%数据总量的内存空间(只保存热点数据,冷数 ...

  3. Redis缓存失效策略思考

    1 删除过期数据 我们设置Redis元素时可以指定过期时间,那么Redis如何删除这些超时元素?Redis采用了两种策略:定期删除和惰性删除. (1) 定期删除 Redis每隔一段时间就检查哪些KEY ...

  4. oracle procedures批量删除带索引条件数据很慢_redis数据结构、持久化、缓存淘汰策略...

    Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题.redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放 ...

  5. 源码角度详解Redis缓存淘汰机制(Eviction)

    本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...

  6. Redis 缓存删除策略

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  7. Redis缓存淘汰机制

    Redis缓存淘汰机制  当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换,这样会使得redis的性能急剧下降. 在生产环境中,是不允许redis出现交换行为的,为了限制最大使 ...

  8. Redis缓存淘汰之LRU

    我们知道Redis是基于内存来存储数据的,这也是它之所以查询速度这么快的原因之一.但是在数据量较大的场景下如果一直网缓存中存数据那么就会报OOM异常,因此我们就需要使用下面八种缓存淘汰策略对缓存进行删 ...

  9. 缓存淘汰策略:LRU、LFU、FIFO 算法原理

    通常来说,Redis 一共有 6 种缓存淘汰策略,其中,常用的 allkeys-lru 和 volatile-lru 里面都提到了 LRU 的概念,实际上 LRU 就是缓存淘汰策略的基础算法.现在,就 ...

最新文章

  1. 如何优雅的设计一个告警系统?远没有你想的那么简单!
  2. HTML代码编写规范
  3. 安卓开发笔记(二十六):Splash实现首页快速开屏功能
  4. UIScrollView控件常用属性
  5. mysql5.7 sqlmode_mysql 5.7 sql mode
  6. Python实训day10am【Python中的地址引用、os模块】
  7. 使用form上传文件到application server的另一种办法
  8. android 锁屏 home,android 锁屏界面禁用长按home 和menu(recent apps)
  9. vb串口 任意波特率_串口通讯基本知识
  10. Find命令使用详解及实例分析
  11. 【软件测试】使用C++ Test 进行静态测试
  12. 小程序源码:收款码三合一制作
  13. 前东家欠款 1.4 亿?我看贝店爆雷事件
  14. AirPods Pro 一直断线?如何修复
  15. hdu 1849 nim博弈
  16. 鸿蒙系统运行内存为啥只有8g,明明8G内存,系统却显示只有4G!为啥会这样?
  17. 嵌入式linux开发04-roottfs移植
  18. 浅谈Zebra斑马打印机三种打印方式的利弊
  19. 数字和罗马数字的的转换
  20. golang实现的布隆过滤器_Golang中的布隆过滤器

热门文章

  1. 快速打开Android离线文档
  2. [计算机视觉] 手把手教你如何生成高清的AprilTag
  3. ECharts 史上最复杂的仪表盘
  4. Caputo 分数阶微分方程-慢扩散方程初边值问题基于快速 L2-1σ 逼近的空间二阶方法及其Matlab程序实现
  5. Chome和Edge通过组策略配置IE模式和总是允许Flash(官方方案)
  6. 中鸣教育计算机二级,中鸣机器人教育套装使用指南2012.11.02.pdf
  7. 网站降权排名下降的原因及解决办法
  8. 最齐全的鼠标3dm犀牛模型素材,速来收藏
  9. 2018北邮网研机试-B
  10. 《腾讯政务协同平台安全白皮书》发布,助力“智慧政务”夯实安全底座