Redis作为流行的分布式缓存,在实际生产环境中会遇到缓存穿透、缓存击穿、缓存雪崩等异常场景,为了避免异常带来巨大损失,我们需要了解每种异常产生的原因和对应的解决方案,来提升系统可靠性和可用性。
缓存穿透
用户请求的数据在缓存和数据库中都不存在,用户每次请求数据都需要查询数据库,导致对后台数据库的频繁访问,数据库负载压力增大,这种现象就叫做缓存穿透。
产生原因
说明:
大量访问不存在的key,导致数据库处理大量请求
解决方案
解决缓存穿透的方法有两种,第一种是缓存空对象,第二种是使用布隆过滤器。
缓存空对象
当数据库中查不到数据的时候,缓存空对象,然后给这个空对象的缓存设置过期时间,下次再查询 数据的时候,直接从缓存中获取,从而达到了减小数据库压力的目的。
方案缺点
需要缓存层提供更多的内存空间来缓存空对象,浪费更多内存空间。
即使在缓存空对象时设置很短的过期时间,也会导致这一段时间内的数据不一致问题。
布隆过滤器
关于布隆过滤器将在后续的文章中详细讲解,本文不进行阐述。
缓存击穿
Redis中存在某些热点数据时,即有大量请求并发访问的key-value数据。当极热点key-value数据突然失效时,缓存未命中引起对后台数据库的频繁访问,这种现象叫缓存击穿。
产生原因
说明:
第一种为大量Key同一时间过期
第二种为Redis故障
解决方案
针对第一种大量Key同时过期
设置每个key的过期时间尽量不一样,可以在超时时间上添加一个随机时间长度,使它们的失效点尽可能均匀分布。
针对热度数据可以永不过期
针对第二种Redis发生故障
采用Redis的几种高可用方案部署,具体的部署方案可以参考我之前写的Redis的高可用架构。