缓存数据库Redis

2022-05-13 11:11:22 浏览数 (1)

一、缓存数据库的由来和必然

Mysql数据一般存放在磁盘,效率比较低.虽然在数据库层也做了对应的缓存,但是这种缓存一般针对的是查询的内容而且粒度也比较小,一般只有表中数据没有发生变化时候,缓存才能起作用.这并不能减少业务系统对数据库产生的增、删、查、改的庞大IO压力。 这些需求使得缓存数据库应运而生

二、数据库缓存的技术特点
  • 对热点数据的高速缓存
  • 提高应用的响应速度
  • 缓解后端数据库的压力
三、缓存中间件Memcache VS Redis
代码语言:javascript复制
Memcache:代码层次类似Hash         Redis
>支持简单数据类型                  >数据类型丰富
>不支持数据持久化存储              >支持数据磁盘持久化存储
>不支持主从                        >支持主从
>不支持分片                        >支持分片
四 、Redis为什么可以这么快(每秒可以10w 查询)
  • 完全基于内存,绝大部分请求是纯粹的内存操作(不涉及硬盘IO),执行效率高
  • 数据结构简单(没有表都是KV键值对,数据之间无关系),对数据操作也简单
  • 采用单线程,单线程也能处理高并发请求,想多核也可启动多实例(避免了频繁的上下文切换和锁竞争) ---这里单线程指的是处理网络请求时候只有单线程处理.比如redis持久化可能用子进程,子线程执行
  • 使用多路I/O复用模型,即非阻塞IO(redis是跑在单线程I/O中的,所有操作都是线性执行的,这就会导致I/O阻塞,因此我们需要多路I/O复用模型)
五 、Rdis采用的I/O多路复用函数:epoll/kqueue/evport/select
  • 具体采用何种复用函数因地制宜,根据编译平台的不用采取不同I/O多路复用函数
  • 优先选择时间复杂度为O(1)I/O多路复用函数作为底层实现
  • 以时间复杂度为O(n)的select作为保底
  • 基于react设计模式监听I/O事件

以上几点都比较好理解,下边我们针对多路 I/O 复用模型进行简单的探讨:

它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。 文件事件处理器的结构包含 4 个部分:

  • 多个 socket
  • IO 多路复用程序
  • 文件事件分派器
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理.

多路 I/O 复用模型

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。 这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。 IO复用模型比较形象的解读

0 人点赞