数据一致性问题
分布式环境下非常容易出现缓存和数据库间数据一致性的问题。针对这一点,如果项目对缓存的要求是强一致性的,那么就不要使用缓存。
我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。
合适的策略包括合适的缓存更新策略,更新数据库后及时更新缓存,缓存失败时增加重试机制。
缓存雪崩
Redis雪崩指的是缓存数据大面积过期失效,流量直接打到数据库上,增加数据库压力导致数据库挂掉。
解决方法:
- key的失效时间增加随机数 set(key,value,time+Math.random()*1000);
- 如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效。
- 设置热点数据永不过期,有更新操作就更新缓存。
缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,但用户一直发送请求,导致一直访问数据库,增加数据库的压力,严重会是数据库挂掉。
解决方法:
- 在接口层增加校验,比如用户鉴权,参数校验,访问频次校验,不合法的校验直接return。
- 布隆过滤器(Bloom Filter):利用高效的数据结构和算法快速判断出这个key是否在数据库中存在的,不存在则return,存在再查DB刷新KV在return。
缓存击穿
与缓存雪崩类似,但雪崩是因为大面积缓存失效,击垮了数据库。而缓存击穿是指一个key非常热点,在不停的扛着大量的请求,大并发集中对着一个点进行访问,当这个key是失效的瞬间,持续的大并发直接落到了数据库上,就在这个key的点上击穿了缓存。
解决方法:
- 设置热点数据永不过期
- 增加互斥锁