PLC编程入门:为什么位逻辑是核心基础与实操关键
2026/10/26 1:09:53
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!
在使用 Redis 时,你是否遇到过这些问题:
(error) OOM command not allowed?这些问题的根源,都指向 Redis 的两大核心机制:过期策略(Expire Policy)和内存淘汰策略(Eviction Policy)。
本文将用通俗语言 + 原理图解 + Spring Boot 实战代码,带你彻底搞懂:
当 key 设置了 TTL(Time To Live),到期后自动删除,避免脏数据长期占用内存。
// 示例:GET user:1001 // Redis 内部逻辑: // if (key exists && isExpired(key)) { // delete(key); // return null; // }📌总结:
- 惰性删除:访问时才清理(保数据正确性)
- 定期删除:后台定时清理(保内存效率)
- 两者互补,但都无法做到“秒级精准删除”!
当 Redis 内存使用达到maxmemory上限时,自动删除部分 key,腾出空间给新数据。
⚠️ 注意:过期策略 ≠ 淘汰策略!
- 过期策略:只删已过期的 key
- 淘汰策略:内存不够时,不管是否过期都可能删!
# redis.conf maxmemory 2gb # 设置最大内存 maxmemory-policy allkeys-lru # 设置淘汰策略| 策略 | 作用范围 | 淘汰规则 | 适用场景 |
|---|---|---|---|
noeviction | 所有 key | 不淘汰,新写入报错 | 数据不能丢(如计数器) |
allkeys-lru | 所有 key | LRU:最近最少使用 | 通用推荐!缓存场景 |
volatile-lru | 仅带 TTL 的 key | LRU | 混合存储(部分缓存+部分持久) |
allkeys-lfu | 所有 key | LFU:最不经常使用 | 访问频率差异大(热点/冷门明显) |
volatile-lfu | 仅带 TTL 的 key | LFU | 同上,但只淘汰缓存数据 |
allkeys-random | 所有 key | 随机删除 | 对数据无偏好 |
volatile-random | 仅带 TTL 的 key | 随机删除 | 同上 |
volatile-ttl | 仅带 TTL 的 key | TTL 最短优先 | 优先清理快过期的数据 |
💡LRU vs LFU:
- LRU:关注“最近是否用过” → 适合短期热点
- LFU:关注“总共用了多少次” → 适合长期热点
allkeys-lru)# application.yml spring: redis: # ... 其他配置// 设置缓存(无需手动设 TTL,靠 LRU 自动淘汰) redisTemplate.opsForValue().set("product:1001", productJson); // 或设一个较长 TTL 作为兜底 redisTemplate.opsForValue().set("product:1001", productJson, 2, TimeUnit.HOURS);📌优势:热点数据常驻内存,冷数据自动淘汰,内存利用率高。
// 永久数据(如用户 ID 映射)→ 不设 TTL redisTemplate.opsForValue().set("user:id:name:1001", "张三"); // 缓存数据(如商品详情)→ 设 TTL redisTemplate.opsForValue().set("product:1001", json, 30, TimeUnit.MINUTES);# redis.conf maxmemory-policy volatile-lru # 只淘汰带 TTL 的 key✅效果:永久数据永不淘汰,缓存数据按 LRU 清理。
# 错误:未配置 maxmemory # 后果:Redis 一直吃内存,直到系统 OOM 杀死进程!noeviction但不做容量规划// 错误:所有 key 都不设 TTL,且 maxmemory-policy=noeviction redisTemplate.opsForValue().set("log:" + System.currentTimeMillis(), log); // 后果:内存满后,所有 SET 操作失败,服务不可用!maxmemorymaxmemory 12gballkeys-lruvolatile-lru+缓存 key 必须设 TTL# 查看过期/淘汰统计 redis-cli info memory # 输出: # expired_keys:12345 # 累计过期 key 数 # evicted_keys:6789 # 累计淘汰 key 数(>0 说明内存压力大!)redis-cli --bigkeys检测TTL key,若返回-2表示已删除,-1表示无过期时间,>0表示未过期volatile-lru没有可淘汰 key 会怎样?noeviction,新写入报错!maxmemory-samples调整精度(默认 5)。| 你的需求 | 过期策略 | 淘汰策略 | 是否设 TTL |
|---|---|---|---|
| 纯缓存(如商品详情) | ✅ | allkeys-lru | 可设(兜底) |
| 混合存储(用户信息+缓存) | ✅ | volatile-lru | 缓存必须设 |
| 数据绝对不能丢(如分布式锁) | ❌ | noeviction | 不设 |
| 日志类数据(可丢失) | ✅ | allkeys-random | 建议设 |
Redis 的过期与淘汰策略,是内存高效利用的核心。理解它们,你就能:
记住:不设maxmemory的 Redis,就像没装刹车的跑车——迟早出事!
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!