Redis中内存淘汰策略和过期键删除策略的示例分析

发布时间:2021-09-15 12:57:08 作者:小新
来源:亿速云 阅读:133
# 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'.

1.1.2 通用淘汰策略

策略名称 规则描述 适用场景
allkeys-lru 从所有键中淘汰最近最少使用的键 热点数据分布不均匀
volatile-lru 仅从设定了过期时间的键中淘汰LRU 需保留持久化数据
allkeys-random 随机淘汰所有键 无明确访问模式
volatile-random 随机淘汰有过期时间的键 过期键无优先级
volatile-ttl 优先淘汰剩余存活时间(TTL)最短的键 需要快速清理短期数据

1.1.3 示例:LRU策略实战

# 配置为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个)选择最久未使用的,而非全局扫描。


1.2 策略选择建议


二、过期键删除策略

2.1 被动删除(惰性删除)

当客户端尝试访问一个键时,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)

缺点:如果键长期不被访问,会导致内存泄漏。

2.2 主动删除(定期删除)

Redis以每秒10次(可配置)的频率执行以下操作: 1. 随机抽取20个设置了过期时间的键。 2. 删除其中已过期的键。 3. 如果超过25%的键过期,则重复步骤1。

# 通过修改hz参数调整频率
127.0.0.1:6379> config set hz 20  # 提高为每秒20次

2.3 删除策略对比

策略类型 触发条件 优点 缺点
被动删除 键被访问时 CPU友好 内存回收不及时
主动删除 定时任务触发 平衡内存和CPU 短时间可能占用高CPU

三、组合策略实战分析

3.1 场景模拟

假设一个电商平台使用Redis缓存商品信息: - 热门商品(如iPhone)设置为永久键 - 促销商品(如限时折扣)设置TTL=3600秒 - 内存限制2GB,策略为volatile-lru

操作序列:

  1. 写入1000个促销商品(带TTL)
  2. 写入500个热门商品(无TTL)
  3. 内存达到阈值时:
    • 行为:仅从促销商品中淘汰最近最少使用的键
    • 结果:热门商品永远不会被淘汰

3.2 监控与调优

# 查看过期键数量
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

四、高级主题

4.1 内存碎片优化

4.2 Redis 6.0新特性


五、总结建议

  1. 缓存场景:优先使用allkeys-lruallkeys-lfu
  2. 混合数据集:对持久化数据使用volatile-*策略
  3. 监控指标
    • used_memory:当前内存使用量
    • keyspace_hits/misses:淘汰策略有效性

通过合理配置,Redis可在内存限制下保持高性能。建议通过redis-benchmark测试不同策略的吞吐量差异。

”`


:本文示例基于Redis 7.0版本,部分命令在不同版本中可能存在差异。实际生产环境应结合监控数据持续优化策略参数。

推荐阅读:
  1. Redis数据淘汰策略
  2. Redis中过期策略的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

redis

上一篇:如何使用批处理bat将文本中的数据相加输出

下一篇:java应用开发中MyBayis缓存的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》