管理进化

redis是中间件吗


redis是中间件。redis是完全开源免费的,遵守BSD协议,是一个高性能的键值数据库。是当前最热门的的的NoSql数据库之一,也被人们称为数据结构服务器。中间件是系统软件和用户应用软件之间连接的软件,是一种独立的系统软件或服务程序。因此,redis是中间件。

一、Redis的数据结构

1.string 字符串

string 是 Redis 中最常见的数据结构,也称 SDS「Simple Dynamic String」,通常作为 key 或 value(最大长度 512 M)。图中粉色部分为 Redis 对象的通用头部,ptr 指向 SDS。string 按长短分以 embstr(len <= 44) 和 raw 的形式存储。

2. list 列表

list 对应的是链表而不是数组,插入删除快而索引慢,可以用于消息队列。list 的底层不是简单的 LinkedList,而是 ziplist(压缩列表)或 quicklist(快速列表)。

压缩列表使用一块连续的内存,元素间紧挨着存储没有空隙。

每个元素中包括前一个元素的长度、当前元素的编码和内容,在编码中标识当前元素的长度。在没有前后指针时,能够快速的前后索引。

list 在增加元素时会根据内存分配算法和当前内存大小,决定是在原有地址上扩展还是重新分配内存

当某个元素的长度超过 254 个字节时,后面元素的 prevlen 需要从 1 字节改成 5 字节用于表示上一元素的长度。这个操作可能会造成后面的元素雪崩式的更改 prevlen,即 联级更新。因此,list 中存储的元素不应该太多、太大。

3. hash 字典

hash 是 Redis 中的字典结构,内部实现与 Java 中的 HashMap 一致(数组 + 链表)。字典内部有两个 HashTable,Rehash(扩容或缩容)时用于存储新旧两份数据。

扩容时机:元素个数等于数组长度(bgsave 时 5 倍数组长度时扩容)

扩容方式:2 倍数组长度

缩容时机:元素个数少于数组长度 10%

4. set 集合

set 是没有排序的字符串集合,不允许出现重复元素,内部结构与 hash 字典一致,只是 value 为 null。

5. zset 有序集合

zset 是有序集合,内部实现为跳跃链表,用于支持随机地插入和删除。

二、原理

IO 模型

Redis 是单线程程序。

使用非阻塞 IO:能读时读,能写时写,无线程阻塞。

非阻塞 IO 基于操作系统底层的事件轮询 API,注册监听基于回调。

三、持久化

Redis 提供两种持久化方式:

RDB - 一段时间内生成指定时间点生成数据集快照 (snapshot)

AOF - 增量日志

Redis 提供了 SAVE 和 BGSAVE 两个命令来生成 RDB 文件,前者是阻塞的,后者是后台 fork 子进程。

AOF 持久化实现可以分为命令追加 (append)、文件写入 (write)、文件同步 (fsync) 三个步骤。Append 追加命令到 AOF 缓冲区,Write 将缓冲区的内容写入到程序缓冲区,Fsync 将程序缓冲区的内容写入到文件。

由于 AOF 比 RDB 文件更加完整,Server 启动时优先采用 AOF 文件进行恢复。

智齿客服