一、缓存基础与命中率定义

大家好,我是你们的老朋友。今天咱们聊聊缓存命中率这个话题。

说实话,我见过太多团队在缓存上栽跟头了。有的系统明明上了缓存,性能反而更差。有的缓存命中率只有20%,还以为是正常的。嗯,这其实都是基础没打牢。

1.1 什么是缓存?

缓存,说白了就是把数据放在一个更快的地方。你想想看,每次查数据库都要走磁盘IO,慢得很。缓存就是把热点数据放到内存里,下次直接取。

我习惯把缓存比作「便签纸」。你记不住所有电话号码,就把常用的写在便签纸上。查的时候先看便签纸,找不到再去翻通讯录。这个「便签纸」就是缓存。

核心要点:缓存是介于应用和慢速存储之间的高速存储层。它的存在就是为了「快」。

1.2 缓存命中与未命中

这两个概念其实很简单:

  • 缓存命中(Cache Hit):你要的数据,缓存里有。直接返回,爽快!
  • 缓存未命中(Cache Miss):缓存里没有,得去数据库查。这就慢了。

我在项目中遇到过一种情况:明明缓存里有数据,但每次请求都穿透到数据库。后来发现是缓存key设计有问题,每次生成的key都不一样。你说冤不冤?

3. 命中率计算公式

这个公式必须刻在脑子里:

缓存命中率 = 缓存命中次数 / (缓存命中次数 + 缓存未命中次数) × 100%

举个例子:

指标 数值
总请求数 10000
缓存命中次数 8500
缓存未命中次数 1500
命中率 85%

我的经验:命中率低于80%就要警惕了。低于50%?那缓存基本白上了。我曾经接手过一个项目,命中率只有12%,查了半天发现是缓存过期时间设得太短,数据刚存进去就过期了。

1.4 缓存穿透、击穿、雪崩

这三个概念经常有人搞混。我画了一张图,一看就明白:

缓存三大杀手:穿透、击穿、雪崩 应用层 缓存层 数据库层 请求 穿透:缓存没有,直接打数据库 热点 key 击穿:热点key过期 大量请求同时穿透 雪崩:大量key同时过期 缓存层集体失效,数据库被打爆

缓存穿透

说白了就是请求的数据在缓存和数据库里都不存在。每次请求都穿过缓存,直接打到数据库。我见过最夸张的一次,有人用随机ID疯狂请求,数据库直接挂了。

避坑指南:我曾经在项目中没做空值缓存,结果恶意请求用不存在的ID刷接口,数据库CPU直接飙到100%。后来加了布隆过滤器,问题才解决。

缓存击穿

这个特指某个热点key过期。比如微博热搜第一的key突然过期了,瞬间几万个请求同时去数据库查。你想想看,数据库扛得住吗?

我习惯的做法是:热点key永不过期,或者用互斥锁保证只有一个请求去查数据库。

缓存雪崩

这个更狠。大量key在同一时间过期,缓存层集体失效。就像多米诺骨牌一样,数据库瞬间被压垮。

为什么会这样?很多新手喜欢把所有key设成相同的过期时间。比如统一设成1小时,那每到整点,缓存就集体失效一次。

我的建议:过期时间加个随机偏移量。比如基础时间1小时,再随机加1-10分钟。这样就不会集体过期了。

小结

缓存这东西,用好了是神器,用不好是灾难。我见过太多人上来就上缓存,结果问题更多。记住:先理解基础,再动手实践。

这三个概念的区别,我再用一句话总结:

  • 穿透:数据不存在,每次都穿过去
  • 击穿:热点key过期,瞬间打穿
  • 雪崩:大量key过期,集体崩塌

嗯,基础就讲到这里。下一节咱们聊聊怎么监控和排查命中率问题。到时候我会分享一些实战中的骚操作。

可可精品资料库