redis穿透和雪崩(及解决办法)
redis穿透:
正常执行路径,由请求数据开始,首先从redis缓存中拿数据,
如缓存中没有的话就会去查数据库,再写到redis缓存中。
如果有人请求一条并不存在的数据时,redis里面没有,它就会去访问数据库,但数据库中也没有,
所以无法将把数据写回redis缓存。
因此每次请求这个数据时便会直接去访问数据库。如果请求的数量太大的话,
全部穿过redis去访问数据库,数据库便会承受不了庞大的访问数量,这便是穿透。
解决办法:
在redis里面用一个set集来把数据库查询的那个查询主键都读出来存到这个set集里面。
如有请求时,先查寻redis里set是否匹配主键,如没有就直接返回,不查数据库。
如有的话查redis,如果没有才去查数据库并把数据库里的数据写到缓存中。
redis雪崩:
在大量设置了失效时间的key(即数据),同时过期的时候,
又有大量请求,去访问这些key时,因为redis里没有找到数据,
大量的请求就涌向数据库,这样便导致数据库处理不过来,导致“雪崩”。
解决办法:在设置失效时间时,给key加一个随机秒数(0~60),
来让这些请求错开对数据库的访问。这样数据库就能应付过来了。
如果这个key的访问频率频繁时,可以让它每查一次便给它加点有效
时间。
这样就能解决雪崩问题了
具体解决见下篇