redis击穿:
请求数据顺序,首先会从redis缓存中拿数据,若未拿到则查数据库,再写到redis。如果是请求一条根本不存在的数据时,则会去直接访问数据库,但是数据库也没有,所以它也没把数据写入redis缓存。所以每次这种请求都会直接访问数据库。如果请求的数量太大的话,这种绕过redis直接访问数据库情况则成为击穿。
解决办法:
1、在查询数据库的时候若未查询到数据,依然在redis中保存一条记录,并把value设置为null或者其他便于区别的值,可以再给该条数据设置一个过期时间,那么以后再有请求过来访问时就不会绕过redis直接去查库。
2、在从redis中获取数据前增加查询校验,对所有可能存在的查询参数缓存到hash集合中,若某个请求在该集合中存在,则可以访问rides,若不存在则直接丢弃该请求。
-----------------------------------------------------------------------------------------------------------------------------
redis雪崩:
每个key(即数据)如果设置了失效时间的话,如果大量key同时过期的时候,或者说因为某种原因redis中的数据突然大批量丢失,这些key又大量地去请求这些key时,因为redis里面没有这些数据,就会大量的请求就会大量涌向数据库,就会导致数据库处理不过来,导致“雪崩”。
解决办法:
1、设置均匀的过期时间,避免某段时间出现大批量数据失效
2、在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
3、做二级缓存,一级缓存未查询到数据,则从二级缓存查询