Redis的键有两种过期方式:一种是被动过期,另一种是主动过期。
主动过期会在定时的去删除key,那么带来一个问题,那就是:Redis中如果有一批key同时过期,会导致其它key的读写效率降低
原因是因为Redis的主动过期定时任务也是在Redis的单线程模型中的主线程中执行的,也就是说如果出现了一批key同时过期,就需要删除大量的Key。那么因为命令执行是单线程的,所以这时候后面来的业务操作请求,就需要等这个删除命令执行完才可以处理业务请求。
那么这时候就会出现,业务访问延时增大的问题。
如何解决这个问题呢?有以下几个思路:
使用随机过期时间:如果可能的话,可以将键的过期时间随机分布,而不是在同一时间点过期。这样可以分散过期键删除的压力,避免大规模的键同时过期。同时也能避免缓存雪崩的问题。
使用被动删除:被动删除在每次访问的时候才会去删除key,并不会定时删除,不太容易发生大量key同时被删除的情况。但是被动删除可能会导致内存占用比较多。