Redis 的缓存击穿问题是指一个非常热门的 key 在缓存过期的一瞬间,同时有大量的并发请求访问这个 key,导致所有请求都落到了数据库上,造成了数据库的压力瞬间增大,甚至可能会导致数据库宕机。为了解决这个问题,可以采取以下几种方法:
1. 设置热点数据永不过期
对于一些非常热门的 key,可以将其设置为永不过期,这样就可以避免在缓存过期时出现缓存击穿的情况。但是需要注意的是,这种方法会占用较多的内存空间,需要根据实际情况进行权衡。
2. 加锁
在缓存失效的时候,可以使用分布式锁来保证只有一个线程去查询数据库,其他线程等待结果即可。这种方法可以避免大量的并发请求落到数据库上,但是需要考虑锁的粒度和性能问题。
3. 延迟缓存双写
在缓存失效的时候,可以先从缓存中获取数据,如果获取失败则从数据库中获取,并将获取到的数据写入缓存中。这种方法可以避免大量的并发请求落到数据库上,但是需要考虑缓存和数据库数据的一致性问题。
4. 使用布隆过滤器
在缓存中使用布隆过滤器,可以先判断请求的 key 是否存在于布隆过滤器中,如果不存在则直接返回结果,避免了对数据库的查询。但是需要注意的是,布隆过滤器会有一定的误判率,因此需要根据实际情况选择合适的误判率和哈希