缓存的基本原理和设计思想

缓存失效:

  • 缓存失效:
    缓存中的key大量过期,过期后业务在缓存中无法查询到数据,造成大量的查询到数据库查询,造成数据库明显的压力上层,业务访问变慢。
  • 缓存大量失效的原因:
    一般就是过期时间比较集中导致的,比如有些数据是大批量同时从数据库加载到了缓存,又设置了相同的过期时间,那么就会造成后期大批量的数据同时从缓存中失效,然后就会造成大量查询到数据库,造成数据库压力过大,访问变慢。
    离线计算,比如火车票定时售票,微博定时计算的热门信息等
  • 解决方案:
    定时过期Base时间+随机值,确保不要在同一时间大量过期。

缓存穿透:

  • 缓存穿透:
    指的是特殊情况下应用一直在查一个不存在的,这个数据在缓存中查不到,每次都会查询到数据库。
  • 缓存穿透产生的原因:
    应用设计时考虑相当欠缺,一般只考虑了正常的数据情况,没有考虑到异常数据的查询。
    比如通过一个不存在的用户ID去查询用户数据,通过一个不存在的车次号去查询火车票信息
  • 缓存穿透解决:
    第一种方法就是查询到不存在的数据时,仍然在缓存中给这个key设置一个值,比如NULL值或者一个特殊值,这样即使查到了一个错误的值也不会每次都跑到DB去查一遍数据
    第二个方法就是为缓存构建一个BloomFilter缓存过滤器,每次查询时可以通过BloomFilter确认一下这个key是否存在,如果不存在,那就没必须要去缓存和数据库中查询了。BloomFilter 是一个非常有意思的数据结构,不仅仅可以挡住非法 key 攻击,还可以低成本、高性能地对海量数据进行判断,具体BloomFilter的知识大家可以去网上了解下。

缓存雪崩:

  • 缓存雪崩:
    系统运行过程中,缓存雪崩是一个非常严重的问题。缓存雪崩是指部分缓存节点不可用,导致整个缓存体系甚至甚至业务服务系统不可用的情况。缓存雪崩引起的原因一般有2种,
    第一种就是缓存系统没有rehash功能,大部分节点由于机器、机柜、网络等原因异常,导致整改缓存系统不能正常提供服务引发雪崩
    第二种是缓存有rehash功能,部分节点异常后会将异常节点rehash到其他正常节点,一般情况下Hash分布加Rehash机制会使缓存正常运行,但是由于节点少了,每个节点会承载更多的压力,这个时候如果有流量高峰就可能会导致缓存系统扛不住压力,从而缓存系统无法正常提供服务,引发缓存雪崩。
  • 缓存雪崩解决
    第一种方案是业务降级,在业务设计时读数据库的地方增加开关,当缓存失效,发现数据库压力过大时,可以关闭一部分读请求,减缓数据库压力防止数据库雪崩,等到缓存恢复后再恢复所有数据库请求。
    第二就是缓存架构设计时,尽量增加多个数据副本,而且多个副本要确保分布到不同的机柜,这样可以大幅降低缓存雪崩的风险。
    第三就是要对缓存系统做好实时监控,当缓存请求异常,请求变慢,机器异常告警时介绍介入处理,通过替换机器、扩容等手段确保缓存系统稳定运行,另外监测到缓存系统异常时甚至可以使用自动化接口自动进行服务降级,确保核心业务正常使用。