前言
本文我们整理总结下Redis使用过程中一些常见的问题,并研究如何解决。
缓存穿透
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如
DB)。
简介
缓存穿透是指在高并发下查询key不存在的数据,会穿过缓存查询数据库。导致数据库压力过大而宕机 。
解决方案
解决方案:
-
对查询结果为空的情况也进行缓存,缓存时间(ttl)设置短一点,或者该key对应的数据insert了之后清理缓存。
存在的问题:缓存太多空值占用了更多的空间
-
使用布隆过滤器。在缓存之前在加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key 是否
存在,如果不存在就直接返回,存在再查缓存和DB。
关于布隆过滤器,是1970年布隆提出的,实际上是一个很长的二进制向量和一系列随机hash映射函数。
布隆过滤器是加在客户端和缓存层之间的一个过滤器,可以检索一个元素是否在集合当中,如下图所示:
布隆过滤器的基本思想是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个数组中的K 个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如 果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。
示意图如下:
布隆过滤器有什么优势呢?
最大的优势就是快。布隆过滤器的空间效率和查询时间都远远超过一般的算法,因为都是hash值计算,时间复杂度都是O(1)。把字符串转换成位(0或1)进行存储,节省了大量空间。
缓存雪崩
简介
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如