
redis
redis 相关内容
maohuazhu
后台开发工程师,编程爱好者。GitHub:https://github.com/neal-zhu
展开
-
redis 源码系列(18):和单点说再见 --- sentinel
有了在主从节点之间同步数据的解决方案之后,我们已经有了运行多个 redis 服务的能力,但是我们仍然缺乏自动处理故障转移的能力。sentinel 是 redis 自带的高可用解决方案。在这个方案中有三种不同角色:masterslavesentinel主从节点的作用不需赘述,他们是数据库服务的直接提供者。sentinel 则主要有以下作用:monitoring,sentinel 会持...原创 2020-01-27 23:42:07 · 388 阅读 · 0 评论 -
redis 源码系列(17):分身术 --- replication
截至上篇文章,我们对单机版 redis 需要学习的内容已经大体掌握了。但是生产环境中是绝对不能允许某个服务是单点的,所以后续我们来学习关于高可用、扩展性等高级内容。今天要学习的数据同步相关机制,是 redis 高可用和集群模式的基石。数据库服务的扩容和数据备份,是一个非常复杂的问题。因为数据库服务是 有状态的,所以其迁移、扩展都有很多需要仔细考量的地方。redis 采用 master-slav...原创 2020-01-17 15:18:56 · 425 阅读 · 0 评论 -
redis 源码系列(16):We will call you --- PUB/SUB命令
redis 源代码系列到现在,已经基本上介绍完了单节点 redis 服务的整体架构以及一些特别重要的特性(RDB,AOF 等),但是对于其支持的 commands 还未加以介绍。鉴于这些 commands 大多数都是建立在之前介绍过的几种数据结构之上,其实现逻辑并未有太多值得大书特书之处,这里就不再对每个命令加以讲解,仅挑选 PUB/SUB 和 lua script 脚本相关命令进一步学习。今天...原创 2020-01-14 22:12:44 · 272 阅读 · 0 评论 -
redis 源码系列(14):1,2,3茄子 --- 数据库快照 rdb
Redis 是一个内存数据库,但是通过使用 rdb 和 aof 机制,redis 也支持数据持久化。今天我们来看一下 rdb 相关代码。redis 的 *.rdb 文件是对 redis 内存数据的二进制表示(快照),通过 *.rdb 文件,我们可以恢复 redis 的所有状态。rdbRdb Format我们来看一下一个 rdb 文件的格式,大家千万注意,虽然我们在下面的例子中将 rdb 文...原创 2020-01-13 17:56:47 · 378 阅读 · 0 评论 -
redis 源码系列(13):我的地盘我做主--- database
redis 内部也像传统的关系型数据库一样,有 database 的概念。主要用于实现数据隔离,这个在生产环境中是非常必要的。多个进程共同使用一个 redis 服务,如果没有数据隔离的机制,对于开发、运维都会有很大的挑战。今天来看一下 redis 中 database 的实现databaseredisDbtypedef struct redisDb { // 数据库键空间,保存着数...原创 2020-01-10 18:53:41 · 192 阅读 · 0 评论 -
redis 源码系列(12):你们一起上吧 --- redis 事务
作为一个数据库,对于事务的支持是一个绕不过去的话题。今天我们来看一下 redis 中的事务相关代码。multiStateredis 中使用 multiState 结构体来表示一个事务:typedef struct multiCmd { // 参数 robj **argv; // 参数数量 int argc; // 命令指针 struct red...原创 2020-01-09 23:55:41 · 157 阅读 · 0 评论 -
redis 源码系列(11):command 处理流程浅析
经过上一篇文章的分析,我们已经知道 redis 是如何处理 client 的请求,解析处一个完整的 command,进一步处理这个 command,并且向 client 发送响应。今天来学习一下 redis 的 command 相关代码。redisCommandstruct redisCommand { // 命令名字 char *name; // command 对应...原创 2020-01-08 22:23:13 · 1295 阅读 · 1 评论 -
redis 源码系列(10):事件驱动编程下的网络 IO --- 读写 client
今天的文章讲一下 redis 是如何读取 client 发送的数据,以及如何发送响应给 client。主要讲述网络 IO 相关内容,不会涉及到具体的 command 处理逻辑。Why non-blocking IO首先我们先来说一下为什么 IO 复用一定要和非阻塞 IO 一起使用。IO 复用本质上在复用线程,它用单一的线程并发的处理多个 IO 事件的手段。我们知道阻塞 IO 在 read (...原创 2020-01-07 18:29:28 · 313 阅读 · 0 评论 -
redis 源码系列(9):百尺高楼平地起 --- redis服务启动
前面已经介绍了 redis 的网络架构、通信协议,我们今天就具体看一下代码,看看 redis 服务是如何启动,服务 client 的。今天不会涵盖 sentinel、cluster 等高级概念,我们仅看看最简单的单节点 redis 服务启动的流程是怎么样的。讲解的代码中,会删除部分与可移植性相关、和不影响立刻主体流程的代码。启动// redis 以守护进程运行void daemonize(...原创 2020-01-06 22:50:06 · 219 阅读 · 0 评论 -
redis 源码系列(8):Do you speak RESP ?--- redis 网络协议
redis 使用的 client/server 架构。c/s 架构下的 client 和 server 第一个要解决的问题就是进程间通信问题。这个的解决方案很多,最常见的当属网络套接字,而且大多数都采用 TCP 协议通信。建立在 TCP 协议上的应用程序都有自己的应用层协议,常见的比如有 HTTP 协议等。redis 与 client 通信的时候,使用自己定义的 RESP(REdis Seria...原创 2020-01-05 21:45:09 · 188 阅读 · 0 评论 -
redis 源码系列(7):单线程也可以很diao --- eventloop
redis 本身是一个单线程程序,但是其并发能力在开源的非关系型数据库中却名列前茅,这是如何做到的呢?一个单线程程序,如何能并发处理上万请求?redis 给出的答案是 IO 复用 + 非阻塞 IO 这对神兵利器。在 linux 平台下,常见的 IO 复用手段有:select、poll、epoll 三种,一般在并发很大的情况下 epoll 的性能最佳,select 和 pool 都有其局限性(s...原创 2020-01-03 11:56:28 · 321 阅读 · 0 评论 -
redis 源码系列(7):简单的对象系统 --- robj
c 语言本身并不是一门面向对象编程的语言,但是很多面向对象的语言(比如 python,c++)都是用 c 来实现的。redis 代码中,也实现了一个简单对象系统。今天就让我们来学习一下,相关代码在 src/object.c,src/redis.h 中。robjredis 中所有对象,都使用一个统一的数据结构表示:#define REDIS_LRU_BITS 24typedef stru...原创 2020-01-02 18:24:33 · 270 阅读 · 0 评论 -
redis 源码系列(6):实现简单又能打 --- skiplist
跳跃表(skiplist)是一种高级数据结构,其插入、检索、删除的时间复杂度均为 O(logN)。因为其实实现简单,很多项目将其作为红黑树的一个替代品。今天我们来看一下 redis 中 skiplist 的实现,涉及到的文件在 src/t_zset.c 和 src/redis.h。redis 中的跳表基本上与常见跳表有以下几点区别:节点的 key 其实相当于 score + obj,所以在...原创 2020-01-02 18:19:58 · 222 阅读 · 1 评论 -
redis 源码系列(5):能省一点是一点 --- intset
整数是计算机程序打交道最多的数据类型之一,对整数集合的存储和检索,往往会对程序的性能有至关重要的影响。redis 中用 zset 数据结构来处理整数集合(去重),并使用了一定的手段来优化器内存占用,同时又可以以 O(logN) 的时间复杂度来查找数据(ziplist 是 O(N)),而且可以以 O(1) 时间复杂度索引 set 内的某个位置的值。但是因为其底层存储是一个数组,所以插入和删除的时间...原创 2019-12-31 00:15:17 · 194 阅读 · 0 评论 -
redis 源码系列(4):通用双向链表 --- list
今天我们来学习一下 redis 中 通用双向链表 list 的实现,涉及到的代码有 src/adlist.h src/adlist.c首先来看一下主要结构体的定义,有 node,iterator、list 三个typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct list...原创 2019-12-27 21:33:20 · 181 阅读 · 0 评论 -
redis 源码系列(3):最不像链表的链表 --- ziplist
本文讲解 redis 中的 ziplist 数据结构。涉及到的代码文件有 src/ziplist.c src/ziplist.h关于 ziplist 的实现,源代码中作者添加了非常详细明了的注释,这些注释会成为我们后面学习这份代码的臂助。what/* *The ziplist is a special encoded dually linked list that is designed ...原创 2019-12-27 00:22:41 · 187 阅读 · 0 评论 -
redis 源码系列(2):一看就懂的 string 实现 --- sds
操纵字符串(string)对于大多数的程序,都是一项主要工作。但是 c 语言中没有内置 string 类型,所以 redis 封装了自己的 string 类型 sds。今天我们就看一下 redis 中的 string 是如何实现的。其对应的代码在 src/sds.h 和 src/sds.c 中。柔性数组在分析 redis 的字符串实现前,我们先岔开话题聊一下柔性数组。柔性数组或者叫做 Ar...原创 2019-12-24 13:00:59 · 189 阅读 · 0 评论 -
redis 源码系列(1):船新的渐进式 hash 表 --- dict
今天我们来分析一下 redis 中的 dict(hashtable)的实现原理redis dict首先来看几个重要的结构体定义// hash table entrytypedef struct dictEntry { void *key; union { void *val; uint64_t u64; int64_t s64; } v; // red...原创 2019-12-23 15:47:00 · 201 阅读 · 0 评论