Redis第五讲 Redis内存淘汰策略之LRU与LFU算法详细介绍
2023-09-11 14:16:28 时间
前面介绍了Redis的一些内存淘汰策略,一般比较常用的两种淘汰策略为LRU,LFU,而且他们的算法考察的也比较多。
LRU(最近最久未使用)
标准LRU算法是这样的:它把数据存放在链表中按照“最近访问”的顺序排列,当某个key被访问时就将此key移动到链表的头部,保证了最近访问过的元素在链表的头部或前面。当链表满了之后,就将"最近最久未使用"的,即链表尾部的元素删除,再将新的元素添加至链表头部。其中LinkedHashMapt就可以通过访问的顺序来实现LRU算法。
一般的LRU的做法如下:
1、为每个节点设置一个prev前继节点指针和next后继节点指针,将所有节点通过这两个指针连接成一个链表,链表有着head和tail节点。
2、用一个哈希表将key和对应的节点存放起来,用来快速的找到key对应的节点
3、当通过key访问对应的节点的时候,通过哈希表查询key得到对应的节点。然后通过节点的的prev和next指针将节点从链表中移除,并将节点放到链表的头部中。
4、当新加入key和节点的时候,如果对应的链表已经满了,就将尾部的节点去除,然后将新节点加入到链表的头部。
从上述流程可以看出,基于链表和哈希表的LRU需要设置prev指针、next指针、以及hash表中的key和value的指针,这是一个很大的内存开销。
因为标准LRU算法需要消耗大量的内存,所以Redis采用了一种近似LRU的做法 给每个key增加一个大小为24bit的属性字段,代表最后一次被访问的时间戳。然后随机采样出5个key,淘汰掉最旧的key,直到Redis占用内存小于maxmemory为止。其中随机采
相关文章
- redis实战笔记(9)-第9章 降低内存占用
- 分布式缓存技术redis学习(二)——详细讲解redis数据结构(内存模型)以及常用命令
- 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)
- PHP使用Redis保存用户会话Session
- Redis——Lettuce连接redis集群
- Redis——jedis连接redis哨兵模式简单使用
- Redis——redis的rdb和aof持久化
- Redis第二十九讲 Redis集群发布订阅模式以及Redis集群事务
- Redis第四讲 Redis内存淘汰策略与过期数据如何处理
- Redis内存数据满了导致宕机
- NoSQL数据库-MongoDB和Redis
- Redis获取数据转json,解决动态泛型传参
- Redis常见操作命令
- 【Redis数据结构 序】使用redis-py操作Redis数据库
- Redis的安装及单线程和高性能
- 【Redis入门笔记 01】redis 安装 & 配置
- redis实现spring-redis-data的入门实例
- 在Apache Tomcat 7设置redis作为session store
- Redis内存管理的基石zmallc.c源代码解读(一)
- Redis(1.20)redis慢查询,redis slowlog
- Redis(1.19)redis内存消耗、redis内存优化
- Redis内存使用优化与存储(转)
- Python连接redis
- 曹工说Redis源码(4)-- 通过redis server源码来理解 listen 函数中的 backlog 参数
- 曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充
- element-ui + redis + mongo + nuxt
- 浅析 Redis 事务(三)
- 【Redis】Redis 的过期策略以及内存淘汰机制详解