前言:
Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面,但同时,它也带来了一些问题,其中,最要害的问题,就是数据一致性的问题,从严格意义上讲,这个问题无解,如果对数据的一致性要求很高,那么就不能使用缓存
缓存穿透(查不到)
概念:
缓存穿透的概念很简单,用户要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是想持久层查询,发现也没有,此类现象称为缓存穿透
后果:当大量的读请求缓存都没有命中,于是都请求了数据库,这会给持久层数据库造成很大压力,甚至造成服务器挂掉
解决方案:
1,布隆过滤器(BloomFilter)
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,存储所有有数据的key,这样就可以在读请求访问的时候先通过布隆过滤器去判断当前数据库是否有对应的值,有则返回数据的位置地址,无则返回null
问题:由于布隆过滤器没有删除相关操作,那么当数据库已经删除key时,布隆里依旧会存在,所以可以对应那些删除的key在缓存中存储null,
2.缓存空值
当缓存不命中时(就是说经过过滤器,给他返回null),那么也给他缓存起来,之后在访问这个数据就会从缓存中获取,保护了后端数据源。,一般会给这种key设置过期时间
面临的问题:
(1)如果空值被缓存起来,那么就意味着要需要更多的键去存储没用的空值,占用空间浪费资源
(2)即使对空值的数据设置看过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口不一致,对于需要保持一致性的业务会有影响
缓存击穿(量太大,缓存过期)
经典例子:微博服务器宕机
概述:
指一个key非常热点,在不停扛着大并发,大并发集中一个点进行访问,当这个key失效的瞬间(key过期了),持续大并发就会穿破缓存,直接访问存储层,查到后回写至缓存,但这个读请求是一个持续的高并发的,这就会给数据库瞬间带来很多压力,设置导致数据库崩掉,导致后台一个接着一个的服务垮掉,犹如雪崩一般
解决方案:
1,设置热点永不过期
2,贾互斥锁,就是给key加分布式锁,保证每个key同时只有一个线程在查询后台服务
缓存雪崩
概念:
缓存雪崩指的是短时间内,缓存中有大量的key几种过期,此周期内请求访问呢过期的数据,redis均为命中,于是向数据库获取数据,数据库同时收到大量的请求无法及时处理,造成redis大量请求被积压,开始出现了超时现象,数据库同时压力剧增,面临崩溃。
后果:
(1)redis服务器资源被严重占用,redis服务器崩溃;
(2)redis集群呈现崩塌,集群瓦解;
(3)应用服务器无法及时得到数据响应的请求,来自客户端的请求数量越来越多,应用服务器奔溃;
(4)应用服务器,redis,数据库全部重启,效果不理想。
解决方案:
(1)服务降级:短期内将不重要的服务停掉,节省下来的资源全部交给重要的服务
(2)数据预热:就是在开放服务之前先将服务预期要面临的问题先测试一遍,提前做好准备
(3)Redis高可用:异地多活,多加几台redis