• Redis缓存常见问题


    缓存击穿

    缓存中没有但数据库中有的数据(一般是缓存时间到期),同时高并发读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大

    解决

    1.设置热点数据永远不过期。
    2.加互斥锁,没有命中缓存的时候,加锁访问数据库,不造成数据库的瞬间压力

    缓存穿透

    用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

    解决

    1.使用布隆过滤器。
    布隆过滤器简单理解就是将数据库存在的东西映射到一个bitmap(位图)上,方位先查询有没有,有再访问,没有就直接返回。
    布隆过滤器的缺点:只能增加,不能删除。
    解决:使用布谷鸟过滤器
    布隆过滤器详解参考:https://segmentfault.com/a/1190000016721700
    2.设置空值缓存
    当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源。

    缓存雪崩

    缓存雪崩是指,缓存层出现了错误,不能正常工作了。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

    解决

    1.redis高可用,搭建的集群。
    2.特定业务失效时间是固定的,且访问并发比较大,限流降级,控制读数据库写缓存的线程数量。
    3.数据预热,大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

  • 相关阅读:
    工具推荐-css3渐变生成工具
    IE6bug-overflow不能隐藏的bug
    cs3属性操作js
    多级联动下拉菜单(原生js)
    js表单验证大全
    js-运动框架(时间版)
    LeetCode 677. 键值映射
    LeetCode 28. Implement strStr()
    计网学习笔记(5)
    计网学习笔记(4)
  • 原文地址:https://www.cnblogs.com/farmersun/p/12735269.html
Copyright © 2020-2023  润新知