一、数据类型
Redis 自身是一个 Map,其中的所有数据均采用“key:value”的形式存储。
数据类型指的是存储的数据的类型,即 value 部分的类型,key 的部分只能是字符串。
value 部分的数据类型:<String、List、Hash、Set、Zset、HyperLogLog>
- String(字符串),最基本的类型,用于存储简单的字符串数据;
- List(列表) 是双向链表实现,存储的数据都是 String 类型;
- Set(集合)使用哈希表实现,键是元素的值,value是一个整数,表示键在Set中的排名;
- Zset (有序集合Sorted Set),每个元素都有一个分数,使用跳表(Skip List)作为底层数据结构。可以存储带有分数的成员,并按照分数对成员进行排序,分数为浮点型。(如何实现排行榜?)
- Hash(哈希表)键值对的集合,每个键对应一个值。底层为数组加链表,出现哈希冲突使用的是头插法向链表添加数据;Rehash 的过程为渐进式 Rehash,内部维护了两个哈希表 Ht[0]、Ht[1],其中 Ht[0]是一般用到的哈希表,Ht[1]只在 Rehash 的过程中才会用到;
- HyperLogLog
1、使用场景

String:缓存、分布式锁(setnx、redission)
List:消息队列
Zset:延迟队列
二、I/O模型
<socket请求--I/O多路复用程序--文件事件分派器--事件处理器>
1、常见的网络I/O模型
- 阻塞IO(Blocking IO)
- 非阻塞IO(Nonblocking IO)
- IO多路复用(IO Multiplexing)
- 信号驱动IO(Signal-driven IO)
- 异步IO(Asynchronous IO)
Linux系统一个进程使用内存分为两个部分:内核空间、用户空间。用户空间只能执行受限的命令,而不能直接调用系统资源,必须通过内核提供的接口访问。内核空间可以执行特权命令,调用一切资源。

Linux为了提高IO效率,在用户空间和内核空间都加入了缓冲区。
写数据时,把用户缓冲数据拷贝到内核缓存区,然后写入设备。读数据时,从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区。
(1)阻塞IO

阻塞IO模型,用户进程的“等待数据和拷贝数据”两个阶段都是阻塞状态。
(2)非阻塞IO

非阻塞IO模型中,用户进程在第一个阶段是非阻塞状态,第二个结算是阻塞状态。虽然第一个状态是非阻塞状态,但是效率并未提高,且在此阶段会出现CPU空转,使得CPU消耗增加。
(3)IO多路复用
I/O多路复用机制:通过单个线程同时监听多个Socket,一旦某个Socket就绪(可读、可写),就能够通知程序进行响应,从而避免无效的等待,充分利用CPU资源。
区别于阻塞IO及非阻塞IO直接调用recvfrom方法获取数据,出现目标数据查询不到而即使其他数据已准备就绪也无法优先处理的情况。这种方式同时监听多个Socket,优先处理就绪的数据。

2、Redis网络模型
IO多路复用监控Socket数据就绪状态的方式包括select、poll、epoll等;Redis的I/O模型默认采用的机制为epoll。
区别:select 和 poll 只会通知用户进程有Socket就绪,但是不确定具体的Socket。需要用户进程逐个遍历Socket进行确认。epoll 则会在通知用户进程 Socket 就绪的同时,把就绪的 Socket 写入到用户空间,节省了查找就绪状态数据的时间。
Redis网络模型(IO多路复用 + 事件派发机制(事件处理器)):

Redis中提供了多个事件处理器,分别处理不同的网络请求。
- 连接应答处理器
- 命令请求处理器,在Redis6.0之后,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程;
- 命令回复处理器,在Redis6.0之后,为了提升更好的性能,使用了多线程来处理回复事件。
【Redis采用单线程仍然较快的原因】
纯内存操作,执行速度很快,性能瓶颈是网络延迟而不是执行速度,I/O多路复用实现了网络的高效请求。
- Redis大部分操作都是在内存中直接完成的,C语言编写,采用的数据结构如哈希表、跳表;
- 采用单线程,避免不必要的上线文切换;
- 网络模型使用I/O多路复用机制,使得网络I/O操作能并发处理大量的客户端请求。
Q:解释下I/O多路复用模型
A:I/O多路复用模型是指利用单个线程同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,更充分的利用CPU资源。目前IO多路复用主要采用epoll模式实现,会在通知用户进程Socket就绪的同时,把已经就绪的Socket写入到用户空间,不需要逐个遍历Socket来判断哪个就绪。
Redis的网络模型是使用的 I/O多路复用 + 事件处理器 的方式处理多个Socket请求。包括:连接应答处理器、命令请求处理器、命令回复处理器。
Redis6.0后,①在命令请求处理器,将命令的转换使用了多线程,增加转换速度。执行命令仍然是单线程;②在命令回复处理器中使用了多线程处理回复事件。
三、持久化 AOF|RDB
AOF写操作追加记录,RDB为某一时刻数据快照。
- AOF 文件的内容是操作命令;
- RDB 文件的内容是二进制数据。

最低0.47元/天 解锁文章
523

被折叠的 条评论
为什么被折叠?



