没有合适的资源?快使用搜索试试~ 我知道了~
1、高性能(动态页面静态化,将前几页数据放在缓存中) 2、高可用(高并发场景下使用,保护数据库) 1、缓存穿透:缓存和数据库中都查询不到,如果多次实行这样的查询
资源推荐
资源详情
资源评论
redis面试突击
一、为什么使用缓存
在查询数据库之前添加一层redis缓存
1、高性能(动态页面静态化,将前几页数据放在缓存中)
2、高可用(高并发场景下使用,保护数据库)
二、缓存穿透、击穿、雪崩
1、缓存穿透:缓存和数据库中都查询不到,如果多次实行这样的查询,会对数据库造成危害
解决方案:
a、对参数合法性进行校验
b、将数据库中没有查询到的数据也写到缓存中(需要防止redis被无效数据占用,数据过期时
间设置短)
c、在redis之前引入布隆过滤器(BloomFilter),在访问redis前判断数据是否存在。
注意:如果布隆过滤器判断元素不在集合中,就肯定不在,如果判断在的话,可能会存在误
判,并且,布隆过滤器只能加数据,不能减数据
2、缓存击穿:缓存中没有,但是数据库中有的情况,一般出现在数据初始化和热点key过期的情况
下,问题在于,重新写入缓存需要一定时间,如果是在高并发场景下,过多的请求就会瞬间写到DB上,
造成数据库压力
解决方案:
a、设置这个热点缓存永不过期,这时要注意在value当中包含一个逻辑上的过期时间,然后另
起一个线程,定期重建这些缓存。
b、在加载DB的时候,要防止并发,在DB向缓存写入的时候,加一个并发锁
3、缓存雪崩:缓存大面积过期,导致请求全部被转发到DB
解决方案:
a、把缓存失效时间分散开,例如,在原有的统一失效时间基础上,加一个随机值
b、对热点数据设置永不过期
三、如何保证redis与数据库内容一致
当我们对数据修改的时候,到底是先删缓存还是先写数据库
1、如果先删缓存,再写数据库:在高并发场景下,第一个线程删除了缓存,还没有来得及写数据
库,第二个线程在缓存中为空的情况下会读取数据库中的数据(旧值,脏数据),读完之后又重新写入
缓存(此时第一个线程已经将新的值写入到缓存中),这样,缓存中的值就会被覆盖为修改前的脏数据
总结:在这种方式下,通常要求写操作频繁
解决方案:
a、先操作缓存,但是不删除缓存,将缓存修改为特殊值,客户端读缓存发现是默认值,就休
眠一下,再去查一次redis。(特殊值对业务有侵入,休眠时间可能会多次重复,对性能有影响)
资源评论
笨爪
- 粉丝: 45
- 资源: 333
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功