缓存穿透的解决方法:1、把空的数据也缓存起来;2、利用布隆过滤器。2、缓存雪崩的解决方法:1、设置对应热点key永不过期;2、过期时间错开,过期时间使用随机生成,且热点数据的过期时间设置的长一点;3、多缓存结合;4、采购第三方Redis。
本教程操作环境:windows7系统、Redis6版、DELL G3电脑。
Redis缓存穿透和雪崩的解决方法
一、缓存穿透
当用户查询的key在redis中不存在,对应的id在数据库也不存在,此时被非法用户进行攻击,大量的请求会直接打在db上,造成宕机,从而影响整个系统,这种现象称之为缓存穿透。
解决方案一:把空的数据也缓存起来,比如空字符串,空对象,空数组或list,代码如下
if (list != null && list.size() > 0) { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list)); } else { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list), 5*60); }
解决方案二:布隆过滤器
布隆过滤器:
判断一个元素是否在一个数组里面,如下图,利用二进制去做的一个存储,占用内存比较小,0 代表不存在,1 代表存在,添加查询效率很快,当保存了一个数值会经过一个算法将对应的值保存到布隆过滤器的集合上的某个位置,某个位置上可能会存在多个key,当传进来一个不存在的key值,和集合进行匹配,如果匹配不上便会返回一个null
缺点:
1、1%的误判率,当有一个key不存在布隆数组中,但是由于这个误判率,在某个情况下回判断这个key存在,当这个数组越长误判率越低,数组越短误判率越高
2、当我们要删除某个key值的时候,是会删除我们的数据库和redis中的内容,但是布隆数组中无法删除,因为数组的某个位置上会存在对个key如果我们要删除的话就是将1变成0,但是会将其中所有的key值都删除
3、代码复杂度也会增加,因为我们要额外去维护一个集合,当我们使用redis集群,布隆过滤器要和redis结合在一起使用
二、Redis缓存雪崩
缓存雪崩:缓存中的数据大批量失效,然后这个使用又要大量的请求进来,但是由于redis中的key全部失效了所有会全部请求到db上,造成宕机
解决方案
1.设置对应热点key永不过期
2.过期时间错开,过期时间使用随机生成,并且热点数据的过期时间设置的长一点,非热点数据可以设置短一点
3.多缓存结合,例如:请求进入,可以现请求redis,当redis中不存在的时候再去请求memcache,如果都没有再去请求db
4.采购第三方Redis(阿里云或者腾讯云上的redis)
【相关推荐:Redis视频教程】
以上就是redis缓存雪崩和穿透如何解决的详细内容,转载自php中文网
发表评论 取消回复