
Redis
文章平均质量分 61
赵银龙
这个作者很懒,什么都没留下…
展开
-
Redis之sds实现
在Redis中没有直接使用C语言中的传统字符串,它自己构建了一套动态字符串,我们来看一下它的结构:struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 char buf[];}在这个结构体里面有buf字符数组保存字符信息,另外还保存了...原创 2018-11-03 14:15:55 · 443 阅读 · 0 评论 -
Redis之事件
redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:1、文件事件:redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象,服务器与客户端的通信会产生相应的文件事件,,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。2、时间事件:redis服务器中的一些操作(比如serverCron函数)需要在给定的事件点执行,而时间事件就是服务器对这类定时操作...原创 2018-11-04 12:57:19 · 144 阅读 · 0 评论 -
Redis之哈希对象源码阅读
hashTypeTryConversion:对传入的参数进行检查是否需要从ziplist转换成hashtablevoid hashTypeTryConversion(robj *o, robj **argv, int start, int end) { int i; // 如果对象不是 ziplist 编码,那么直接返回 if (o->encoding != RE...原创 2018-11-04 13:22:16 · 324 阅读 · 0 评论 -
Redis之列表对象源码阅读
listTypeTryConversion:尝试将列表对象转换成linkedlist编码void listTypeTryConversion(robj *subject, robj *value) { // 确保 subject 为 ZIPLIST 编码 if (subject->encoding != REDIS_ENCODING_ZIPLIST) return; ...原创 2018-11-04 13:56:19 · 238 阅读 · 0 评论 -
Redis值集合对象源码阅读
setTypeCreate:返回一个集合对象robj *setTypeCreate(robj *value) { if (isObjectRepresentableAsLongLong(value,NULL) == REDIS_OK) return createIntsetObject(); return createSetObject();}setTy...原创 2018-11-04 14:16:14 · 142 阅读 · 0 评论 -
Redis之数据库实现源码阅读
lookupKey:查找指定的键,如果存在返回对应的值robj *lookupKey(redisDb *db, robj *key) { // 查找键空间 dictEntry *de = dictFind(db->dict,key->ptr); // 节点存在 if (de) { // 取出值 r...原创 2018-11-04 15:03:30 · 285 阅读 · 0 评论 -
Redis之复制
在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器。旧版复制功能的实现redis的复制功能分为同步和命令传播两个操作:1、同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态2、命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务...原创 2018-11-04 19:11:28 · 175 阅读 · 0 评论 -
Redis之Sentinel
Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会...原创 2018-11-04 20:00:52 · 143 阅读 · 0 评论 -
Redis之集群
redis集群是redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。节点一个redis集群通常由多个节点组成,在刚开始的时候,每个节点都是相互独立的,他们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。命令格式如下:CLUSTER MEET <ip><port&g...原创 2018-11-05 11:11:54 · 187 阅读 · 0 评论 -
Redis之发布订阅
redis的发布与订阅功能有PUBLISH、SUBSCRIBE、PSUBSRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者,每当有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到这条消息。通过执行PSUBSCRIBE命令订阅一个或多个消息模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会被发送...原创 2018-11-05 11:42:55 · 107 阅读 · 0 评论 -
Redis之AOF持久化
AOF持久化是通过保存redis服务器所执行的写命令来记录数据状态的:AOF持久化功能的实现可以分为追加、文件写入、文件同步三个步骤命令追加当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾AOF文件的写入与同步redis的服务器进程就是一个事件循环,这个循环中的文件事件负责接收客户端的命令请求,以及...原创 2018-11-04 12:21:39 · 168 阅读 · 0 评论 -
Redis之RDB持久化
RDB文件的创建与载入有两个redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。SAVE命令会阻塞redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令请求。RDB文件的载入工作是在服务器启动时自动执行的,只要redis服务器在启动...原创 2018-11-04 11:56:08 · 157 阅读 · 0 评论 -
Redis之链表实现
链表提供了高效的节点重排功能,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度,在redis中,发布与订阅、慢查询、监视器等功能也用到了链表,redis服务器本身还是用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区。我们看一下redis中链表节点的定义:typedef struct listNode { // 前置节点 struct l...原创 2018-11-03 14:40:29 · 492 阅读 · 0 评论 -
Redis之字典
字典是一种用于保存键值对的抽象数据结构,一个键和一个值进行关联,字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对等等。Redis构建了自己的字典实现,对数据库的增删改查都是构建在字典的操作之上的。下面我们看一下哈希表的定义:typedef struct dictht { // 哈希表数组 dict...原创 2018-11-03 15:31:04 · 514 阅读 · 0 评论 -
Redis之跳跃表
跳跃表是一种有序数据结构,他通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时,redis就会使用跳跃表来作为有序集合键的底层实现。我们这节主要来看一下跳跃表的具体实现:typedef struct zskiplist { // 表头...原创 2018-11-03 17:09:30 · 191 阅读 · 0 评论 -
Redis之整数集合
整数集合是集合键的底层实现之一,当一个结合只包含整数值元素,并且这个集合的元素数量不多时,redis就会使用整数集合作为集合作为集合键的底层实现。我们先来看一下它的结构:typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数...原创 2018-11-03 17:54:51 · 244 阅读 · 0 评论 -
Redis之压缩列表
压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是整数值,要么就是长度比较短的字符串,那么redis就会使用压缩列表来做列表键的底层实现。压缩列表的构成压缩列表是redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。上图就是一个压缩列表的结构...原创 2018-11-03 18:19:29 · 138 阅读 · 0 评论 -
Redis之对象
redis并没有直接使用我们之前介绍的那些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象、有序集合对象五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。通过这五种不同类型的对象,redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。除此之外,redis的对象系统还实现了基于引用计数...原创 2018-11-03 20:17:57 · 132 阅读 · 0 评论 -
Redis之object源码阅读
在这片博客中,我们将对object.c这个文件的其中一些方法进行阅读,大部分代码都是类似的:createObject:创建一个新对象robj *createObject(int type, void *ptr) { robj *o = zmalloc(sizeof(*o)); o->type = type; o->encoding = REDIS_ENC...原创 2018-11-03 20:43:05 · 179 阅读 · 0 评论 -
Redis之字符串对象源码阅读
checkStringLength:检查字符串的大小是否超过512MB,超过返回 REDIS_ERR ,未超过返回 REDIS_OKstatic int checkStringLength(redisClient *c, long long size) { if (size > 512*1024*1024) { addReplyError(c,"string ex...原创 2018-11-03 21:15:06 · 212 阅读 · 0 评论 -
redis之数据库
redis服务器将所有数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDb结构,每个redisDb代表一个数据库默认情况下,redis服务器会创建16个数据库每个redis客户端都有自己的目标数据库,默认情况下,redis客户端的目标数据库为0号数据库,但是客户端可以通过执行select命令来切换数据库。在服务器内部,客户端状态redisC...原创 2018-11-03 22:21:00 · 189 阅读 · 0 评论 -
Redis值notify.c阅读
keyspaceEventsStringToFlags:对传入的字符串参数进行分析, 给出相应的 flags 值int keyspaceEventsStringToFlags(char *classes) { char *p = classes; int c, flags = 0; while((c = *p++) != '\0') { switch(c...原创 2018-11-05 14:06:09 · 248 阅读 · 0 评论