Redis-问题-缓存穿透
1,表现:
1,应用服务器压力变大了
2,缓存命中率低
3,一直查询数据库
2,造成原因
1)redis 查询不到数据库
2) 大量非正常url访问 ( 比如遭到攻击 )
3,解决方案
一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从缓存查不到数据则不写入缓存,
这将导致这个不存在的数据每次请求到要到储存层去查询,失去了缓存的意义。
(1),对空值缓存,如果一个查询返回的数据为空( 不管数据是否真的存在),我们仍然要对这个空结果进行缓存,设置空结果的过期时间会很短,
最长不超过5分钟
(2)设置可访问的名单(白名单):
使用 bitmaps 类型定义一个可以访问的名单,名单 id 作为bitmaps 的偏移量,每次访问和 bitmaps里面的id 进行比较,如果访问id 不在bitmaps 里面,进行拦截,不允许访问。
(3)采用布隆过滤器(布隆过滤器是 1970 年布隆提出的,它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数))
将所有可能存在的数据哈希到一个足够大的bitmaps里面,一个一定不存在的数据会被 bitmaps 拦截掉,从而避免了对底层储存系统的查询压力。
(4)进行实时监控:当发现redis 的命中率急剧下降,需要排查访问的对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。