揭露缓存雪崩与缓存穿透Redis解决之道(redis雪崩与缓存穿透)
缓存雪崩是指网络流量大增时,对应的访问请求越超出缓存服务器的处理能力,超出缓存数据瞬间失效,从而将请求转发至后台的数据库服务器进行处理的一种性能问题,其表现形式是突发的访问瞬间较慢甚至宕机。而缓存穿透是指发送大量不存在的记录,由于缓存中不存在该记录信息,系统会每次直接把请求转发至后台的数据库进行查询,从而造成后台数据库压力过大。
Redis作为NoSQL数据库,具备极快的读写性能,使得它成为建立缓存的首选,消除雪崩和缓存穿透的可行解决方案是在客户端使用一定算法(比如采用随机访问,排队的方式来减轻缓存的冲击)和在redis后端对高并发的引起的大量的无效访问拦截。
针对缓存雪崩,redis给出的解决之道就是增加了缓存“热点Key”的自我维护能力,在Redis服务端使用了LFU策略,当访问量高的Key被多次访问时,就会被标记记录在cache LFU链表中,加上LFU策略,可以降低缓存雪崩对缓存系统的影响。
而对于缓存穿透,redis通过提供“黑洞key”,即在永不过期的key中存储null空值,使之拦截所有不可用的key访问,从而达到拦截缓存穿透的目的,增加缓存的有效访问率,以减少数据库的压力。
在解决缓存雪崩与缓存穿透的问题上,redis提供的解决方案无疑大大提高了服务的性能,服务端对高并发的引起的大量无效访问拦截,缓存“热门Key”的自我维护能力,和针对不可用key访问拦截“黑洞key”,都使得服务性能得以提升。
示例代码
// Set ‘BlackHole’ entry that never expired
redis.setex(‘BlackHole’, 3600, null)
// Intercept the non-existing key requests
If (redis.exists(key) == false):
// Stop & response null
redis.get(‘BlackHole’)
Else:
// Continue request
redis.get(key)