redis之缓存穿透

60 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

前言

在前几天的文章中,我们已经讲述了缓存更新的几种策略和这几种策略的优缺点,说明了不同情形下应该选择哪一种策略。所以接下来我们将会讲缓存的其他问题——缓存穿透。

什么是缓存穿透

当我们查找数据时,如果缓存里面没有的话就去持久层(数据库)中去找。可要是连数据库都没有的话,就没法在缓存层起作用。这就意味着每次这个数据的查找都需要去持久层里面找。这样缓冲层的作用就被废除了,缓存也就被“穿透”了。

解决方法

设置空对象返回

这个就十分的简单好理解。当持久层为空时,就在缓冲层中用对应的key设立空值。注意这个空值也是要占redis空间的。所以我们在设置这个键的有效时间时可以设置的短一点。且如果在缓存层空值有效期间,持久层发生了对应的变换,这是数据不一致可能会影响用户的使用,这时我们要用消息系统或其他方式主动清除对应空值。

方法一优缺点

这个实现简单,维护方便。但是就像上面说的会造成多余的内存消耗和短期内数据的不一致。

布隆过滤器

这个是一个算法,他的作用是判断一个key是否在是否在白名单中,不在的话就不允许去持久层查数据。如果不在白名单的话就直接返回空或者失败。

方法二优缺点

这个算法虽然查询效率非常高,但是存在着一定的错误率且实现比较复杂。其优点就是占空间少。

其他方法

这里的方法比较没有那么常使用,大家看看就好,首先是业务后端对数据进行校验,减少极其不合理数据的出现,然后是设置黑名单对一些用户进行查询限制。