| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Redis精通系列——LRU算法详述(Least Recently Used - 最近最少使用) -> 正文阅读 |
|
[数据结构与算法]Redis精通系列——LRU算法详述(Least Recently Used - 最近最少使用) |
因此如何防止Redis发生这种情况非常重要(面试官问到Redis几乎没有不问这个知识点的)。 ? 2、maxmemory配置 Redis针对上述问题提供了maxmemory配置,这个配置可以指定Redis存储器的最大数据集,通常情况都是在redis.conf文件中进行配置,也可以运行时使用CONFIG SET命令进行一次性配置。 redis.conf文件中的配置项示意图: 默认情况maxmemory配置项并未启用,Redis官方介绍64位操作系统默认无内存限制,32位操作系统默认3GB隐式内存配置,如果maxmemory 为0,代表内存不受限。 因此我们在做缓存架构时,要根据硬件资源+业务需求做合适的maxmemory配置。 ? 3、内存达到maxmemory怎么办 很显然配置了最大内存,当maxmemory达到了最大上限之后Redis不可能不干活了,那么Redis是怎么来处理这个问题的呢?这就是本文的重点,Redis 提供了maxmemory-policy淘汰策略(本文只讲述LRU不涉及LFU,LFU在下一篇文章讲述),对满足条件的key进行删除,辞旧迎新。 maxmemory-policy淘汰策略:
还有volatile-lfu/allkeys-lfu这个留到下文一起探讨,两个算法不一样! random随机淘汰只需要随机取一些key进行删除,释放内存空间即可;ttl过期时间小先淘汰也可以通过比较ttl的大小,将ttl值小的key进行删除,释放内存空间即可。 那么LRU是怎么实现的呢?Redis又是如何知道哪个key最近被使用了,哪个key最近没有被使用呢? ? 4、LRU算法实现 我们先用Java的容器实现一个简单的LRU算法,我们使用ConcurrentHashMap做key-value结果存储元素的映射关系,使用ConcurrentLinkedDeque来维持key的访问顺序。 LRU实现代码: package?com.lizba.redis.lru; import?java.util.Arrays; import?java.util.List; import?java.util.concurrent.ConcurrentHashMap; import?java.util.concurrent.ConcurrentLinkedDeque; /** *? *??????LRU简单实现 *? *?@Author:?Liziba *?@Date:?2021/9/17?23:47 */ public?class?SimpleLru?{ /**?数据缓存?*/ private?ConcurrentHashMap<String,?Object>?cacheData; /**?访问顺序记录?*/ private?ConcurrentLinkedDeque?sequence; /**?缓存容量?*/ private?int?capacity; public?SimpleLru(int?capacity)?{ this.capacity?=?capacity; cacheData?=?new?ConcurrentHashMap(capacity); sequence?=?new?ConcurrentLinkedDeque(); } /** *?设置值 *?@param?key *?@param?value *?@return */ public?Object?setValue(String?key,?Object?value)?{ //?判断是否需要进行LRU淘汰 this.maxMemoryHandle(); //?包含则移除元素,新访问的元素一直保存在队列最前面 if?(sequence.contains(key))?{ sequence.remove(); } sequence.addFirst(key); cacheData.put(key,?value); return?value; } /** *?达到最大内存,淘汰最近最少使用的key */ private?void?maxMemoryHandle()?{ while?(sequence.size()?>=?capacity)?{ String?lruKey?=?sequence.removeLast(); cacheData.remove(lruKey); System.out.println("key:?"?+?lruKey?+?“被淘汰!”); } } /** *?获取访问LRU顺序 *?@return */ public?List?getAll()?{ return?Arrays.asList(sequence.toArray(new?String[]?{})); } } 测试代码: package?com.lizba.redis.lru; /** *? *??????测试最近最少使用 *? *?@Author:?Liziba *?@Date:?2021/9/18?0:00 */ public?class?TestSimpleLru?{ public?static?void?main(String[]?args)?{ SimpleLru?lru?=?new?SimpleLru(8); for?(int?i?=?0;?i?<?10;?i++)?{ lru.setValue(i+"",?i); } System.out.println(lru.getAll()); } } 测试结果: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/2 20:27:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |