Redis缓存设计要点随谈

在高并发系统中,缓存是必不可少的一部分。没有缓存对系统的加速和阻挡大量的请求直接落到系统的数据库,系统是很难撑住高并发的冲击。所以缓存设计是系统很关键的一环。.

1、缓存更新

缓存的数据一般都是有有效期的,过了一段时间之后就会失效,再次访问时需要重新加载。缓存的失效是为了保证与数据源真实的数据保证一致性和缓存空间的有效利用性。

缓存更新一般分为3种

  1. 空间有限,当达到最大值时  根据系统的设置规则直接过期的,比如最少使用、随机等一些过期策略。
  2. 缓存设置了过期时间的。
  3. 数据库更新了,主动更新缓存数据的。

一般的话 低一致性要求的符合1和2即可。

高一致性的符合2和3的方式。

2、缓存穿透

缓存穿透指的是查询一个不存在的数据,进而导致每次都落到数据库里面去查询。

  1. 解决办法主要是缓存一个空数据,并且设置一个较短的有效期,避免每次都命中数据库。
  2. 针对查询的键key 规则进行校验,比如 id_{N}   N数据   可以对N的格式和范围进行校验,不符合的直接返回,不往下走。

这种一般是在缓存key不存在且数据库不存在的情况下发生。

3、缓存雪崩

缓存雪蹦指的是同一时间大量缓存过期或者缓存不可用,导致大量的请求进入数据层。

针对这种情况一般是 

  1. 设置缓存的过期时间,一般需要再加些随机数,避免过期时间大家都一样。
  2. 保证缓存服务的高可用。

4、缓存击穿:

指的是单个key在缓存中查不到,去数据库查询,如果数据库数据量大并且是高并发的情况下那么就可能会造成数据库压力过大而崩溃。

解决办法

  1. 使用锁机制确保缓存生成过程是单线程在操作,其他线程需等待、重试。
  2. 利用redis add 特性 直接加锁,其他请求进来,判断是进行中的直接return