redis雪崩:

redis中的key设置里相同的过期时间,导致多个key数据同时过期,客户端读请求,在redis缓存中找不到数据,就会访问数据库,在数据库中找,造成数据库访问压力过大。举个栗子:某佳琪推荐的口红在某日夜里12点到1点促销,大家在这个时间段就会去抢购这个口红,但是有很多人忘记时间了,在1点过后依然去抢购,但这时redis缓存已过期,就会去数据库中找,由于访问量过大,造成数据库压力过大,就是redis缓存雪崩。

【解决方案】
将系统中key的缓存失效时间均匀的错开,可以设置随机值。如:1~5分钟。

redis穿透:

客户端访问redis缓存中不存在的数据,就会导致请求进入数据库,造成数据库压力,这就是redis缓存穿透。

【解决方案】:
1.对查询结果为空的情况也进行缓存
2.对不存在的key进行过滤
3.增加进程级缓存(memcached),在新数据写入的时候,按照顺序依次写入 - 数据库、进程级缓存|搜索服务器、redis缓存。读操作访问顺序是 - redis缓存、进程级缓存、数据库。

redis击穿(热点)

单一key的雪崩。当某缓存数据,访问频率较高(比如某一条八卦新闻),且数据到期后,仍旧有较高的访问频率,这个时候,读请求进入数据库,造成数据库压力提高

【解决方案】
1.周期性扫描:如 - 缓存有效期是24小时,设置周期阀值为1小时,设置热点阀值为300访问频率,每小时运行一个任务,访问redis日志,统计数据的访问频率,达到阀值的数据,延长有效期。
2.互斥锁:因为缓存的构建需要一定的时间,所以在缓存失效的时候有大量的线程来构造缓存,造成后端负载加大,甚至可能让系统奔溃。所以只让一个线程来构建缓存,其他线程等这个线程执行完,重新从缓存获取数据就可以了。