Redis教程:常见问题及解决方法


缓存穿透Cache Penetration

缓存穿透指的是当查询一个不存在的数据时发生查询会穿透Redis而抵达数据库,进而造成数据库的额外负载。在这种情况下,Redis的缓存形同虚设,无法起到该起的作用。当此类数据量飙升的时候(比如遭到黑客攻击),由于Redis无法拦截请求,进而造成数据库负载过重,甚至崩溃。

解决方案:

  • 在Redis缓存层添加额外的用户认证,只有通过基本认证的用户才能进行查询,这就能避免非认证用户发出的请求。
  • 在Redis层存储尽量多的不可能返回查询结果的键值,这样当用户发出这类请求时,Redis就能够有效拦截,进而避免给数据库造成额外负担
  • 即使某些查询结果返回为空,仍然在Redis中存储这种映射,但要注意其过期时间应当设置的比正常缓存值要短。

缓存雪崩Cache Avalanche

缓存雪崩指的是在向缓存中存储数据的时候,使用了同样的过期时间。这就导致一种可能,在某个时刻,缓存中的数据同时过期,进而导致缓存失效,将所有请求转向数据库,进而造成数据库负载过重,甚至崩溃。

解决方案:

  • 在定义缓存数据的过期时间时,使用一个在指定范围内的随机时间作为过期时间,这就能避免缓存数据同时失效。
  • 使用一个事务锁,或者队列使得在向缓存中写入数据的时候其写入时间时不一样的,进而导致其过期时间的不同,最终避免缓存数据的同时过期问题。

缓存击穿Cache Breakdown

缓存击穿和缓存雪崩的最大区别就是,缓存雪崩是针对的所有键值,而缓存击穿则是针对的某个键值,也就是“热”数据。当某个键值被大量并发访问时(比如遇到热点事件),正好遇到该键值的过期时间到了,进而导致对该值的访问都被重定向到数据库,最终导致数据库负载过重甚至崩溃。

解决方案:

  • 设置热点数据不过期
  • 加锁:第一个请求的线程可以拿到锁,并在拿到锁之后查询数据库获取数据并保存到缓存中,其他线程在获取锁失败后等待很短的也给时间,然后重新从缓存中获取数据。这样就能避免缓存被击穿,不会有大量请求落到数据库。

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !
  目录