redis-3.2 源码
redis
車輪の唄
atarik@163.com
展开
-
redis源码--客户端/服务器交互
另可参考:https://blog.csdn.net/fishmai/article/details/78515355https://blog.csdn.net/men_wen/article/details/71514524https://blog.csdn.net/u012658346/article/details/51356693Redis底层还是基于网络请求的,对于单机数...原创 2019-02-25 14:49:56 · 352 阅读 · 0 评论 -
redis源码--IO多路复用的封装
一,Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。redis的多路复用选择器...原创 2019-02-25 11:50:13 · 1209 阅读 · 0 评论 -
redis源码--动态字符串
sds要点总结:1.sds定义为sdshdr中的 buff[]指针, 并向外暴露, 而sdsdhr不对外2.buff[]还是为以'\0'结尾, 以此兼容c3.buff[]是个柔性数组, 其主要意义在于:a), 便于内存管理, 可以和sdshdr同时申请内存和释放b), 便于扩容, 如果使用数组则无法扩容, 如果使用指针则无法进行统一的内存管理c), 和sdshdr内存连续,...原创 2019-02-21 14:47:03 · 348 阅读 · 0 评论 -
sds中的两种编码--embded和RAW
embded 和 RAW使用debug object命令会发现,不同长度的string的encoding有embed和raw两种类型,也是为了节省空间,64字节及以下的string会使用embed存储,以上使用RAW存储(不同redis版本下可能会有不同的界限),之所以使用64为界是因为内存分配函数malloc等都是一次分配2的若干次幂大小的内存,另外即使分配64字节给string使用,con...原创 2019-03-07 13:38:23 · 1904 阅读 · 0 评论 -
redis源码--redisObject
在Redis的源码中,到处可见robj类型的变量,在介绍其他模块时,只是将它看成Redis的数据类型,并没有深入探究。而事实上,它是对象系统,提供了对多种类型的封装,Redis可以根据数据的具体形式,采用不同的类型进行存储,一方面提高了灵活性,一方面也为节省内存提供了便利,因为Redis所有的数据都是直接存在内存中的,所以需要想方设法节省内存对象结构redisObject结构中包含了对象系统...原创 2019-02-28 14:48:44 · 310 阅读 · 0 评论 -
redis源码--链表结构
1. redis中的链表在redis中链表的应用非常广泛,例如列表键的底层实现之一就是链表。而且,在redis中的链表结构被实现成为双向链表,因此,在头部和尾部进行的操作就会非常快。通过列表键的命令感受一下双向链表:列表键命令详解127.0.0.1:6379> LPUSH list a b c //依次在链表头部插入a、b、c(integer) 3127.0.0.1:6...原创 2019-02-23 23:13:32 · 240 阅读 · 0 评论 -
redis源码--跳跃表
同数组相比,链表的插入删除效率是O(1),但是如果想要在链表中查找某个元素,就糟糕了,复杂度会是O(N),为了提高查找效率,就有了跳表的概念。所谓跳表,就是可以跳跃的链表,回想二分查找算法,每次的查找都是跳跃性的,这才使得二分法效率这么高,跳表的设计同样也借鉴了二分法的策略,实现跳跃查找,当然,需要跳表中的元素有序普通的链表每个节点仅仅保存了指向下一个节点的指针,只能移动到下一个相邻节点,也就...原创 2019-02-26 14:41:17 · 897 阅读 · 0 评论 -
redis源码--字典
一, 图解字典的实现Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。接下来分别介绍Redis的哈希表、哈希表节点以及字典的实现。哈希表Redis字典所使用的哈希表由dict.h/dictht结构定义:/** 哈希表** 每个字典都使用两个哈希表,从而实现渐进式 rehash 。*/...原创 2019-02-24 20:30:50 · 285 阅读 · 0 评论 -
redis源码--整数集合
Redis提供一种叫整数集合的数据结构,当数据中只包含整数,并且数据数量不多时,Redis便会采用整数集合存储Redis保证整数集合有以下几个特性所含元素全是整数,且不重复内部元素有序,通常是会从小到大排序内部编码统一,尽可能采用合适的编码保存数据当编码不合适时,执行升级操作接下来会针对上述几个特性分别进行分析,可以看到,整数集合有点类似连续数组,只是在某种程度上添加了编码,同时为...原创 2019-02-26 14:54:24 · 230 阅读 · 0 评论 -
redis源码--压缩列表
1. 介绍压缩列表(ziplist)是哈希键的底层实现之一。它是经过特殊编码的双向链表,和整数集合(intset)一样,是为了提高内存的存储效率而设计的。当保存的对象是小整数值,或者是长度较短的字符串,那么redis就会使用压缩列表来作为哈希键的实现。127.0.0.1:6379> HMSET hash name mike age 28 sex maleOK127.0.0.1:6...原创 2019-03-04 18:51:16 · 260 阅读 · 0 评论 -
redis源码--quicklist
1. 介绍quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现。通过列表键查看一下:redis 列表键命令详解127.0.0.1:6379> RPUSH list 1 2 5 1000"redis" "quicklist"(integer)127.0.0.1:6379> OBJECT ENCODING list"quicklist"...原创 2019-03-07 17:15:47 · 635 阅读 · 0 评论 -
redis--aof&rdb
RDB持久化机制RDB持久化是把当前进程数据生成时间点快照(point-in-time snapshot)保存到硬盘的过程,避免数据意外丢失1.1 RDB触发机制RDB触发机制分为手动触发和自动触发。手动触发的两条命令:SAVE:阻塞当前Redis服务器,知道RDB过程完成为止。BGSAVE:Redis 进程执行fork()操作创建出一个子进程,在后台完成RDB持久化的过程。...原创 2019-07-11 13:05:29 · 274 阅读 · 0 评论 -
redis--list阻塞详解
redis中blpop可以实现链表的阻塞操作,客户端连接在list没有数据的情况下会进行阻塞。这让我产生了一个疑问,redis本身是一个单线程服务,如果阻塞客户端一直保持着跟服务器的链接,会不会阻塞其他命令的执行呢?答案显然是不会,这就涉及到redis阻塞命令的实现原理。我们知道,在redis server中有两个循环:IO循环和定时事件。在IO循环中,redis完成客户端连接应答、命令请求处...原创 2019-07-10 10:51:49 · 2309 阅读 · 0 评论 -
redis源码--key的过期策略
Redis是支持时间事件的,所谓时间事件,是为某个键值对设置过期时间,时间一到,Redis会自动删除该键值对。例如使用SET命令添加字符串类型的键值对127.0.0.1:6379> SET blog redis ex 10 //添加键值对<blog, redis>,10秒后删除OK127.0.0.1:6379> GET blog //添加后马上查找,可...原创 2019-03-08 10:05:43 · 669 阅读 · 0 评论 -
redis源码--notify
个人理解, 通知分为两种类型, 一种基于键的通知(用来监听某个键的修改和被执行了什么命令), 一种是非键的(可以理解为mq,通过指定一个channel)基于键的通知1. 通知功能介绍客户端可以通过 订阅与发布功能(pub/sub)功能,来接收那些以某种方式改动了Redis数据集的事件。目前Redis的订阅与发布功能采用的是发送即忘(fire and forget)的策略,当订阅事件的...原创 2019-03-07 18:46:12 · 374 阅读 · 0 评论 -
redis源码--LRU实现
Redis 的淘汰机制Redis可以看作是一个内存数据库,可以通过Maxmemory指令配置Redis的数据集使用指定量的内存。设置maxmemory为0,则表示无限制(这是64位系统的默认行为,而32位系统使用3GB内隐记忆极限)。maxmemory 100mb当内存使用达到maxmemory极限时,需要使用某种淘汰算法来决定清理掉哪些数据,以保证新数据的存入。常用的淘汰算法:...原创 2019-03-09 19:13:35 · 879 阅读 · 0 评论 -
redis--时间事件
Redis的事件分为文件事件(file event)和时间事件(time event), 现在已知的时间事件就是定时任务serverCron()函数, 其每隔100ms执行一次; 该函数实在main方法中初始化时注册到时间事件中// 使用一个宏定义:run_with_period(milliseconds) { .... },实现一部分代码有次数限制的被执行int serverCron(s...原创 2019-07-11 13:48:45 · 1064 阅读 · 0 评论 -
redis源码解读
https://blog.csdn.net/men_wen/article/details/75668345https://blog.csdn.net/sinat_35261315/article/category/738041原创 2019-02-19 22:55:48 · 966 阅读 · 0 评论