Redis 缓存入门:从 String 到过期策略

举报
神的孩子都在跳舞 发表于 2026/11/05 08:41:57 2026/11/05
【摘要】 一、为什么要用缓存很多业务刚上线不久,最先扛不住的往往是数据库。商品详情、首页榜单、用户信息这些热点数据请求量一上来,数据库的磁盘 IO 和连接数很快见顶。缓存就是在应用和数据库之间加一道内存防线:读请求先查缓存,命中直接返回,只有未命中才回源数据库,再把结果写回缓存备用。内存读写比磁盘快一到两个数量级,热点数据被反复请求时,数据库的压力立刻降下来。缓存的本质不是让单次查询变快,而是让重复的...

一、为什么要用缓存

很多业务刚上线不久,最先扛不住的往往是数据库。商品详情、首页榜单、用户信息这些热点数据请求量一上来,数据库的磁盘 IO 和连接数很快见顶。缓存就是在应用和数据库之间加一道内存防线:读请求先查缓存,命中直接返回,只有未命中才回源数据库,再把结果写回缓存备用。内存读写比磁盘快一到两个数量级,热点数据被反复请求时,数据库的压力立刻降下来。缓存的本质不是让单次查询变快,而是让重复的请求不再打到数据库。

二、五种常用数据结构速览

Redis 不只是一个键值存储,它提供五种常用数据结构。String 是最基础的字符串,可以存文本、数字和序列化后的对象;Hash 适合存一个对象的多个字段,比如用户信息;List 是有序队列,常用来做消息队列和最新动态列表;Set 是无序不重复集合,适合做标签和共同好友;Sorted Set 在集合基础上加了分数,可以做排行榜。入门先把 String 用熟,再按场景去选其他类型,不要一上来就贪多。

三、String 读写与 SET/GET

String 是最常用的类型,读写就是 SET 和 GET。下面是一段伪代码,展示先查缓存、未命中再查库并回填的常见写法:

SET user:1001 "张三"
GET user:1001
value = GET("user:1001")
if value is None:
    value = db.query("SELECT * FROM users WHERE id=1001")
    SET("user:1001", value)
return value

这里有个细节:写入缓存时最好顺手带上过期时间,避免缓存一直不更新,读到的永远是第一次写入的旧数据。

四、过期策略:TTL 与淘汰策略

缓存不能无限增长,要给键设置存活时间 TTL。常见的写法是 SET key value EX 3600,表示一小时后自动过期。过期有两种处理方式:定时过期由 Redis 在键到期时主动清理,也可以惰性删除,等下次访问时再判断是否过期。内存写满了怎么办?Redis 提供淘汰策略,比如 LRU 会优先清理最近最少使用的数据,allkeys-lru 对所有键生效,volatile-lru 只针对设置了过期时间的键。新手用 allkeys-lru 一般够用,但要记住:淘汰只是兜底,合理的 TTL 才是正道。

五、缓存穿透、击穿、雪崩,一句话讲清

缓存穿透:请求的数据既不在缓存也不在数据库,大量空请求直接打到数据库,可以用缓存空值或布隆过滤器挡住。
缓存击穿:某个热点键突然过期,瞬间大量请求同时回源数据库,可以给热点键加互斥锁,只放一个请求去重建缓存。
缓存雪崩:大量键在同一时间集中过期,或者缓存服务宕机,请求全部涌向数据库,可以把过期时间打散加随机值,并做好熔断限流。
三者的区别记住一句话:穿透是查不到,击穿是热点过期,雪崩是大面积失效。

六、一条忠告

缓存不是万能的。引入缓存后,同一份数据有了两个副本,一致性问题就跟着来了。更新数据库之后缓存可能还是旧值,对一致性要求严格的场景要慎用缓存,先想清楚可以接受多大的延迟。多一份缓存,就多一份失效、过期和一致性的心智负担,先在简单场景把它用稳,再去碰更复杂的架构。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。