Redis 缓存穿透
缓存穿透是指针对Redis中没有,数据库中也没有的数据进行查询,这类查询会直接到达数据库, 当有大量这类请求时,有可能搞垮数据库,导致服务瘫痪。
解决方法一: 请求穿透Redis时,无论数据库查出什么结果,都会写到Redis里,如果是不存在数据,只需要设置一个较短的过期时间。这样针对同一个参数,就能够直接被Redis拦截。但在短时间内如果有大量的不同参数的穿透请求的话,会导致Redis占用内存快速上升。
解决方法二: 使用查询数据库之前,使用布隆过滤器检验参数是否有效,这是非常好的一种方式。
Redis 缓存击穿
缓存击穿是指Redis中没有,数据库中有的数据进行查询,而且这个key是一个热点的key,当这个热点key突然失效的时,会导致大量的查询请求打到数据库上。如果redis一开始就没有这个key,但突然有大量请求来访问这个key的话,也算时缓存击穿。
解决方法一: 让改热点key的缓存永远不过期,但解决不了冷门key突然被大量访问
解决方法二: 加载数据时使用互斥锁,可以通化Redis的Set NX 实现
Redis 缓存雪崩
缓存雪崩指的是大量缓存集中失效,导致请求全部打在数据库上。Redis服务器突然挂掉了也会导致大量key失效。如果突然出现大量请求访问不同的key,这些key不存在于Redis,但存在于数据库中时,也会导致缓存雪崩
解决方式一: 针对缓存集中大量失效的情况,缓存失效时间可以在一定时间范围内随机,避免集中过期
解决方式二: 针对Redis服务器突然挂掉导致的情况,可以依赖Redis的高可用方案,如Redis Sentinel 和 Redis Cluster
解决方式三: 针对大量不存在Redis中key的请求,可以使用缓存预热的方式或者是对数据库请求使用互斥锁进行控制,避免大量请求打到数据库中
Redis缓存预热
Redis启动时,不存储任何缓存,如果直接对外服务,可能会出现大量请求直接打到数据库的情况,容易导致数据库崩溃,这时候就需要提前加载数据到Redis中。但很明显,数据库中的数据量很大的时候,是不可能全部加载到Redis中的,所以需要能够对请求进行统计,根据统计数据分析哪些是热点key,在下次启动Redis时提前加载到内存中。