Redis 缓存实战:用好了效率提升
【摘要】 缓存是把双刃剑。聊聊缓存读写的标准姿势(Cache Aside)、怎么防穿透/击穿/雪崩,以及过期时间打散这种不起眼但救命的细节。华为云 GaussDB(for Redis) 也是同一套用法。配一张命中/未命中流程图。
一、先说标准姿势:Cache Aside
业界最通用的就是"旁路缓存"——读时先查缓存,没有再查库并回写;写时先更库,再删缓存(不是更缓存,避免并发下脏数据):
读:缓存有 → 返回;缓存无 → 查 DB → 写入缓存 → 返回
写:更新 DB → 删除缓存(下次读自动重建)
为什么删除而不是更新缓存?因为并发写时,谁先谁后不确定,删缓存最省心,反正下次读会重建。
二、三个经典翻车现场
| 问题 | 现象 | 解法 |
|---|---|---|
| 缓存穿透 | 查不存在的 key,每次都打到 DB | 空值也缓存(短过期)+ 布隆过滤器 |
| 缓存击穿 | 某个热点 key 过期瞬间,海量请求涌向 DB | 互斥锁重建 / 逻辑过期 |
| 缓存雪崩 | 大量 key 同一时刻失效 | 过期时间加随机值打散 |

三、过期时间一定打散
这是最容易被忽略、却最能救命的一点。如果所有缓存都设 1 小时,到点一起失效,DB 瞬间被压垮:
// 伪代码:基础 1 小时 + 随机 0~10 分钟
int ttl = 3600 + new Random().nextInt(600);
redis.set(key, value, ttl, TimeUnit.SECONDS);
四、别把 Redis 当数据库
Redis 是缓存,默认持久化未必及时。重要数据该落库的落库,缓存只加速读取。我见过有人把订单状态只放 Redis,一重启全丢,对账对到崩溃。
五、其他的选择
自己搭 Redis 要管主从、哨兵、扩容;嫌麻烦可以直接用华为云 GaussDB(for Redis),兼容 Redis 协议,容量和可靠性交给平台。用法和原生 Redis 一模一样,上面那些坑照样要避开,只是运维省了。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)