搜索
写经验 领红包

缓存edis出错(edis缓存三大问题)

导语:Redis 缓存异常浅谈

缓存redis出错(redis缓存三大问题)

Redis缓存异常的情况一般分为三种:缓存穿透、缓存雪崩、缓存击穿。

1、缓存穿透

指的是缓存和数据库中都没有的数据,而用户不断发起请求,这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:接口层增加校验,例如用户鉴权校验,timestamp判断时间差,IP等;从缓存获取不到数据时,在数据库中也没有获取到,此时可以将key-value设置为key-null,缓存有效时间设置的相对短一些(30秒,时间太长可能会影响正常情况下的访问)。用于防止攻击用户反复用同一ID暴力攻击;引入布隆过滤器,将所有可能存在的数据哈希到一个大的BitSet中,不存在的数据将被拦截,从而避免了对底层存储系统的查询压力。布隆过滤器:引入多个相互独立的哈希函数,保证在给定的空间及误判率下完成元素的判重过程。优缺点:优点是空间效率和查询时间上优化明显,缺点是有一定的误判率和删除困难问题。Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。Hash存在一个冲突(碰撞)的问题,用同一个Hash得到的两个URL的值有可能相同。为了减少冲突,我们可以多引入几个Hash,如果通过其中的一个Hash值我们得出某元素不在集合中,那么该元素肯定不在集合中。只有在所有的Hash函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。这便是Bloom-Filter的基本思想。Bloom-Filter一般用于在大数据量的集合中判定某元素是否存在。2、缓存雪崩

指的是缓存中数据大批量到达到期时间,而查询数据量很大,引起数据库压力倍增甚至崩溃。

解决方案:缓存数据过期时间随机设置,防止同一时间大批量缓存过期;当缓存数据库分布式部署时,将热点数据均匀分布在不同的缓存数据库中;热点数据设置永不过期,仅更新时覆盖。3、缓存击穿

指的是缓存中没有但数据库中有的数据(例如缓存到期),此时若并发用户很多,同时读取缓存没读到数据,然后又同时去数据库读取数据,引起数据库瞬时压力增大。

解决方案:热点数据设置永不过期,仅更新时覆盖;加入互斥锁,避免同时读取数据库。缓存热点key

缓存中的一个Key,在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方案:

对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。

本文内容由快快网络小玥整理编辑!