redis系列11--redis的LRU缓存清除算法讲解以及相关配置

目录

1、LRU算法概述

2、缓存清理设置

3、缓存清理的流程

4、redis的LRU近似算法


1、LRU算法概述

redis默认情况下就是使用LRU策略的,因为内存是有限的,但是如果你不断地往redis里面写入数据,那肯定是没法存放下所有的数据在内存的

所以redis默认情况下,当内存中写入的数据很满之后,就会使用LRU算法清理掉部分内存中的数据,腾出一些空间来,然后让新的数据写入redis缓存中

LRU:Least Recently Used,最近最少使用算法

将最近一段时间内,最少使用的一些数据,给干掉。比如说有一个key,在最近1个小时内,只被访问了一次; 还有一个key在最近1个小时内,被访问了1万次

这个时候比如你要将部分数据给清理掉,你会选择清理哪些数据啊?肯定是那个在最近小时内被访问了1万次的数据

2、缓存清理设置

redis.conf

maxmemory,设置redis用来存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用LRU算法清理掉部分数据

如果用LRU,那么就是将最近最少使用的数据从缓存中清除出去

对于64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止; 但是对于32 bit的机器,有一个隐式的闲置就是3GB

maxmemory-policy,可以设置内存达到最大闲置后,采取什么策略来处理

(1)noeviction: 如果内存使用达到了maxmemory,client还要继续写入数据,那么就直接报错给客户端
(2)allkeys-lru: 就是我们常说的LRU算法,移除掉最近最少使用的那些keys对应的数据
(3)volatile-lru: 也是采取LRU算法,但是仅仅针对那些设置了指定存活时间(TTL)的key才会清理掉
(4)allkeys-random: 随机选择一些key来删除掉
(5)volatile-random: 随机选择一些设置了TTL的key来删除掉
(6)volatile-ttl: 移除掉部分keys,选择那些TTL时间比较短的keys

在redis里面,写入key-value对的时候,是可以设置TTL,存活时间,比如你设置了60s。那么一个key-value对,在60s之后就会自动被删除

redis的使用,各种数据结构,list,set,等等

allkeys-lru

这边拓展一下思路,对技术的研究,一旦将一些技术研究的比较透彻之后,就喜欢横向对比底层的一些原理

storm,科普一下

玩儿大数据的人搞得,领域,实时计算领域,storm

storm有很多的流分组的一些策略,按shuffle分组,global全局分组,direct直接分组,fields按字段值hash后分组

分组策略也很多,但是,真正公司里99%的场景下,使用的也就是shuffle和fields,两种策略

redis,给了这么多种乱七八糟的缓存清理的算法,其实真正常用的可能也就那么一两种,allkeys-lru是最常用的

3、缓存清理的流程

(1)客户端执行数据写入操作
(2)redis server接收到写入操作之后,检查maxmemory的限制,如果超过了限制,那么就根据对应的policy清理掉部分数据
(3)写入操作完成执行

4、redis的LRU近似算法

科普一个相对来说稍微高级一丢丢的知识点

redis采取的是LRU近似算法,也就是对keys进行采样,然后在采样结果中进行数据清理

redis 3.0开始,在LRU近似算法中引入了pool机制,表现可以跟真正的LRU算法相当,但是还是有所差距的,不过这样可以减少内存的消耗

redis LRU算法,是采样之后再做LRU清理的,跟真正的、传统、全量的LRU算法是不太一样的

maxmemory-samples,比如5,可以设置采样的大小,如果设置为10,那么效果会更好,不过也会耗费更多的CPU资源
 

