Redis缓存四件套的学习(七)

一、缓存四件套

1.1、缓存预热

1.1.1、什么是缓存预热

缓存预热就是在系统启动前,将数据提前加载到缓存中,这样就可以避免在用户请求的时候,先查询数据库,然后再将数据回写到缓存中

1.1.2、如何实现缓存预热

    1. 什么都不做,只对数据库操作,利用redis回写机制,逐步将数据库的数据同步到缓存中。-------最好晚上部署完成之后,自己人提前做一次,让数据写回缓存,别把这个问题交给用户。
    1. 通过中间件或程序自行完成。

1.2、缓存雪崩

1.2.1、什么是缓存雪崩

Redis主机挂了,Redis全盘崩溃;或者Redis中有大量key同时过期失效,导致大量请求直接打到数据库上,引发系统性能急剧下降甚至宕机。

1.2.2、如何解决缓存雪崩

    1. 设置不同的过期时间,避免同时失效,或者key设置永不过期
    1. redis集群实现高可用
      1. 主从 + 哨兵
      1. redis cluster(集群)
      1. 开启redis持久化机制aof/rdb,尽快恢复缓存集群
    1. 多缓存集合预防雪崩(ehcache本地缓存 + redis缓存)
    1. 限流降级
    1. 借助外力
      使用成熟的方案:阿里云数据库 ---------经济实力允许

1.3、缓存穿透

1.3.1、什么是缓存穿透

简单说就是:本来无一物,两库都没有,既不在redis中,也不在数据库中,数据库存在被多次暴击的风险。

1.3.2、如何解决缓存穿透

    1. 缓存空值或缺省值:如果发生了缓存穿透,那么就针对要查询的数据,经过商量后确定一个缺省值(0,defaultNull等),然后把这个值缓存到redis中,这样下次再查询的时候,就不会穿透到数据库了。

      注意: 这种方法只能针对key相同的情况,架不住黑客的恶意攻击(使用不存在的key去查询数据,导致缓存穿透,致使数据库压力过大而宕掉),所以这种方案只能短暂的应急使用
    1. 使用布隆过滤器:布隆过滤器可以判断某个key是否存在,如果不存在,那么就直接返回,不会穿透到数据库中。布隆过滤器可以永久使用,但是需要提前将数据加载到布隆过滤器中。

      开源布隆过滤器:
    • Guava地址(Java实现):https://github.com/google/guava
    • Bloom++(C++实现):https://github.com/ArashPartow/bloom --------作者已经很久没更新了,但是可以参考,后续花点时间参考下,融入到自己写的布隆过滤器中。

1.4、缓存击穿

1.4.1、什么是缓存击穿

简单说就是,热点key突然失效了,导致大量请求暴击数据库。

1.4.2、如何解决缓存击穿

核心思路:避免热点key失效

    1. 热点key为什么会失效?
      1. key过期,自然就失效
      1. delete key时,旧key未完全删除完毕,新key也没完全替代上去,刚巧又被访问
    1. 解决方案:
      1. 差异失效时间,对于访问频繁的key,不设置过期时间
      1. 互斥更新,采用双检加锁策略

1.5、总结

缓存问题 产生原因 解决方案
缓存不一致 同步更新或异步更新失败 增加重试、补偿任务,达到最终一致
缓存预热 未将数据提前加载到缓存中 利用回写机制自己跑一遍或者利用中间件自动定时更新
缓存雪崩 缓存挂掉 快速失败熔断、主从+哨兵模式、集群模式等
缓存穿透 缓存和数据库中都没有key,容易被恶意攻击 缓存空值或缺省值、布隆过滤器
缓存击穿 热点key失效 差异失效时间、互斥更新

0vice·GitHub

你可能感兴趣的:(Redis,redis,缓存)