热点 key 问题
我们通常使用 缓存 + 过期时间的策略来帮助我们加速接口的访问速度,减少了后端负
载,同时保证功能的更新,一般情况下这种模式已经基本满足要求了。
但是有两个问题如果同时出现,可能就会对系统造成致命的危害:
(1) 这个 key 是一个热点 key(例如一个重要的新闻,一个热门的八卦新闻等等),所以
这种 key 访问量可能非常大。
(2) 缓存的构建是需要一定时间的。(可能是一个复杂计算,例如复杂的 sql、多次 IO、
多个依赖(各种接口)等等)
于是就会出现一个致命问题:在缓存失效的瞬间,有大量线程来构建缓存(见下图),
造成后端负载加大,甚至可能会让系统崩溃 。
解决方法:
1.互斥锁
每次只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获
取数据
逻辑:redis set(nx 和 ex)