timg.jpeg 前言 近期决定把redis的源码阅读分析一下,在官网下载了最新稳定版本5.0.3。...从目录结构和文件的组织形式,我感觉redis也做的非常好;任何一个软件项目,源码组织形式都是非常重要的,而且也能从侧面反映出软件的组织架构。所以这里也想介绍一下redis的目录结构和源码组织形式。...解压redis源码压缩包之后,主要的目录有这样几个:deps,src,utils,tests。基本上看目录名就知道做什么的了。...的启动代码做了一个初步的分析,只是梳理出来redis的基本启动过程,但是每个参数、事件驱动、哨兵等机制和功能到底是怎么样的,还没有具体的分析,这个放到后面逐步分析。...Dispatcher Envoy源码分析之ThreadLocal 自2013到2019年大数据领域发生了什么变化 看完本文有收获?
[Redis 源码解析 1:字符串 SDS ] Redis 中字符串都用自定义的结构**简单动态字符串(Simple Dynamic Strings,SDS),而不是C语言的字符串。...Redis 中使用到的字符串都是用 SDS,例如 key、string 类型的值、sorted set 的 member、hash 的 field 等等等等 数据结构 旧版本的结构 在 3.2 版本之前...在 Redis 3.2 版本之后,Redis 将 SDS 划分为 5 种类型: 类型 字节 位 sdshdr5 < 1 <8 sdshdr8 1 8 sdshdr16 2 16 sdshdr32 4 32
一、事务基础1 redis事务介绍 事务能够将多个操作作为一个整体来执行,具备ACID四大特性。原子性:redis主线程对字典空间进行操作,天生是原子的,不需要同步机制。...持久性:redis作为缓存是允许丢失数据的,我觉得不应该对持久性有过多的要求。另外redis也有rdb、aof来持久化数据。...redis事务期间是不能使用监视器的,待会儿源码中就能够看到。...图片1 multi/** * multi命令对应的源码 */void multiCommand(redisClient *c) { // 判断是否嵌套执行multi if(c->flags...c->argv = NULL; c->argc = 0; c->argv_len_sum = 0; c->argv_len = 0;}3 exec/** * exec命令对应的源码
简介 由于本人目前是华为FusionInsight HD 中Redis组件的Owner,所以要对Redis进行深入的了解,这对于C语言水平不咋地的我来讲还是有点难度的,于是我决定先从Redis的启动开始看...配置初始化 Redis服务启动首先做的第一步就是初始化配置。Redis初始化配置主要包括初始化命令表和加载配置两部分。...初始化ACL 权限信息 主要是通过加载redis.conf配置文件里面的配置信息,用于控制登录用户执行命令的权限,仔细详见:Redis 6 ACL源码详解 初始化命令表 在函数populateCommandTable...()/redis_check_aof_main()检查RDB/AOF文件的完整性。...这个设计就是以Redis启动时多消耗一些时间为代价,换取运行的更小的延迟。
文章目录 redis集群概述 客户端重定向 槽位迁移 redis cluster 的运行流程 redis集群概述 哨兵、主从、集群,一串下来。...redis cluster 主要作用如下(虽然是显而易见了): 数据分片,流量分发。 cluster 将不同的数据分发给不同的节点,不过没有使用一致性hash算法,而是引入了Hash槽位的概念。...所以本文的重心也就很明确了:redis集群是如何实现通信及数据分片、流量分发的 关于实操:【redis】闲得无聊,来聊聊当下爆火的 redis集群,顺便搭一个玩玩呗 客户端重定向 如果cluster中的某个节点收到客户端请求...the base case. */ if (error_code) *error_code = CLUSTER_REDIR_NONE; /* Modules can turn off Redis..."writing" : "reading")); return; } redis cluster 的运行流程 这个启动过程我就不放代码了,和前面的主从、哨兵有很多相似之处。
一、背景 redis是内存数据库,并且是单线程,为什么单线程也能够这么快?...二、epoll使用案例为了降低redis理解时的复杂度,先给出一个epoll使用时的case,有助于后面的理解。...图片三、redis事件注册图片redis初始化时会创建所有的listen socket并注册到eventloop中监听,绑定accept Handler,当连接建立时就会accept新连接,创建client...This rarely happens, however sometimes the implementation * of parts of the Redis core may call incrRefCount
--- AOF 作为 Redis 的数据持久化方式之一,通过追加写的方式将 Redis 服务器所执行的写命令写入到 AOF 日志中来记录数据库的状态。...server.aof_selected_db = -1; replicationScriptCacheFlush(); return C_OK; } return C_OK; /* unreached */ } 一步到"胃"直接看源码相信不少同学都觉得很胃疼...AOF重写带来的内存开销有可能导致Redis内存突然达到maxmemory限制,甚至会触发操作系统限制被OOM Killer杀死,导致Redis不可服务。...参考资料: 1.极客时间专栏《Redis源码剖析与实战》.蒋德钧.2021 2.极客时间专栏《Redis核心技术与实战》.蒋德钧.2020 3.Redis 7.0 Multi Part AOF的设计和实现....驱动 qd.2022 : https://developer.aliyun.com/article/866957 4.Redis 5.0.8源码:https://github.com/redis/redis
go-redis 支撑单节点,哨兵模式和集群模式,每一种模式对应的命令接口其实几乎一样的,go-redis就是通过命令模式将命令和每一种client的实现解耦的。...redisdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", // use default Addr Password...:= redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{"redis-cluster.test.com:...}) 我们以普通client为例进行源码分析,它代码位于: github.com/go-redis/redis/v8@v8.11.5/redis.go type Client struct...源码位于github.com/go-redis/redis/v8@v8.11.5/commands.go,以ZRevRange为例,可以看到,这个函数类,在它的属性里面调用了自己。
◆ Redis 线程模型 Redis 是一个典型的基于 epoll 的 nio 线程模型, epoll 实例手机所有的事件(连接与读事件)由一个服务线程处理所有命令。...Redis 底层相关的 epoll 的源码实现在 src/ae_epoll.c 文件中。...的网络模型 Redis 采用的是单线程 Reactor。...Redis 服务器是一个事件驱动的程序,服务器需要处理一下两类事件: 1、文件事件(file event): Redis 服务器通过套接字与客户端(或者其他 Redis 服务器)进行连接,而文件事件就是服务器对套接字操作的抽...Redis 在 I/O 多路复用程序实现源码中通过 #include 宏定义了相应的谷子额,程序会在编译期间自动选择系统中性能最高的 I/O 多路复用函数库来作为 Redis 的 I/O多路复用程序的底层实现
{ listNode *head; listNode *tail; unsigned long len; }list; head:链表头节点 tail:链表尾节点 len:链表中节点个数 Redis
前言 上一篇分析了一下redis的大致框架和启动过程,这篇我想分析一下redis的事件处理模型,当然也包含了网络事件的处理模型。...redis除了其高效的nosql存储非常有名以外,另外一个比较被称赞的就是其服务效率。像这类服务的是怎么设计的,为什么这么高效。所以我想这里来分析分析。...核心数据结构 在ae这个事件驱动框架的核心数据结构就是下面这个,在上篇分析的代码中创建中就有分析到redis的main函数最后就是启动这个数据结构。...redis的客户端链接处理 这里提出2个问题: 客户端的连接请求那里处理 怎么和现在的ae处理框架联系起来 下面跟随这两个问题进行进一步的分析。...总结 通过上面的分析,我们应该可以理解了redis的基本事件处理模型。
所以事实上,Redis的rehash过程是分多次、分布完成的。
如果当前集合存储的元素是int16_t类型,当需要存入一个int32_t类型的整数时,Redis会分配一片新的内存空间,将每个元素的类型提升为int32_t,再将所有元素迁移至新数组中。...4.2 节约内存 如果要用一个数组同时能够保存int16_t、int32_t、int64_t这三种类型的整数,那么只能创建一个int64_t类型的数组,而Redis整数集合可以保存三种类型的整数,只有当有需要的时候才进行升级操作
上一篇我们看了Redis里面关于新旧版本对于sds的不同的结构体实现,接下来看看sds.c中关于redis动态字符串的具体操作。 从new开始: sdsnew函数是创建一个sds字符串的开始函数。
完工后对服务进行压测后发现georadius的性能比预期要差,因此我分析了georadius的源码,并对原始的实现方案进行了优化,总结成了本文。...我们生产环境使用的redis版本为4.0.13,因此本文redis源码皆为4.0.13版本的源码 redis geo原理 往redis中添加坐标的命令是GEOADD key longitude latitude...源码中却是另外一种算法: int geohashEncode(const GeoHashRange *long_range, const GeoHashRange *lat_range,...对应redis源码如下: void geohashNeighbors(const GeoHashBits *hash, GeoHashNeighbors *neighbors) { neighbors...又因为redis工作线程是单线程的,因此无法充分利用多核,无法通过增加redis server的CPU核数来提升性能,只能添加从库。
string是Redis中最经常使用的一种结构,与c语言中的原生字符串不太一样,Redis 使用的是一种叫做SDS的结构,simple Dynamic string 粗暴点就是简单动态字符串,跟字面意思一样...Redis 中sds有两种版本,一种是3.2之前的,这个也是那本《Redis设计与实现》所说的方式,但是就现状来说实效性已经没有那么强了,大家注意区分。...那Redis 中设计的这个sds 有什么优势和缺点呢?
本文首发于个人公众号 Java 技术大杂烩,欢迎关注 前言 字典这种数据结构并不是 Redis 那几种基本数据结构,但是 hash , sets 和 sorted sets 这几种数据结构在底层都是使用字典来实现的...结构 Redis 字典的结构和 Java 中的 HashMap 有点类似,都是存放键值对,在底层都是使用数组加链表(称为一个哈希表)的形式来实现的,但与 HashMap 不同的是,在 Redis 中,它由两个哈希表组成...而在 Redis 的字典扩展或缩小的过程中,是一个渐进式的过程,为什么不是一次性进行操作,而是渐进式的方式?................. } else { serverPanic("Unknown set encoding"); } return 0; } 以上就是 Redis
文章分析了程序员为什么会害怕“改需求”?以及程序员害怕“改需求”大致上体现在哪几个方面。 一、理想的跳表 跳表(多层级有序链表)结构用来实现有序集合。...鉴于 redis 需要实现 zrange 以及 zrevrange 功能;需要节点间最好能直接相连并且增删改操作后结构依然有序。...此时时间复杂度为: 二、redis 跳表 从节约内存出发,redis 考虑牺牲一点时间复杂度让跳表结构更加变扁平,就像二叉堆改成四叉堆结构;并且 redis 还限制了跳表的最高层级为 32。...redis的跳表数据结构做了调整,它是一个循环双向链表的结构;这样的结构可以实现逆向查询。...调试时可以在redis.conf文件中修改这两个参数。
简介 本文主要是讲解Redis 6的ACL的实现原理。基本使用详见:Redis 6.0新特性——ACLs,以及Redis启动过程分析。...启动初始化 初始化默认用户 ACL子模块在Redis启动过程中初始化,下面代码主要是初始化ACL的结构: /* * 初始化ACL子系统 * */ void ACLInit(void) {...Redis ACL配置信息主要有两种方式: 在redis.conf文件中通过user 配置项配置的ACL信息。...比如:user worker +@list +@connection ~jobs:* on >ffa9203c493aa99 在redis.conf中配置aclfile所配置的文件中。...格式如下图所示: 通过user方式 通过加载redis.conf配置文件中读取user配置项加载ACL信息。
SDS简介 Redis中使用的字符串均为『简单动态字符串』(Simple Dynamic String),简称SDS。 SDS是在C字符串的基础上进行了一些包装,使得它更符合Redis的使用场景。...在Redis中,C字符串只用在一些无需修改的地方,如日志打印;其他需要使用字符串的地方基本上使用的都是SDS。 2....SDS的优点 Redis使用C语言编写,而Redis不使用C语言字符串是有原因的,Redis中的SDS字符串与C字符串相比有如下优点。...3.2.2 Redis如何避免缓冲区溢出? 而SDS提供的所有修改字符串的API中,都会判断修改之后是否会内存溢出,如果会内存溢出,它会帮你进行内存扩容。...空间预分配 当需要扩展SDS长度的时候,Redis不仅会给它分配所需的内存空间,还会分配一段额外的空间作为备用。
领取专属 10元无门槛券
手把手带您无忧上云