跳到主要内容

分布式缓存

定义

分布式缓存就是将本地缓存和应用系统给分离出来,从而可以让多个应用系统使用同一套缓存系统。该缓存系统可以是单机也可以是分布式集群,从而提高缓存系统的能力,加快整个分布式系统的响应速度。通常会使用MemchacheRedis来实现分布式缓存系统。

分布式缓存这么强,同时也面临着风险,你需要去解决常见的几个问题:缓存雪崩缓存击穿缓存穿透

缓存雪崩

通常情况下任何缓存都会设置一个超时时间,因为分布式系统很难保证缓存和数据库的强一致性,设置超时时间避免缓存和数据中的数据长期不一致。

如果缓存中key设置的超时时间是一样的,那么就会可能key同时超时,这个时候来了海量的请求,那么请求就会直接全部打到数据库中,这就是缓存雪崩的场景。(常见于系统部署缓存预热)

解决方案就很明显了,不能让所有的key同时超时,所以设置超时时间需要额外加一个随机数,避免所有key同一个时间超时。

缓存穿透

请求一些请求参数不存在的缓存,因为缓存中没有,所以这类请求就需要去查询数据库。

解决:

  1. 缓存一个null,查询不到缓存直接返回null,但是大量的null值也会占用很多空间。

缓存击穿

某些热key超时失效,那么涉及到这些到请求就会去查询数据库,到时数据库压力倍增。

解决可以给热key的缓存值,设置一个逻辑过期时间。请求得到缓存后,判断一下这个逻辑过期时间,如果时间过了,那么请求一次DB更新缓存。如果请求DB之前还有分布式锁的话,如果拿不到分布式锁就可以返回该逻辑过期时间点的数据。