美文网首页
redis缓存问题

redis缓存问题

作者: 墨线宝 | 来源:发表于2023-11-28 10:09 被阅读0次

    redis缓存问题

    缓存击穿

    缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db

    解决方案:

    • 利用互斥锁,缓存中没有,先获取锁,再去请求数据库,写入缓存,这样后面的数据就可以从缓存中拿到数据了
    • 不对该数据设置过期时间,而是由专门的定时任务从数据库进行读取来更新缓存数据

    缓存穿透

    请求缓存和数据库中不存在的数据,导致每次请求都到数据库中去查询,导致数据库压力过大

    解决方案:

    • 如果数据库不存在,也设置一个默认值放入缓存,这样第二次到缓存中获取就有值了,不会继续访问数据库,可以把缓存时间设置的短一些 (适用场景:数据命中不高;数据频繁变化实时性高)

    • 利用互斥锁,缓存中没有,先获取锁,再去请求数据库,没有获取到锁的,先等待在进行重试

    • 利用布隆过滤器,类似于一种哈希表,用所有可能的值生成一个bitmap,内部维护一系列合法有效的key进行拦截,如果不合法直接返回,guava中有实现BloomFilter (适用场景:数据命中不高;数据相对固定实时性低)

    缓存雪崩

    缓存同一时间大量失效或者由于某些原因缓存不能提供服务,导致大量请求直接访问数据库,从而导致数据库压力倍增,造成数据库也宕机

    与击穿的区别:雪崩是很多key过期,击穿是某个热点key

    解决方案:

    • 在设置缓存时间时,加上一个随机值,避免集体失效[无法解决热点数据问题(同一时刻访问同一条数据)]
    • 只让一个线程构建缓存,其他线程等待构建缓存的线程执行完,重新从缓存中获取数据,保证了每个时刻只有一个线程在执行请求,但是会导致很多线程在等待一个线程,降低了系统的qps
    • 双缓存,缓存1中设置过期时间,缓存2中在启动时加载,进行缓存预热,先访问缓存1,如果有值则返回;缓存1没有值,则访问缓存2,返回数据,并启动异步更新线程来同时更新缓存1和缓存2的数据,如果value特别大的话会占用很多内存,内存利用率低
    • 缓存不存在后查询数据库操作可以进行限流,防止大量请求直接访问数据库

    还需要预防缓存宕机

    • 保证缓存服务高可用
    • 进行限流并降级

    缓存一致问题

    如何保证缓存与数据库一致呢?先删除缓存,然后加锁,获取数据

    读的时候,先读缓存在读数据库,数据库取出数据后放入缓存;更新的时候先更新数据库,再删除缓存

    https://zhhll.icu/2021/数据库/非关系型数据库/redis/基础/11.redis缓存问题/

    本文由mdnice多平台发布

    相关文章

      网友评论

          本文标题:redis缓存问题

          本文链接:https://www.haomeiwen.com/subject/izgtgdtx.html