Redis使用可能遇到的问题以及解决方法
一、穿透
原因:访问缓存中没有,数据库中也没有的数据,感觉像穿透了缓存层,直达数据库
解决方法:
- 查一个不存在的数据时,给一个设置一定过期间的key的数据,存入缓存
- 布隆过滤器:先把缓存中的数据的key存入到布隆过滤器中,查询缓存前,先判断当前key在布隆过滤器中是否存在,如果一定不存在则直接返回,如果可能存在就查询缓存,没有,再查询数据库。
布隆过滤器实现原理:
1、在将数据存入Redis时,会同时存储一个Redis的键到布隆过滤器中,会通过布隆过滤器提供的多个Hash函数对Key进行Hash运算,再对位数组长度进行取余,得到一个下标,将该下标值设置为1
2、在查询时,会先按存储Redis到布隆过滤器中的方法,去判断当前的Key是否在布隆过滤器中,结果有两种----一定不存在【位数组对应的下标上有一个或多个是0】,直接返回;有可能存在【位数组对应的下标上每个对应值都1】,查Redis。
二、击穿
原因:某一个热点数据的key突然过期,造成大量请求直达数据库
解决方法:
- 热点数据永不过期:设置定时任务,凌晨2点更新缓存数据【先删除缓存中的数据,再查询数据,再写入缓存】
- 接口限流或者降级
- 分布式锁
三、雪崩
原因:缓存中在同一个时间点有大量的key同时过期,请求查询缓存中没有,直达数据库
解决方法:
- 分布式锁
- 接口限流或者降级
- key随机过期时间