这篇文章主要介绍“怎么解决redis雪崩和穿透”,在日常操作中,相信很多人在怎么解决redis雪崩和穿透问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决redis雪崩和穿透”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
解决方法是:1、缓存穿透,可以把空的数据也缓存起来和使用布隆过滤器;2、缓存雪崩,可以设置对应热点key永不过期,多缓存结合,采购第三方Redis,以及过期时间错开,过期时间使用随机生成即可。
本教程操作环境:windows7系统、Redis5.0.10版、DELL G3电脑。
Redis缓存穿透以及解决方法
一、缓存穿透
1.当用户查询的key在redis中不存在,对应的id在数据库也不存在,此时被非法用户进行攻击,大量的请求会直接打在db上,造成宕机,从而影响整个系统,这种现象称之为缓存穿透。
2.解决方案一:把空的数据也缓存起来,比如空字符串,空对象,空数组或list,代码如下
if (list != null && list.size() > 0) { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list)); } else { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list), 5*60); }
3.解决方案二:布隆过滤器
布隆过滤器:判断一个元素是否在一个数组里面,如下图,利用二进制去做的一个存储,占用内存比较小,0 代表不存在,1 代表存在,添加查询效率很快,当保存了一个数值会经过一个算法将对应的值保存到布隆过滤器的集合上的某个位置,某个位置上可能会存在多个key,当传进来一个不存在的key值,和集合进行匹配,如果匹配不上便会返回一个null
缺点:1、1%的误判率,当有一个key不存在布隆数组中,但是由于这个误判率,在某个情况下回判断这个key存在,当这个数组越长误判率越低,数组越短误判率越高
2、当我们要删除某个key值的时候,是会删除我们的数据库和redis中的内容,但是布隆数组中无法删除,因为数组的某个位置上会存在对个key如果我们要删除的话就是将1变成0,但是会将其中所有的key值都删除
3.代码复杂度也会增加,因为我们要额外去维护一个集合,当我们使用redis集群,布隆过滤器要和redis结合在一起使用
二、Redis缓存雪崩
1.缓存雪崩:缓存中的数据大批量失效,然后这个使用又要大量的请求进来,但是由于redis中的key全部失效了所有会全部请求到db上,造成宕机
2.解决方案
设置对应热点key永不过期
过期时间错开,过期时间使用随机生成,并且热点数据的过期时间设置的长一点,非热点数据可以设置短一点
多缓存结合,例如:请求进入,可以现请求redis,当redis中不存在的时候再去请求memcache,如果都没有再去请求db
采购第三方Redis(阿里云或者腾讯云上的redis)
到此,关于“怎么解决redis雪崩和穿透”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。