缓存击穿
-
概念
用户访问的key在redis中存在,但是key到了过期时间,因此需要去查询数据库。 -
影响
在高并发场景下,会让数据库压力骤增。 -
解决方案
相同业务逻辑在取缓存数据时,如果key过期,在查询数据库时,可以使用redis支持的命令setnx,对业务进行加锁处理。 -
使用setnx会带来的问题
-
死锁
通过设置锁过期时间解决 -
业务未处理完成但是锁已经过期
通过多线程解决,一个线程从数据库取数据,另外一个线程监控数据是否取回,如果没有取回延长锁的过期时间
缓存雪崩
- 概念
缓存雪崩与缓存击穿类似,雪崩是由于缓存服务器宕机或者大量key同时过期,高并发请求这些过期的key,数据库崩溃。所以缓存雪崩是缓存击穿问题的升级版。 - 解决方案
1.与解决缓存击穿方案类似,需要使用锁来控制相同业务key的查库流量
2.或者为每一个key生成一个随机的过期时间
如果有如下场景要求key必须指定过期时间呢?银行业务要求第二天调整利率,所以零点以后缓存必须清除。
这时可以通过业务代码判断零点这个时间段的业务,此时发生的请求随机睡眠一段时间,目的是分散流量,不会同时对数据库发生大量请求
setnx命令解读
该命令的含义是,如果设置的key不存在,则执行成功,如果key已经存在,那么执行失败。
因此并发场景下,只会有一笔业务可以设置成功,通过判断名称执行成功或者失败决定是否执行后续业务,因此这个命令可以模拟java中的锁。
网友评论