摘要:
Redis 服务器是个事件驱动程序,服务器处理两类事件: 文件事件(file event):Redis 服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。客户端和服务器的网络通信会产生文件事件,而服务器通过监听并处理这些文件来完成一系列网络通信操作。 时间事件(time ev 阅读全文
摘要:
上一节已经说过 redis 客户端在 redis 服务器的一些属性,并且客户端在跟服务端交互时这些属性起到的作用。 那这一节站在服务器的角度,看看在一次命令请求中,服务器中各个组件是怎么交互的,服务器又是怎么启动起来的。 命令请求的执行过程 一个命令请求从发送到获得回复的过程中, 客户端和服务器需要 阅读全文
摘要:
Redis 是一种一对多服务器程序,一个服务器可以被多个客户端连接,每个客户端向服务端发送请求,服务端处理请求并返回结果给客户端。 但是 Redis 是以单线程的方式运行的,所以 Redis 通过使用 IO 多路复用技术实现的文件处理器,处理多个客户端的请求。这个后面会补充。 这一节我们主要讲一下 阅读全文
摘要:
经过上篇文章,介绍了 Redis 中的对象,Redis 是通过这些对象来保存 Redis 数据库中的数据的。这篇我们就看一下Redis数据库在内存中的结构,以及客户端切换数据库、数据库保存键值对、以及对数据的增删改查等操作的实现方法。 我们本地安装 Redis 会安装redis-cli 和 redi 阅读全文
摘要:
通过上几节,我们了解到Redis底层的一些重要的数据结构,比如简单动态字符串、链表、字典、跳跃表等等。 除了这几个还有整数集合,压缩列表。会在本章进行简单的描述。 而Redis,是基于上述几种数据结构创建了对象,再由对象构建Redis数据库,所以每个对象至少用了一种上述的数据结构。 这个对象有字符串 阅读全文
摘要:
跳跃表 咱们可以想象一个场景,我们需要维护一个有序的集合,集合是按照某个字段进行排序的,集合会有添加和删除操作。 如何在内存中存储存储并维护这样的集合呢,我们可以想到链表或者数组进行存储,他们都是线性的结构,我们分别分析下这两种接口存储有序集合的场景。 数组 使用数组维护集合,当插入一个元素时,首先 阅读全文
摘要:
字典 字典,是一种保存键值对(key-value)的抽象数据结构。 在字典中一个key 是独一无二的,并且和一个值(value)进行关联。 字典经常作为数据结构内置在高级编程语言中,比如python,但是Redis是用c编写的,c本身并没有内置字典这个数据结构。因此Redis构建了自己的字典。 字典 阅读全文
摘要:
链表和链表节点的实现 Redis 每个链表节点使用一个 adlist.h/listNode 结构来表示: typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 v 阅读全文
摘要:
简单动态字符串 Redis 是用 c 语言编写的,但是 Redis 没有用 c 语言传统的字符串表示(以空字符串结尾的字符数组),而是自己构建了简单动态字符串SDS (simple dynamic string) 的类型。 Redis 默认用 SDS 表示字符串。 当 Redis 需要的不仅仅是一个 阅读全文
摘要:
事务 事务指的程序中一系列严密的逻辑操作,其中包含的操作必须要完成,否则在每个操作中的更改都会被撤销。 举个简单的例子:一群鸭子过河,要么都过去,要么都不过去。 事务的特性 原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败 阅读全文