跳到主要内容

缓存穿透

看到这穿透就报警110,保证没问题。

主要原因

一般是黑客攻击引起的。

问题所在key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到, 请求都会压到数据源,从而可能压垮数据源。 比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有, 若黑客利用此漏洞进行攻击可能压垮数据库。

图解

缓存穿透

解决方案

一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑, 如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询, 失去了缓存的意义。

空值缓存

如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存, 设置空结果的过期时间会很短,最长不超过五分钟。如果在这五分钟内,该key对应的值刚好新添加了, 那么可以在添加的时候使用消息队列等操作把缓存设置一下即可,从而避免了缓存和数据不一致问题。 但是一般黑客会在短时间内造成大量的无用key出现,也会影响redis缓存服务的稳定性可用性。

设置访问白名单

使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量, 每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。

使用布隆过滤器

它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。 布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。) 将所有可能存在的数据哈希到一个足够大的bitmaps中,一个一定不存在的数据会被 这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。

实时监控

当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据, 和运维人员配合,可以设置黑名单限制服务。如果出现大量交易上的严重问题,可以直接报警处理。