redis 缓存击穿 3

什么是缓存击穿


在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示

redis Redission 拓扑刷新 redis 刷新缓存_redis

因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义。如果在大流量下数据库可能挂掉。这就是缓存击穿。

场景如下图所示:

redis Redission 拓扑刷新 redis 刷新缓存_redis_02

我们正常人在登录首页的时候,都是根据userID来命中数据,然而黑客的目的是破坏你的系统,黑客可以随机生成一堆userID,然后将这些请求怼到你的服务器上,这些请求在缓存中不存在,就会穿过缓存,直接怼到数据库上,从而造成数据库连接异常。


解决方案


在这里我们给出三套解决方案,大家根据项目中的实际情况,选择使用.


讲下述三种方案前,我们先回忆下redis的setnx方法


SETNX key value


将 key 的值设为 value ,当且仅当 key 不存在。


若给定的 key 已经存在,则 SETNX 不做任何动作。


SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。


可用版本:>= 1.0.0


时间复杂度: O(1)


返回值: 设置成功,返回 1。设置失败,返回 0 。


效果如下


redis> EXISTS job                # job 不存在
(integer) 0