您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Redis中内存淘汰策略和过期键删除策略的示例分析
## 引言
Redis作为高性能的键值数据库,其内存管理机制直接影响系统性能和稳定性。当内存达到上限时,Redis通过**内存淘汰策略(Eviction Policies)**决定哪些数据被移除;而**过期键删除策略(Expiration Policies)**则负责清理已过期的键。本文将深入分析这两类策略的工作原理,并通过实际示例演示其行为差异。
---
## 一、Redis内存淘汰策略
### 1.1 为什么需要内存淘汰?
当Redis内存使用达到`maxmemory`配置的阈值时(默认不限制),需通过淘汰机制释放空间。通过`maxmemory-policy`参数可配置以下策略:
#### 1.1.1 不淘汰策略
- **noeviction**(默认):拒绝所有写入命令(返回OOM错误),读操作正常。
```bash
# 示例:写入被拒绝时的错误响应
127.0.0.1:6379> set new_key value
(error) OOM command not allowed when used memory > 'maxmemory'.
策略名称 | 规则描述 | 适用场景 |
---|---|---|
allkeys-lru | 从所有键中淘汰最近最少使用的键 | 热点数据分布不均匀 |
volatile-lru | 仅从设定了过期时间的键中淘汰LRU | 需保留持久化数据 |
allkeys-random | 随机淘汰所有键 | 无明确访问模式 |
volatile-random | 随机淘汰有过期时间的键 | 过期键无优先级 |
volatile-ttl | 优先淘汰剩余存活时间(TTL)最短的键 | 需要快速清理短期数据 |
# 配置为allkeys-lru并插入数据
127.0.0.1:6379> config set maxmemory-policy allkeys-lru
127.0.0.1:6379> set key1 val1
127.0.0.1:6379> set key2 val2
127.0.0.1:6379> get key1 # 访问key1使其"热度"提升
"val1"
# 当内存不足时,key2(未被访问)会被优先淘汰
注意:Redis的LRU是近似算法,通过采样少量键(默认5个)选择最久未使用的,而非全局扫描。
INFO memory
观察内存碎片率(mem_fragmentation_ratio
)。volatile-lru
,对缓存数据用allkeys-lru
。volatile-ttl
的CPU开销通常高于随机淘汰。当客户端尝试访问一个键时,Redis会检查其过期时间,若已过期则立即删除。
# 示例:访问已过期键
127.0.0.1:6379> setex temp_key 10 "expires_in_10s"
127.0.0.1:6379> sleep 11
127.0.0.1:6379> get temp_key # 触发被动删除
(nil)
缺点:如果键长期不被访问,会导致内存泄漏。
Redis以每秒10次(可配置)的频率执行以下操作: 1. 随机抽取20个设置了过期时间的键。 2. 删除其中已过期的键。 3. 如果超过25%的键过期,则重复步骤1。
# 通过修改hz参数调整频率
127.0.0.1:6379> config set hz 20 # 提高为每秒20次
策略类型 | 触发条件 | 优点 | 缺点 |
---|---|---|---|
被动删除 | 键被访问时 | CPU友好 | 内存回收不及时 |
主动删除 | 定时任务触发 | 平衡内存和CPU | 短时间可能占用高CPU |
假设一个电商平台使用Redis缓存商品信息:
- 热门商品(如iPhone)设置为永久键
- 促销商品(如限时折扣)设置TTL=3600秒
- 内存限制2GB,策略为volatile-lru
# 查看过期键数量
127.0.0.1:6379> info stats | grep expired_keys
expired_keys:327
# 查看淘汰键数量
127.0.0.1:6379> info stats | grep evicted_keys
evicted_keys:42
activedefrag yes
自动整理碎片jemalloc
替代默认内存分配器LFU策略:allkeys-lfu
和volatile-lfu
基于访问频率淘汰
# 配置为LFU模式
config set maxmemory-policy allkeys-lfu
allkeys-lru
或allkeys-lfu
volatile-*
策略used_memory
:当前内存使用量keyspace_hits/misses
:淘汰策略有效性通过合理配置,Redis可在内存限制下保持高性能。建议通过
redis-benchmark
测试不同策略的吞吐量差异。
”`
注:本文示例基于Redis 7.0版本,部分命令在不同版本中可能存在差异。实际生产环境应结合监控数据持续优化策略参数。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。