Redis是什么?Redis有哪三大核心问题?

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,常被用作数据库、缓存和消息中间件。它由 Salvatore Sanfilippo(网名 antirez)于 2009 年创建,使用 ANSI C 编写,具有高性能、低延迟的特点。
所以Redis一般会作为缓存,介于程序和数据库之间。
正因为Redis的高效,但是在高并发下,也会存在如下问题:

  • 缓存穿透: 缓存穿透是指多个请求同时请求某个热点Key时,这个热点Key在这一刻过期了。导致这些请求直接传过Redis而直接请求数据库,这可能导致数据库在高并发环境下被打垮,这就是缓存穿透。
  • 缓存雪崩: 缓存击穿是指多个请求同时请求Redis时,大量的Key同时失效(过期)或者在此期间Redis直接挂了。从而导致了请求直接作用于数据库,这也有可能导致数据库被打垮,这就是缓存雪崩。
  • 缓存击穿: 缓存击穿是指多个请求请求Redis时,Redis中没有,再向数据库进行请求时,数据库中也没有,这就是缓存击穿。

那如何解决这几个问题呢?

缓存穿透的解决方法

缓存穿透的本质是多个请求请求某个热点Key时,这个热点Key过期。所以有以下解决方法:

  • 为热点Key设置为永不过期
  • 为请求设置锁并让其进行排队请求(这里可以直接使用全局锁synchronized,或者直接使用分布式锁)

缓存雪崩的解决方法

缓存雪崩的本质是多个请求请求Redis时,大量的Key同一时间同时过期或者是这时Redis直接挂了。所以有以下几个解决方法:

  • 为这些Key设置随机过期时间,让其不会在同一时间过期(对于Key大量过期的解决方法)
  • 使用Redis的高可用特性,合理部署Redsi集群,同时为其设置哨兵模式(对于Redis直接挂了的解决方法)

缓存击穿的解决方法

缓存击穿的本质是,请求请求的数据在数据库中是没有的。所以对于这个的解决方法有以下几种:

  • 在程序和Redis中间为请求数据设置一个范围,如果请求的数据不在这个范围,不必请求Redis数据库
  • 缓存空数据,指请求数据库后,将数据库没有查到的数据,设置到Redis中(Key为数据,Value为空)
  • 使用布隆过滤器,为数据设置白名单,或者为请求设置黑名单

这就是Redis的三大问题和解决方法,你学会了吗?