redis 并发 hset redis 并发数据错乱问题_缓存


由于现在对系统的性能要求越来越高,所以使用Redis基于缓存的数据库技术使用的越来越多。今天就来记录下使用Redis要注意的三大问题及对应解决方案:

1、redis雪崩:缓存雪崩,是指在某一个时间段,缓存集中过期失效。

分为两种情况:

(1)自然失效(缓存过期)

之前缓存的数据都已经过期,再次去进行访问,势必再去数据库查询一遍,如果时间段内请求很多,势必对数据库造成很大的压力,这个压力即集中创建缓存,不过这个压力是周期性,创建好了缓存,数据库压力消失。最坏的情况是数据库承受不了这种周期性的压力而宕机。

(2)物理失效(节点宕机)

缓存服务节点宕机,从而使所有的请求都直接访问数据库,这样给数据库造成了永久的压力,很容易使数据库宕机。

解决方案:

(1)Redis搭建方面:集群redis主从+哨兵,避免全面崩盘;

(2)限流与降级,避免请求压力致使数据库崩溃;(限流的好处就在于设置每秒的请求量,最大能多少请求通过,超过最大值则挡在外面走降级策略,返回默认值或者提示,这样用户顶多多刷几次也能出来)

(3)Redis做好持久化,可以快速恢复缓存数据;

2、缓存击穿:即存在一个热键,查询频率非常高,处于集中式高并发的情况,在某一时间这个Key失效了,瞬间请求就直接打到数据库服务,致使数据库服务宕机或者性能下降很多;

解决方案:

(1)设置热键永久不过期;

(2)基于redis 或ZK 实现互斥锁,当redis中某个键失效后,只允许一个请求该键的请求获取锁通过,等待构建好缓存后再释放锁。

3、缓存穿透:即大量攻击查询(指的是恶意查询,就是redis中没有,去数据库查也查不到,如数据库id从1开始,而攻击查询每次的查询id为-1,这样的话每次的请求势redis为无物,直接打到数据库,瞬间请求给数据库服务造成很大的压力,甚至宕机...)

解决方案:只要在数据库中没查到直接写个默认值或者空值到缓存,并设置失效时间,再有相同的key来访问时,直接查询内存。