Redis 缓存之一

为什么使用缓存

优点:

  1. 高性能
  2. 高并发
    MySQL天然对高并发不好,MySQL单机支撑2000qps也开始容易报警,可以使用缓存,让数据查询从缓存中拿出数据

缺点:

  1. 缓存的数据和数据库的数据不一致
  2. 缓存雪崩
  3. 缓存穿透
  4. 缓存并发竞争

redis 和memcached 的区别

  1. Redis支持服务端的操作:Redis相比memcache来说,有更多的数据结构和并支持更丰富的数据操作
  2. memcache没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据,但是Redis支持原生的cluster模式,支持集群模式。

Redis 的线程模型

  1. Redis是基于reactor模式开发的网络事件处理器,这个处理器叫做文件事件处理器,file event handler。这个文件事件处理器是单线程的,所以Redis叫做单线程模型,采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器处理这个事件。
    如果被监听的scoket准备好执行accept,read,write,close等操作的时候,跟操作对应的文件事件就会产生,这个时候文件事件处理器就会调用和之前相关的事件处理器处理这些事件。
    文件事件处理器是单线程的,但是可以通过IO多路复用机制监听多个socket,可以实现高性能的网络通信,有可以和内部的其他线程某块进行对接,保证了Redis内部的线程模型的简单性。
    文件事件处理器包括4个部分,即多个socket,IO多路复用程序,文件事件分派器,事件处理器(命令请求处理器,命令回复处理器,连接应答处理器等)
    连接应答处理器:将事件如AE—READERABLE事件和命令请求处理器相关联。
    命令请求处理器:将请求指令中的数据读出key和value,然后完成key和value的设置。
    命令回复处理器:对本次的操作输出一个结果。
    多个socket可能并发的产生不同的操作,每一个操作对应一个不同的文件事件,但是IO多路复用程序会监听多个socket,会将多个socket放入一个对列中进行排队,每一次从排队中拿出一个socket给事件分派器,事件分派器把socket给对应的事件处理器。
  2. 文件事件
    当socket变得可读的时候(如客户端对Redis进行write操作的时候,或者close操作的时候),socket就会产生一个AE—READBLE事件,当socket变得可写的时候(客户端对Redis进行read操作),socket会产生一个AE-WRITEABLE事件,IO多路复用程序可以同时监听AE-WRITE和AE-READE两种事件,那么文件事件派发器会优先处理AE-READBLE事件,然后处理AE—WRITE事件。
  3. 文件事件处理器

    如果时客户端要连接Redis,那么会为socket关联连接应答处理器
    如果客户端要写数据到Redis,那么会为scoket关联命令请求处理器
    如果客户端要从Redis读取数据,那么会为socket关联命令回复处理器

  4. 客户端与Redis通信的一次流程

    在Redis启动初始化的时候,Redis会将连接应答处理器和AE-READABLE事件关联在一起,接着如果客户端跟Redis发起连接,此时会产生一个AE-READBLE事件,然后由连接应答处理器来处理和客户端建立连接,创建客户端对应的socket,同时将这个socket的AE-READBLE事件跟命令请求处理器关联起来。

    当客户端向Redis发起请求的时候,(不管是读或者是写的请求),首先就会在socket产生一个AE-READBLE事件,然后由对应的命令请求处理器来处理,这个命令请求处理器就会从socket中读取相关数据,然后进行执行和处理。

    接着Redis这边准备好了给客户端的响应数据之后,就会将socket的AE-WRITEABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据的时候,就会产生一个AE-WRITEABLE事件,会有对应的命令回复处理器来处理,这就是将准备好的响应数据写入socket,供客户端读取。

    命令回复处理器写完之后,就会删除这个socket的AE-WRITEABLE事件和命令回复处理器的关联关系。

  5. 为什么Redis是单线程模型也能效率那么高
    (1) 纯内存操作
    (2) 核心是非阻塞的IO多路复用机制
    (3) 单线程反而避免了多线程的频繁上线文切换问题

相关推荐