Redis 应用问题解决——缓存穿透、缓存击穿、缓存雪崩、分布式锁
缓存穿透:查询不存在的数据,缓存和数据库都没有,由于缓存中没有,所有请求都会打到数据库,可能会导致数据库压力剧增。
解决方法:
- 使用布隆过滤器:在缓存之前加一个布隆过滤器,它可以用于检查一个元素是否可能存在于一个集合中。如果布隆过滤器说元素不存在,那么就可以直接返回,不必查询数据库。
- 缓存空值:如果数据库中也不存在该数据,也将一个空对象或特殊值进行缓存,并设置一个较短的过期时间。
缓存击穿:缓存失效时大量请求直接打到数据库。
解决方法:
- 设置热点数据永不过期或过期时间长一些。
- 加互斥锁:当缓存失效时,先获取互斥锁,有且只有一个线程查询数据库并更新缓存,其他线程等待。
缓存雪崩:缓存集体失效,大量请求打到数据库。
解决方法:
- 不同的key设置不同的过期时间,尽量分散失效时间。
- 实现热点数据永不过期或过期时间长一些。
- 数据预热:在系统启动或者热点数据即将过期前,提前刷新缓存。
分布式锁:在多线程或分布式系统中,保证同一时刻只有一个线程或进程可以执行某个任务。
解决方法:
- 使用Redlock算法实现分布式锁。
- 使用Redis的SETNX和EXPIRE组合实现分布式锁。
以上解决方法需要根据具体场景选择合适的策略和工具。
评论已关闭