
redis
文章平均质量分 78
redis详解
芒骁
用代码改变世界
展开
-
数据模型-数据结构-链表
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。......转载 2022-08-08 17:14:10 · 207 阅读 · 0 评论 -
redis 事件
mask: 可选值为 AE_READABLE 可读事件, AE_WRITABLE 可写事件, AE_BARRIER 字面意为 屏障事件, 其中可读可写事件比较好理解, AE_BARRIER 事件会影响事件的读写处理顺序为先写后读, 比如beforesleep回调中进行了fsync动作,然后需要把结果快速回复给client。这个情况下就需要用到AE_BARRIER事件,用来翻转处理事件顺序了。......转载 2022-08-08 17:01:36 · 582 阅读 · 0 评论 -
redis 网络IO
redis IO 源码转载 2022-07-26 16:56:07 · 207 阅读 · 0 评论 -
数据模型-数据结构-跳跃表
跳跃表的实现/* ZSETs use a specialized version of Skiplists *//*zskiplist 管理整个跳表,zskiplistNode 表示跳表上的一个节点typedef struct zskiplistNode { //成员对象:各个节点中的o1、o2和o3是节点所保存的成员对象。 sds ele; //score:各个节点中的1.0、2.0和3.0是节点所保存的分值。在跳跃表中,节点按各自所保存的分值从小到大排列 double转载 2022-02-09 15:14:51 · 749 阅读 · 0 评论 -
数据模型-数据结构-整数集合
整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。typedef struct intset { //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的数组 int8_t contents[];} intset;字段属性contents数组contents数组是整数集合的底层实现:转载 2022-01-13 18:31:55 · 181 阅读 · 0 评论 -
数据模型-数据结构-字典
字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对,等等。字典经常作为一种数据结构内置在很多高级编程语言里面,但Redis所使用的C语言并没有内.转载 2021-12-28 18:18:31 · 2444 阅读 · 0 评论 -
数据模型-数据结构-压缩列表
压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。总结:压缩列表是为列表键和哈希键服务的,那么压缩列表数据结构就要支持相关操作:支持的数据类型列表数据类型例如,执行以下命令将创建一个压缩列表实现的列表键:列表键里面包含的都是1、3、5、10086这样的小整数值,以及"hello"、"world"这样的短字符串。哈希数据类型当一个哈希键只包含少转载 2021-12-28 17:39:11 · 337 阅读 · 0 评论 -
Redis-数据模型-对象-字符串对象
回顾对象结构体```csharptypedef struct redisObject { //类型 unsigned type:4; //编码 unsigned encoding:4; //缓存淘汰使用 unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ //引用计数 int refcount; //指向底层实现数据结构的指针 void *.转载 2021-12-28 12:50:28 · 394 阅读 · 0 评论 -
数据模型-对象-哈希对象
哈希对象的编码可以是ziplist或者hashtable编码ziplistziplist编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾,因此:❑保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后;❑先添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向。举个例子,如果我们执行以下HSET转载 2021-12-28 18:18:22 · 260 阅读 · 0 评论 -
数据模型-对象-列表对象
列表对象的编码可以是ziplist或者linkedlistziplist编码ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素。举个例子,如果我们执行以下RPUSH命令,那么服务器将创建一个列表对象作为numbers键的值......转载 2021-12-28 17:38:59 · 363 阅读 · 0 评论 -
数据模型-对象-集合对象
集合对象的编码可以是intset或者hashtable。intset编码intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。举个例子,以下代码将创建一个如图8-12所示的intset编码集合对象:hashtable编码hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为NULL。......转载 2022-01-11 20:10:54 · 199 阅读 · 0 评论 -
数据模型-对象-有序集合对象
有序集合的编码可以是ziplist或者skiplist。ziplist编码的压缩列表对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member),而第二个元素则保存元素的分值(score)。压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向,而分值较大的元素则被放置在靠近表尾的方向。举个例子,如果我们执行以下ZADD命令,那么服务器将创建一个有序集合对象作为price键的值:如果price键的值对象使用的是转载 2022-01-13 18:36:21 · 221 阅读 · 0 评论 -
redis的启动过程 main函数(redis5.0源码)
命令 redis-server /conf/redis.conf总结main方法:(一) 初始化服务器的配置 initServerConfig(二)加载并解析配置文件 loadServerConfig(configfile,options)(三)初始化服务端内部变量 initServer()(四)aeMain 开始时事件循环进行处理 aeMain(server.el)int main(int argc, char **argv) { struct timeval tv;转载 2021-12-26 12:33:14 · 298 阅读 · 0 评论 -
(一)initServerConfig 初始化服务配置
1. initServerConfig 初始化服务配置总结:你能想到的一些基础配置都在这里实现#define C_OK 0#define C_ERR -1/* Static server configuration */#define CONFIG_DEFAULT_DYNAMIC_HZ 1 /* Adapt hz to # of clients.*/#define CONFIG_DEFAULT_原创 2021-12-26 12:36:17 · 420 阅读 · 0 评论 -
(二)加载并解析配置文件 loadServerConfig(configfile,options)
总结: 就是逐行扫描加解析。void loadServerConfig(char *filename, char *options) { sds config = sdsempty(); char buf[CONFIG_MAX_LINE+1]; /* Load the file content */ if (filename) { FILE *fp; if (filename[0] == '-' && filename[原创 2021-12-26 12:35:15 · 367 阅读 · 0 评论 -
(三)初始化服务端内部变量 initServer()
总结:创建事件循环 server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);void initServer(void) { int j; signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); setupSignalHandlers(); if (server.syslog_enabled) { openlog(s.转载 2021-12-26 12:32:33 · 287 阅读 · 0 评论