Redis 知识整理

1、 redis 内存模型单线程、Redis性能高的原因

  • Redis指令处理逻辑
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Redis 基于Reactor模式开发了一个名为 File Event Handler 的网络事件处理器;
    这个事件处理器是单线程的,所以称Redis 是单线程的。

    Redis 核心是通过IO多路复用的方式监听多个socket,并根据socket传输的事件类型将
    事件分发给不同的事件处理器处理。

    Redis的核心模块包含四个:被监听的多个Socket、IO多路复用程序、事件分派器、事件处理器。
    IO多路复用程序通过将会将有事件的多个socket 放入队列,每次取出一个socket,
    并根据事件类型通过事件分派器将事件分给对应的事件处理器处理;每次处理一个,处理完一个取一个;

    以上,便是redis处理命令的基本逻辑。
  • 高性能原因:
    1
    2
    3
    4
    5
    而 Redis 性能高的原因可以分为以下三点:
    1、纯内存操作
    2、采用非阻塞的IO多路复用所以快
    3、单线程方式由于没有多线程方式需要来回切换上下文的操作,所以快。

2、 缓存的三大问题 缓存雪崩、缓存击穿、缓存穿透 与解决办法

  • 缓存雪崩:缓存在某段时间内大面积失效,后面的请求都落在db上,导致数据库短时间承受大量请求进而崩溃。
    • 解决办法(4个)
      • 将缓存的过期时间设置的随即些,以防止缓存同一时间大面积失效。
      • 在缓存中追加缓存字段,当缓存失效,则更新缓存。
      • 缓存预热(即,针对项目启动时,缓存中无数据的场景,此时应从数据库中取出数据使用并缓存,而后的请求便可以直接使用缓存数据)。
      • 使用互斥锁。(即保证接受到多个请求时,只有一个请求操作缓存,当缓存失效取出db中的数据以更新缓存;之后的请求,可以使用缓存)。
  • 缓存击穿:
    1
    2
    3
        缓存中不存在数据,数据库中存在数据,而并发用户数增加,同时请求某一条这样的数据,同时从缓存中未取到数据,又同时从数据库中取,进而导致数据库
    短时间接受的请求增多,压力增大;
    缓存击穿 说的是针对同一数据的并发量增大,导致db压力增大;缓存雪崩 说的是不同数据同时国旗,导致db接受请求增多,压力增大。
    • 解决办法(2个):
      • 将热数据的有效期设为永不过期
      • 使用互斥锁。
  • 缓存穿透:缓存中无数据,数据库中也无数据,此时所有的请求均落在db上,导致数据库承受大量请求进而崩溃
    • 解决办法(3个):
      • 接口层增加逻辑校验,例如权限校验、id!<=0 等,以期望拦截无效请求。
      • 针对 缓存、db都没有的数据,以key-null 的形式缓存;并设置较短的有效期(太长可能会影响性能)。
      • 使用布隆过滤器,即将所有可能的数据hash并放入足够大的bitmap;接受到请求后,判断请求对应的hash是否在bitmap中,如果没有则拦截( 有请求,必有hash在bitmap,有hash 在bitmap
        不一定有数据,原因:hash算法存在hash碰撞(即:不同的数据,hash后的值可能存在相同))