<think> 我们正在讨论如何将Redis缓存清除策略配置LRU。根据引用[1]和引用[2],Redis支持LRU算法作为其内存淘汰策略之一。具体配置步骤如下: 1. **设置最大内存限制**:在Redis配置文件(redis.conf)中,通过`maxmemory`参数设置Redis实例可使用的最大内存。例如: ``` maxmemory 4gb ``` 2. **选择LRU策略**:根据引用[2],Redis提供了两种基于LRU的淘汰策略: - `allkeys-lru`:对所有键(包括未设置过期时间的键)使用LRU算法进行淘汰。 - `volatile-lru`:仅对设置了过期时间的键使用LRU算法进行淘汰。 在配置文件中使用`maxmemory-policy`参数指定策略,例如: ``` maxmemory-policy allkeys-lru ``` 3. **调整LRU算法精度**(可选):引用[1]提到Redis使用近似LRU算法,通过采样而非精确计算来节省CPU资源。可以通过`maxmemory-samples`参数调整采样数量(默认5): ``` maxmemory-samples 10 ``` 增加采样数会提高LRU精度但增加CPU消耗。 4. **重启Redis生效**:修改配置后重启Redis服务。 --- ### 配置示例 假设需要设置4GB内存上限并对所有键使用LRU策略: ```conf # redis.conf maxmemory 4gb maxmemory-policy allkeys-lru maxmemory-samples 5 # 默认值,通常无需修改 ``` --- ### 验证配置 连接Redis后执行命令检查: ```bash 127.0.0.1:6379> CONFIG GET maxmemory-policy 1) "maxmemory-policy" 2) "allkeys-lru" ``` --- ### 策略选择建议 | 策略类型 | 适用场景 | 注意事项 | |----------------|--------------------------------------------------------------------------|----------------------------| | `allkeys-lru` | 缓存数据无明显冷热区分,需全局淘汰 | **生产环境首选**,防内存溢出[^2] | | `volatile-lru` | 部分数据需永久保存(如配置信息),仅淘汰有TTL的键 | 需确保所有需淘汰的键均设置TTL | > ⚠️ **关键风险**:若使用`volatile-lru`但未给键设置TTL,当内存满时Redis会返回OOM错误(因无键可淘汰)[^2]。 --- ### 性能优化 - **高并发场景**:增大`maxmemory-samples`(如10)以提升淘汰准确率,但需监控CPU负载[^1]。 - **混合存储需求**:结合`volatile-ttl`策略优先淘汰剩余时间短的键[^3]。 --- §§相关问题§§ 1. RedisLRU算法为什么采用近似实现而非精确计算? 2. 如何监控RedisLRU淘汰效率? 3. 除了LRURedis还有哪些高效的内存淘汰策略? [^2][^4] </think>### 如何将 Redis缓存清除策略配置LRU 以下是配置 Redis 使用 LRU 算法的完整步骤: --- #### 1. **修改配置文件 `redis.conf`** 在配置文件中添加以下关键参数: ```conf # 设置最大内存限制(根据实际需求调整) maxmemory 4gb # 指定 LRU 淘汰策略 maxmemory-policy allkeys-lru # 或 volatile-lru # 调整 LRU 采样精度(可选,默认5) maxmemory-samples 10 ``` --- #### 2. **策略类型说明** | **策略** | 作用范围 | 适用场景 | |------------------|------------------------|----------------------------------| | **`allkeys-lru`** | 所有键(无论是否设置过期时间) | 纯缓存场景,需全局淘汰[^2] | | **`volatile-lru`** | 仅设置过期时间的键 | 需保留部分永久数据(如配置信息)[^2] | > 📌 **生产建议**:优先使用 `allkeys-lru` 确保内存溢出时有兜底淘汰机制[^2]。 --- #### 3. **动态修改配置(无需重启)** 通过 Redis 命令行实时生效: ```bash # 设置最大内存为 4GB 127.0.0.1:6379> CONFIG SET maxmemory 4gb # 启用全局 LRU 淘汰 127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru # 验证配置 127.0.0.1:6379> CONFIG GET maxmemory-policy 1) "maxmemory-policy" 2) "allkeys-lru" ``` --- #### 4. **LRU 算法优化参数** ```conf # 增加采样键数量(范围 1~10) maxmemory-samples 10 ``` - **原理**:Redis 使用**近似 LRU** 算法,随机采样 `N` 个键淘汰最久未使用的[^1] - **权衡**:值越大精度越高,但 CPU 消耗增加(默认 5 平衡性能与精度)[^1] --- #### 5. **验证策略生效** 观察淘汰行为: ```bash # 查看淘汰键数量 127.0.0.1:6379> INFO stats ... evicted_keys: 1532 # >0 表示已触发淘汰 ``` --- ### 配置示例场景 **需求**:缓存服务,总数据量 5GB,物理内存 8GB **配置**: ```conf maxmemory 6gb # 预留 2GB 缓冲 maxmemory-policy allkeys-lru # 全局 LRU maxmemory-samples 7 # 中等精度 ``` > 💡 当内存使用超过 6GB 时,Redis 自动淘汰最久未使用的键[^1][^2]。 --- ### 注意事项 1. **键过期策略分离**:LRU 是内存淘汰机制,与键过期删除(惰性删除+定期删除)互独立[^3][^4] 2. **数据持久化影响**:RDB 快照时 `fork()` 可能阻塞主线程,建议 `maxmemory` 不超过物理内存 80%[^1] 3. **集群环境**:Redis Cluster 需在每个节点单独配置淘汰策略 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值