Redis(十):引入缓存后带来的问题

1. 引入缓存后给业务带来的问题

    1.1 缓存读取

    1.2 缓存更新

    1.3 缓存淘汰

2. 缓存的三座大山

    2.1 一致性

    2.2 缓存击穿

    2.3 缓存雪崩


1. 引入缓存后给业务带来的问题

    业务系统引入缓存之后,架构由原来的两层架构变成了三层架构:

      Redis(十):引入缓存后带来的问题                    Redis(十):引入缓存后带来的问题

    由此,带来了三个问题需要解决,分别是缓存读取、缓存更新和缓存淘汰。

1.1 缓存读取

    Redis(十):引入缓存后带来的问题

    缓存读取比较简单,查询数据时首先查询缓存,如果缓存命中,则从缓存中读取数据。如果缓存不命中,则查询数据库,并且更新缓存。

1.2 缓存更新

    缓存更新时,在更新存储和更新缓存的先后关系上,如果选择更新缓存再更新存储,则有可能导致更新缓存成功但是更新存储失败,

(1)先删除缓存,再更新数据库

    // todo

(2)先更新数据库,再删除缓存

    // todo

1.3 缓存淘汰

    主要有两种策略,分别是主动淘汰和被动淘汰:

  • 主动淘汰:给键值对设置TTL时间,到期自动淘汰(推荐),这种方式可以达到缓存热数据的目的
  • 被动淘汰:内存达到最大限制时,通过LRU、LFU算法淘汰(不推荐),这种方式影响缓存性能,缓存质量不可控

2. 缓存的三座大山

2.1 一致性

    一致性主要解决一下几个问题:

(1)并行更新如何解决隔离性问题

    // todo

(2)原子性更新时如何解决部分更新的问题

    // todo

(3)如何解决读一致的问题

    // todo

2.2 缓存击穿

    缓存击穿指的是访问数据时直接绕过缓存,访问数据库。肯能会有两种原因造成这种现象:

    Redis(十):引入缓存后带来的问题

    一种是大量的空查询,比如黑客攻击;另外一种是缓存污染,比如大量的网络爬虫造成的。

(1)为了解决空查询带来的缓存击穿,主要有两种方案:

  • 第一种是在缓存层前面再加一层布隆过滤器
  • 第二种是把所有的key和热数据value加入缓存,在缓存层拦截空数据查询

    Redis(十):引入缓存后带来的问题

(2)为了解决爬虫带来的缓存击穿问题,可以设置缓存策略:

  • 针对更新的操作,需要立即缓存
  • 针对读的操作,可以在设置是否立即缓冲还是延迟缓存,以及在规定的时间窗内命中的次数是否达到一定的次数才进行缓存

2.3 缓存雪崩

    缓存雪崩指的是热数据集中淘汰,大量请求瞬间透传到存储层,导致存储层过载。

   Redis(十):引入缓存后带来的问题

    造成缓存雪崩的原因主要是TTL机制过于简单造成的,解决方案主要有以下:

(1)设置TTL时给过期时间加上一个随机的时间值

(2)每一次的访问都会重新更新TTL,此外业务可以更精准的指定热数据缓存时间

上一篇:TTL (生存时间值)


下一篇:主机操作系统的识别方法——TTL、namp -O IP、网站文件大小写 三种方法区分 推荐nmap