IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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文件中的配置项示意图:

image.png

默认情况maxmemory配置项并未启用,Redis官方介绍64位操作系统默认无内存限制,32位操作系统默认3GB隐式内存配置,如果maxmemory 为0,代表内存不受限。

因此我们在做缓存架构时,要根据硬件资源+业务需求做合适的maxmemory配置。

?

3、内存达到maxmemory怎么办


很显然配置了最大内存,当maxmemory达到了最大上限之后Redis不可能不干活了,那么Redis是怎么来处理这个问题的呢?这就是本文的重点,Redis 提供了maxmemory-policy淘汰策略(本文只讲述LRU不涉及LFU,LFU在下一篇文章讲述),对满足条件的key进行删除,辞旧迎新。

maxmemory-policy淘汰策略:

  • **noeviction:**当达到内存限制并且客户端尝试执行可能导致使用更多内存的命令时返回错误,简单来说读操作仍然允许,但是不准写入新的数据,del(删除)请求可以

  • **allkeys-lru:**从全体key中,通过lru(Least Recently Used - 最近最少使用)算法进行淘汰

  • **allkeys-random:**从全体key中,随机进行淘汰

  • **volatile-lru:**从设置了过期时间的全部key中,通过lru(Least Recently Used - 最近最少使用)算法进行淘汰,这样可以保证未设置过期时间需要被持久化的数据,不会被选中淘汰

  • **volatile-random:**从设置了过期时间的全部key中,随机进行淘汰

  • **volatile-ttl:**从设置了过期时间的全部key中,通过比较key的剩余过期时间TTL的值,TTL越小越先被淘汰

还有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());

}

}

测试结果:

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:33:00  更:2021-12-15 18:34:16 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码