
redis
文章平均质量分 94
wenfh2020
个人博客 - wenfh2020.com
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[hiredis 源码走读] 异步回调机制剖析
hiredis 是 redis 的一个 c - client,异步通信非常高效。单链接异步压测,轻松并发 10w+,具体请参考《hiredis + libev 异步测试》。本章主要剖析 hiredis 异步回调机制原理,围绕三个问题,展开描述。异步回调原理。异步回调如何保证 request/response 时序。单链接异步读写 redis,为何能并发 10w+。文章来源????:《[hiredis 源码走读] 异步回调机制剖析》1. 异步回调原理先看看异步通信流程。设计图来源:原创 2021-09-02 11:09:22 · 533 阅读 · 0 评论 -
[redis 源码走读] raft 一致性算法
raft 一致性算法,它是分布式系统中一种高可用算法策略。只单纯看论文算法,很难掌握它的工作流程,在 redis 里 raft 算法主要体现在:redis 主从数据复制 和 sentinel 故障转移,如果你有兴趣,可以研究对应 redis 源码,当这两个点理解了,raft 算法自然就理解了。???? 文章来源 《[redis 源码走读] raft 一致性算法》1. 算法文档raft 算法官网《The Raft Consensus Algorithm》(连接可能需要翻墙)raft 算法中文翻原创 2020-12-02 15:12:32 · 967 阅读 · 0 评论 -
[redis 源码走读] sentinel 哨兵 - 故障转移
接上一章投票选举 《[redis 源码走读] sentinel 哨兵 - 选举投票》。前面几章已经讲了:各个角色的通信,主客观下线,投票选举,当 sentinel 的 leader 被选出来后,由它来完成 redis 实例的角色转换。1. 故障转移故障转移有很多个环节组成,集群中每个 sentinel 都有机会执行,但是只有在选举过程中,赢得选票的人,才能完整完成整个故障转移流程。1.1. 流程sentinel 的故障转移流程有几个环节组成,主要可以看它源码定义的几个宏:/* 初始状态。*/#原创 2020-12-02 14:59:14 · 460 阅读 · 0 评论 -
[redis 源码走读] sentinel 哨兵 - 选举投票
在 sentinel 故障转移的流程上,当 sentinel 确认 master 客观下线(《[redis 源码走读] sentinel 哨兵 - 主客观下线》)后,那么它要进入 选举投票 环节。多个 sentinel 有可能在同一个时间段内一起发现某个 master 客观下线,如果多个 sentinel 同时执行故障转移,有可能会乱套,也可能出现“脑裂”现象(《[redis 源码走读] sentinel 哨兵 - 脑裂处理方案》),所以在一个集群里,多个 sentinel 需要通过投票选出一个代表,由代原创 2020-12-02 14:47:55 · 1050 阅读 · 0 评论 -
[redis 源码走读] sentinel 哨兵 - 主客观下线
redis 哨兵集群有 3 个角色:sentinel/master/slave,每个角色都可能出现故障,故障转移主要针对 master,而且故障转移是个复杂的工作流程。在分布式系统中,多个节点要保证数据一致性,需要相互通信协调,要经历几个环节:master 主观下线 --> master 客观下线 --> 投票选举 leader --> leader 执行故障转移。本章重点走读 redis 源码,理解 sentinel 检测 master 节点的主客观下线流程。1. 故障转移流原创 2020-12-02 14:43:43 · 547 阅读 · 0 评论 -
[redis 源码走读] sentinel 哨兵 - 节点发现流程
承接上一章 《[redis 源码走读] sentinel 哨兵 - 原理》,本章通过 strace 命令从底层抓取 sentinel 工作日志,熟悉节点通信流程,阅读相关源码。1. 工作流程1.1. 命令下面两个命令都可以启动 sentinel 进程。redis-sentinel /path/to/your/sentinel.confredis-server /path/to/your/sentinel.conf --sentinel通信命令。struct redisCommand原创 2020-12-02 14:37:31 · 595 阅读 · 0 评论 -
[redis 源码走读] sentinel 哨兵 - 原理
redis 有主从数据复制功能。多个实例通过读写分离,使得单进程的 redis 可以充分利用多核性能。当某些 redis 实例出现故障怎么办,服务还能正常工作吗?这时候故障管理者 sentinel 应运而生。它负责 redis 集群管理工作:检查故障,发现故障,转移故障,从而保证集群高可用。1. sentinel 作用监控: 检查 redis 节点健康状况。故障转移:当 redis 集群节点出现故障时,及时自动进行故障转移。通知:检测到 redis 实例出现故障,通过 api 进行通知用户。原创 2020-12-02 14:17:51 · 142 阅读 · 0 评论 -
redis 为啥这么快
天下武功,唯快不破。redis 为什么那么快?redis 单进程并发 10w+ (hiredis + libev 异步测试)。本章从这几个角度进行分析:单进程,单线程,多线程,多进程,多实例。????文章来源:《redis 为啥这么快》1. 单进程redis 核心逻辑在单进程主线程里实现。1.1. 单线程数据存储在内存。redis 的应用场景,一般作为缓存,它的数据存储在内存,而 cpu 访问内存速度非常快。哈希表。redis 数据库是 Nosql 数据库,它的数据访原创 2020-11-16 00:12:30 · 119 阅读 · 0 评论 -
[redis 源码走读] 异步通信流程-单线程
重点描述服务异步通信核心非阻塞 + 异步事件驱动。事件驱动核心源码ae.c网络通信核心源码connection.h / connection.c,networking.h / networking.c读/写数据核心函数readQueryFromClient / writeToClient本文主要讲述 Linux 平台下的 redis 客户端与服务端异步通信(单线程),不包括 redis 集群间的通信。???? 文章来源:《[redis 源码走读] 异步通.原创 2020-11-16 00:09:37 · 234 阅读 · 0 评论 -
[redis 源码走读] 主从数据复制(下)
redis 主从模式主要作用:读写分离,提高系统的负载能力;保证服务高可用。本章走读 redis 6.0 源码 github,理解 redis 主从数据复制流程。????文章来源:《[redis 源码走读] 主从数据复制(下)》1. PSYNC1.1. slave发送 PSYNC 命令,处理 master 回复。void syncWithMaster(connection *conn) { ... if (server.repl_state == REPL_STAT原创 2020-11-16 00:07:18 · 182 阅读 · 0 评论 -
[redis 源码走读] 主从数据复制(上)
阅读源码前,先了解 redis 主从复制的基本知识。详细源码分析,请参考下一章:[redis 源码走读] 主从数据复制(下)????文章来源:《[redis 源码走读] 主从数据复制(上)》1. 复制模式# Master-Replica replication. Use replicaof to make a Redis instance a copy of# another Redis server. A few things to understand ASAP about Re原创 2020-11-16 00:04:52 · 343 阅读 · 0 评论 -
[redis 源码走读] 事件 - 文件事件
redis 服务底层采用了异步事件管理(aeEventLoop):管理时间事件和文件事件。对于大量网络文件描述符(fd)的事件管理,redis 建立在安装系统对应的事件驱动基础上(例如 Linux 的 epoll)。关于事件驱动,本章主要讲述 Linux 系统的 epoll 事件驱动。关于事件处理,本章主要讲述文件事件,时间事件可以参考帖子 [redis 源码走读] 事件 - 定时器。????文章来源:wenfh2020.com1. 事件驱动redis 根据安装系统选择对应的事件驱动原创 2020-05-18 19:11:11 · 222 阅读 · 0 评论 -
[redis 源码走读] 事件 - 定时器
定时器是 redis 异步处理事件的一个十分重要的功能。redis 定时器功能由多个时间事件组成,事件由一个双向链表维护。时间事件可以处理多个定时任务。理解 redis 定时器,我们带着问题,看看 redis 是怎么处理的:定时器作用是什么。定时器实现原理。单进程里如何同时处理文件事件和时间事件。如何实现多定时任务。????文章来源:wenfh2020.com1. 作用定时器是 redis 异步处理任务的一个十分重要的功能。核心逻辑在 serverCron 函数里。对设置了过原创 2020-05-18 19:01:43 · 1074 阅读 · 0 评论 -
redis 持久化方式 - aof 和 rdb 区别
aof 和 rdb 是 redis 持久化的两种方式。我们看看它们的特点和具体应用场景区别。此博客将逐步迁移到作者新的博客,可以点击此处进入。文章目录持久化特点aofrdb使用场景区别持久化详细文档持久化特点aofaof 是写命令追加到持久化文件的方式。aof 支持几种持久化策略,其中每秒数据增量存盘一次效率比较高。aof 支持 rdb 混合型存储(需要重写处理)。aof...原创 2020-04-08 20:26:10 · 314 阅读 · 2 评论 -
[redis 源码走读] aof 持久化 (下)
[redis 源码走读] aof 持久化,文章篇幅有点长,所以拆分上下为两章,可以先读上一章,再读这一章。此博客将逐步迁移到作者新的博客,可以点击此处进入。文章目录应用场景启动加载写命令执行流程定时保存重写重写方式重写实现调试总结参考应用场景启动加载redis 启动,程序会模拟一个客户端加载从 aof 文件读出的命令。aof 持久化支持 aof 和 rdb 混合模式,参考上...原创 2020-04-05 14:50:52 · 237 阅读 · 0 评论 -
[redis 源码走读] aof 持久化 (上)
aof (Append Only File) 是 redis 持久化的其中一种方式。服务器接收的每个写入操作命令,都会追加记录到 aof 文件末尾,当服务器重新启动时,记录的命令会重新载入到服务器内存还原数据。这一章我们走读一下源码,看看 aof 持久化的数据结构和应用场景是怎样的。主要源码逻辑在 aof.c 文件中。此博客将逐步迁移到作者新的博客,可以点击此处进入。文章目录开启 a...原创 2020-04-05 14:44:55 · 306 阅读 · 0 评论 -
[redis 源码走读] rdb 持久化 - 应用场景
此博客将逐步迁移到作者新的博客,可以点击此处进入。rdb 文件是一个经过压缩的二进制文件,是 redis 持久化方式之一。本章主要讲 rdb 应用场景。文章目录配置异步持久化应用场景服务启动加载数据命令数据定期持久化重写 aof 文件信号终止进程主从复制总结参考配置redis 有两种持久化方式,分别为:aof 和 rdb,默认开启 rdb,本章重点讲 rdb。# redis.co...原创 2020-03-30 06:51:43 · 301 阅读 · 0 评论 -
[redis 源码走读] rdb 持久化 - 文件结构
博客将逐步迁移,可以点击此处进入作者新的博客。rdb 文件是一个经过压缩的二进制文件,上一章讲了 rdb 持久化 - 应用场景,本章主要讲述 rdb 文件的结构组成包含了哪些数据。文章目录rdb 临时文件逐步持久化结构数据保存时序保存集群复制信息保存属性信息保存 key-value参考rdb 临时文件redis 内存数据异步落地到临时 rdb 文件,成功存储后,临时文件覆盖原有文件...原创 2020-03-30 06:45:18 · 261 阅读 · 0 评论 -
[redis 源码走读] maxmemory 数据淘汰策略
redis 是内存数据库,可以通过 redis.conf 配置 maxmemory,限制 redis 内存使用量。当 redis 主库内存超出限制时,命令处理将会触发数据淘汰机制,淘汰(key-value)数据,直至当前内存使用量小于限制阈值。更精彩内容,可以关注我的博客:wenfh2020.com文章目录数据淘汰策略概述配置数据淘汰时机数据淘汰策略不淘汰数据(noeviction)随机...原创 2020-03-21 07:04:21 · 328 阅读 · 0 评论 -
[redis 源码走读] redis 过期策略
redis 可能存在大量过期数据,一次性遍历检查不太现实。redis 有丰富的数据结构,key-value, value 数据结构对象(redisObj)可能存储大量数据,key 过期了,value 也不建议在进程中实时回收。为了保证系统高性能,每次处理一点点,逐渐完成大任务,“分而治之”这是 redis 处理大任务的一贯作风。更精彩内容,请关注我的博客:wenfh2020.com文章目...原创 2020-03-21 06:49:20 · 330 阅读 · 0 评论 -
[redis 源码走读] 对象(redisObject)
redis 对象redis 对数据的处理用对象进行管理,目前有5种类型。每种对象类型并不是用单一的编码类型实现,根据应用场景,往往多种编码类型结合使用。对象数据结构typedef struct redisObject { // 对象类型 unsigned type:4; // 对象编码类型 unsigned encoding:4; // 对象操作时...原创 2020-02-05 04:48:05 · 173 阅读 · 0 评论 -
[redis 源码走读] 整数集合(inset)
整数集合整数集合,是一个有序的数值数组对象,存储的数值不允许重复。源码在 inset.c数据结构/* Note that these encodings are ordered, so: * INTSET_ENC_INT16 < INTSET_ENC_INT32 < INTSET_ENC_INT64. */#define INTSET_ENC_INT16 (sizeof(i...原创 2020-02-04 10:25:50 · 289 阅读 · 0 评论 -
[redis 源码走读] 跳跃表(skiplist)
跳跃表张铁蕾的博客将 skiplist 原理和算法复杂度描述得很清楚,具体可以参考。我分享一下自己对部分源码的阅读情况和思考。数据结构跳跃表是一个有序的双向链表。理解 zskiplistNode 的 zskiplistLevel 是理解zskiplist工作流程的关键。/* ZSETs use a specialized version of Skiplists */typedef s...原创 2020-02-03 10:32:00 · 143 阅读 · 0 评论 -
[redis 源码走读] 压缩列表(ziplist)
压缩列表点赞作者:redis 源码,注释很多而且很详细。看压缩列表源码前,可以先看看 ziplist.c 文件顶部注释,基本可以了解该数据结构设计。压缩列表ziplist是一个双向链表,设计主要是为了节省内存。保存字符串,数值两种类型( It stores both strings and integer values),列表内部实现主要是对一块连续内存进行管理,列表支持列表头尾的插入或弹出...原创 2020-01-30 12:53:37 · 280 阅读 · 0 评论 -
[redis 源码走读] zmalloc
内存管理redis 内存管理实现,有三种方式:jemalloc (谷歌)tcmalloc (facebook)libc (系统)其中 jemalloc, tcmalloc 是第三方的实现,libc 的实现相对简单,没有做成一个内存池。没有像 nginx那样,有自己的内存管理链表。频繁向内核申请内存不是明智的做法。作者应该是推荐使用 tcmallic 或 jemalloc。// 理解...原创 2020-01-19 11:53:12 · 157 阅读 · 0 评论 -
[redis 源码走读] 字典(dict)
字典redis 是 key-value 的 NoSQL 数据库,dict 是基本数据结构,dict 总体来说是一个哈希表,哈希表 O(1)O(1)O(1) 的时间复杂度,能高效进行数据读取。dict 还有动态扩容/缩容的功能,能灵活有效地使用机器内存。因为 redis 是单进程服务,所以当数据量很大的时候,扩容/缩容这些内存操作,涉及到新内存重新分配,数据拷贝。当数据量大的时候,会导致系统卡顿...原创 2020-01-16 17:44:38 · 224 阅读 · 0 评论 -
[redis 源码走读] sds
数据结构为了节省空间,增加内存的利用率,struct 数据结构没有进行内存对齐,redis 的瓶颈不在 cpu 而在内存。同时,为了灵活处理不同长度范围的字符串,redis 定义了下面几种数据结构。typedef char *sds;#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))#def...原创 2020-01-15 13:24:42 · 380 阅读 · 0 评论 -
学习总结有感
喜欢王垠的一篇文章《学习的智慧》,所有活知识都是对死知识思考实践过程产生的结果。实际问题千变万化,不可能让你生搬硬套,没有思考实践积累,自然就不可能收获解决问题的结果。基础决定你的下限,思维深度决定你的上限。当你陷入一个瓶颈,需要从这两个方面考虑。学而不思则罔,知识的总结和梳理,可以让思维更高效地思考。温故而知新, 最近重温《深入理解计算机系统》《算法导论》,结合这些年做过的项目实践,从另外...原创 2020-01-07 08:48:13 · 143 阅读 · 0 评论 -
redis & gdb & vscode & debug 调试
可以通过 gdb 调试 redis 源码,理解 redis 工作流程。gdb 常用命令详细文档通过命令查看:man gdb命令操作r运行调试n下一步c继续运行ctrl + c中断信号c/continue中断后继续运行s进入一个函数finish退出函数l列出代码行b断点显示断点列表 info b删除断点...原创 2020-01-05 17:45:41 · 860 阅读 · 0 评论 -
redis 脑裂现象
脑裂由于网络问题,集群节点失去联系。主从数据不同步;重新平衡选举,产生两个主服务。两套主服务一起运行,导致数据不一致。参考 redis 脑裂等极端情况分析解决方案比较简单的方案,进行 redis 设置// master 至少有 3 个副本连接min-slaves-to-write 3// 数据复制和同步的延迟不能超过 10 秒min-slaves-max-lag 10r...原创 2019-12-27 07:06:06 · 783 阅读 · 0 评论 -
hiredis + libev 异步测试
概述测试写命令 set key value,几个字节的 value,轻松 10 万+ 并发;1024 个字节的 value,1.5 秒左右。所以 hiredis 的异步使用性能非常给力的,也是同步使用不能比的。而且程序的性能损耗也不高,具体如下图(本地性能)只是异步使用有点反人类,业务都要在 callback 里面处理,没有同步调用那么直观。libev 是一个不错的事件驱动库,在这...原创 2018-06-17 08:33:09 · 1192 阅读 · 0 评论 -
golang 压测redis 消息队列。
用 redis 的 list 数据结构作为轻量级的消息队列,对于小系统确实是小而美,可控能力强。当然与kafka 和 rabbitmq 相比它还有很多缺陷,在服务进行生产和消费的时候,还需要加上部分逻辑进行处理。自己写了点 golang 代码,压力测试 redis 列表的性能,golang 的 redis 第三方库 redigo。机器配置:双核,4G测试数据:100w压力测试...原创 2018-07-29 15:08:37 · 3360 阅读 · 0 评论