redis
文章平均质量分 93
李兆龙的博客
Distributed Systems & NoSQL & Linux Kernel / eBPF & Chaos Engineering
展开
-
Mac下编译安装phpredis
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言这篇文章是我很久没写过的配置文章,我一般情况是不写这种文章的,但是今天配置phpredis的时候着实是花了点时间,而且目前网上对这一套过程没人有一套完整的记录过程,所以花半个小时记录下这个过程,对于后来的像我一样的php新手能够快速上手。这一套流程就是去解决你以前机器上没用过php,然后突然需要redis php的客户端,跑下面的流程就原创 2021-08-06 21:26:47 · 285 阅读 · 0 评论 -
抛弃哈希表?持久化数据结构HAMT探究
引言突然想聊聊这个问题的原因有二,一个持久化数据结构本身带来的可回滚的好处,这使得一种十分高效的forkless实现方案成为可能,虽然Redis想要支持意味着所有的数据结构都需要变成可持久化数据结构,这已经成了学术上难题而不是工程难题了;另一种是现在Redis社区已经在计划把HAMT引入Redis7.0,替换哈希表,这个代码已经写完了,但是社区还正在讨论,目前看来仲肥哥和oranagra对这个方案很赞同,那也就是五票已有两票,大概率我们可以在Redis7.0看到这个东西了。不过目前这个PR的老哥貌似遇到原创 2021-08-01 16:53:00 · 853 阅读 · 0 评论 -
Redis源码解析(27) Radix tree 源码解析
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言源码解析基础数据结构typedef struct rax { raxNode *head; uint64_t numele; uint64_t numnodes;} rax;typedef struct raxNode { uint32_t iskey:1; /* Does this no原创 2021-06-22 17:16:35 · 677 阅读 · 0 评论 -
Redis源码解析(26) listpack 源码解析
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言listpack是Redis5.0引入的一个全新的数据结构,看起来它更像是ziplist的替代品,因为保证了和ziplist一样的功能且避免了级联更新,但是可能是因为zipkist现在在hash和set结构中内嵌过于麻烦(猜的),这两个地方还没有被替换掉,倒是stream中用listpack来作为radix tree节点中存储前缀的压缩方原创 2021-06-14 22:20:53 · 1088 阅读 · 1 评论 -
Redis源码解析(25) 在线增量内存碎片处理
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。文章目录引言源码分析activeDefragCycledefragScanCallbackdefragLaterStep总结源码版本为6.2.3引言这是个非常有意思的特性,因为Redis本身的内存申请借助于jemalloc与自己封装的zmalloc系接口,所以可以很好的实现全局的内存统计与内存池化的功能,但是池化的问题也接踵而至,即内存碎原创 2021-06-12 21:53:42 · 633 阅读 · 7 评论 -
Tair黑魔法之HotRing
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言最近闲来无事,机缘巧合下在FAST’20 Research Track(USENIX Conference on File and Storage Techniques (FAST),CCF A类会议,存储领域顶会)中看到了熟悉的名字:欢神,宗岱大佬,飞刀大神。还能说什么呢,YYDS!!这篇paper的名称是《HotRing: A Ho原创 2021-06-10 17:39:37 · 459 阅读 · 1 评论 -
Redis Latency Monitoring 功能简述
引言Redis在2.8.13版本引入了Latency Monitoring功能,用于以秒为粒度监控各种事件的发生频率,虽然在设计上我个人认为有一点小问题,但是其不失为一种很好的性能监测工具。Latency功能提供了几个命令查看取得的数据,我注意到无论是官网文档还是博客其实几乎没有人详细的介绍这几个命令,所以有了这篇文章,但只说命令实在是没有意思,所以干脆把这篇文章写成介绍 Latency Monitoring 功能吧。本片文章从两个角度出发介绍Redis Latency Monitoring 功能,即L原创 2021-06-10 17:20:05 · 1383 阅读 · 0 评论 -
Redis源码解析(24) BIO机制探究
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。文章目录引言引言时隔十个月再次提笔去探究Redis相关的东西,心中还是有一点激动的。最近打算用两到三篇文章来再过一下Redis相关的东西,不但是对以前遗漏知识点的一点补充,也是对最近这一段时间复习Redis画上一个句号。这篇文章主要是想说一个问题,Redis到底是单线程还是多线程?简单在各大平台搜索了一下这个问题,发现至少百分之七十的文章原创 2021-01-31 20:37:22 · 545 阅读 · 2 评论 -
Redis源码解析(0) 概述与总结
参考:[译] 解密Redis持久化原创 2020-04-04 14:51:43 · 832 阅读 · 2 评论 -
Redis源码解析(23) SCAN命令实现
文章目录引言基础用法介绍命令实现结论引言KEYS与SCAN的区别可以说是老生常谈的一个问题了,本来打算写一篇名为<<KEYS与SCAN区别>>的博客来阐述它们之间的关系,但在我完成了源码分析以后就发现完全没有那个必要了,KEYS本就没什么可说的地方,想来想去,上面那个存在在于幻想中的博客的究其本质其实就是<<SCAN如何实现?>>.所以便有了这篇...原创 2020-04-04 14:51:33 · 950 阅读 · 2 评论 -
Redis源码解析(22) 事务
文章目录引言基础数据结构MULTlEXECWATCH引言redis通过MULTl,EXEC,WATCH,DISCARD来实现事务.因为redis本身是一个单线程的服务器,所有的请求会在IO多路复用处变为串行请求,这其实意味着事务的隔离性是天然的,相比于关系型数据库中复杂的隔离性,redis中就显得尤为简洁.然后持久性又是由配置决定的.所以重点讨论的其实就是原子性和一致性.那么原子性是如何实...原创 2020-04-04 14:51:14 · 480 阅读 · 0 评论 -
Redis源码解析(21) 集群[4] 故障转移failover与slave迁移
文章目录引言failoverCLUSTER FAILOVERCLUSTERMSG_TYPE_MFSTARTCLUSTERMSG_FLAG0_PAUSEDslave迁移引言在redis集群中一般来说我们需要给每个负责至少一个槽位的主节点都配置从节点,因为主节点加入出现某些不可控情况宕机,它的槽上数据就没办法转移了,也就是说这几个槽现在是没有人负责的,这是整个集群就处于下线状态了.所以redis...原创 2020-04-04 14:50:06 · 1434 阅读 · 0 评论 -
Redis源码解析(20) 集群[3] 键的存储,重新分片与重定向
文章目录引言基础数据结构槽指派重新分片1. `CLUSTER SETSLOT IMPORTING `2. `CLUSTER SETSLOT MIGRATING `3. `CLUSTER GETKEYSINSLOT `4. `MIGRATE `5. `RESTORE-ASKING`7. `CLUSTER SETSLOT NODE `MOVED与ASK引言...原创 2020-04-04 14:49:54 · 914 阅读 · 0 评论 -
Redis源码解析(19) 集群[2] 主从复制,故障检测与故障转移
文章目录引言主从复制故障检测故障转移从节点请求投票主节点投票从节点接收投票更新配置引言在redis集群中只有所有的槽都有所属节点以后才会被标记为上线,也就是说如果哪怕只有一个槽没有被分配给集群的节点,那么这个集群都是下线的,因为就算有一个槽没有被分配,向集群中插入数据都是不安全的.而集群中一个节点一般都负责多个槽,如果出现宕机下线,那么整个集群都会下线,这是我们一定不希望看到的.所以在redi...原创 2020-04-04 14:49:35 · 897 阅读 · 1 评论 -
Redis源码解析(18) 集群[1]初始化,握手与心跳检测
引言所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定,高效的状态.Redis集群是Redis提供的分布式数据库方案.它允许在集群中添加从节点,且不需要sentinel就可以保证高可用,在主节点下线时不必使得集群整体下线就可以进行故障转移.使用哈希槽而不是一致性哈希来解决集群分布式缓存问题,使得我们可以向集群中插入一个新节点的时候不必进行不必要的数据迁移.使用Goss...原创 2020-04-04 14:49:21 · 962 阅读 · 0 评论 -
Redis源码解析(17) 哨兵机制[4] 故障转移
引言开始故障转移的前提是我们已经确定某个节点是要下线的了,但是此时可能不止我们一个sentinel节点这样认为,可能有很多节点都得到了这个结论.这里我们先确定故障转移需要一个sentinel成为leader,去向宕机的主服务器的从服务器中选出一个作为新的主服务器,sentinel作为其客户端,向这个升级的节点发送slave no one,向其他节点发送slave of,作为这个升级的主服务器的从...原创 2020-04-04 14:49:11 · 692 阅读 · 0 评论 -
Redis源码解析(16) 哨兵机制[3] 判断下线
文章目录引言sentinelHandleRedisInstancesentinelCheckSubjectivelyDownsentinelCheckObjectivelyDownsentinelAskMasterStateToOtherSentinelssentinelStartFailoverIfNeeded引言上一篇文章我们分析了如何使得sentinel在配置文件中只有主服务器节点的情况...原创 2020-04-04 14:48:59 · 867 阅读 · 1 评论 -
Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式
引言其实这里的副标题"信息同步"是有点混淆视听,这篇文章并不是将"一致性"这样一个问题.在我们使用redis提供的哨兵时,我们只需要在每一个哨兵的配置文件中写上它所要监控的主服务器地址即可,我们根本不必去关心其他sentinel节点和从服务器,它们会在sentinel集群的交互过程中自动交换信息,这篇文章要将的就是这样一个区间[初始化完成后,主服务器主观下线前],在这个区间中所有有关系的sent...原创 2020-04-04 14:48:32 · 1646 阅读 · 0 评论 -
Redis源码解析(14) 哨兵机制[1] 结构与初始化
文章目录引言结构与初始化初始化结构sentinelTimer引言sentinel(哨兵)是redis高可用的解决方案,它是一个由多个sentinel节点构成的一个分布式系统.可以监控理论上任意多个主节点以及其从服务器,而且我们在配置的时候也是非常简单,只需要指定sentinel监控的主服务器即可,不需要指定其他sentinel与从服务器,这些可以在运行后的信息交互中得出.其高可用性体现在sen...原创 2020-04-04 14:48:21 · 844 阅读 · 0 评论 -
Redis源码解析(13) 主从复制
文章目录引言源码解析replicationSetMasterconnectWithMastersyncWithMasterslaveTryPartialResynchronizationreadSyncBulkPayload引言主从复制是redis原生提供的一种建立一个辅助数据库,其数据与主服务器保证一定程度的数据一致性,可以水平扩展数据库的负载能力,容错,高可用,数据备份.基本的操作就是建立...原创 2020-04-04 14:48:04 · 977 阅读 · 0 评论 -
Redis源码解析(12) 命令执行过程
引言了解redis中命令的执行过程有助于我们更加清楚很多redis的子模块是什么时候执行的.简单来说命令的执行过程是这样的,首先它在网络框架中的读处理器中被调用,即readQueryFromClient,我们在读处理器得到了此次从客户端收到的信息,如果可以解析成正确的命令和参数且此时缓冲区内无空余,认为此次解析成功,然后根据key在命令字典中查找对应的回调函数,找到后执行命令,接着返回其应有的...原创 2020-04-04 14:47:34 · 791 阅读 · 0 评论 -
Redis源码解析(11) 内存淘汰策略
文章目录引言对redis内存淘汰策略的看法最大容量究竟是多少?源码解析部分freeMemoryIfNeededevictionPoolPopulatedictGetRandomKeys引言内存淘汰策略是在存储数据较多,内存不够用时及其必要的一种释放内存的策略,可以使得在大量数据到来的时候服务器不至于宕机.redis中内置了六种内存淘汰机制,实现的功能都是一样的,通过某种手段找到需要删除的键,然...原创 2020-04-04 14:47:23 · 902 阅读 · 10 评论 -
Redis源码解析(10) 网络框架
引言redis网络部分是一个单线程,事件驱动,基于reactor模式实现的网络框架.redis把所有的事件分为两类,文件事件与时间事件.文件事件其实就是套接字事件,也就是服务器accept了一个fd以后,这个fd上到来的事件.而时间事件我们可以简单的看为定时时间,redis中这里的实现很有意思,不同于以前看过的网络框架中定时时间采用事件驱动来保证执行,这里则是为IO multiplex指定一个...原创 2020-04-04 14:47:04 · 817 阅读 · 0 评论 -
Redis源码解析(9) RDB持久化
引言RDB是redis中的一种持久化方式,以二进制形式存储在文件中,且排列非常紧凑,这也意味着文件更小,我们可以更快的载入数据,但其也有坏处,就是及其容易丢失数据,.因为其会遵循配置文件中默认的配置X秒Y条数据的写入时会执行RDB,但未满足时便一直存在内存中,如果此时服务器宕机甚至断电,距上一次持久化到现在的数据都将丢失.因为其在持久化时会把所有的数据全部写入一个临时文件,然后改名,在后台执行时...原创 2020-04-04 14:46:51 · 480 阅读 · 0 评论 -
Redis源码解析(8) AOF持久化
文章目录引言AOF策略事件循环中的flush操作重写操作重写结束后主线程操作引言AOF持久化是为了弥补RDB持久化中数据丢失的不可控性和在执行RDB时消耗的大量资源(需要把所有数据库的所有键值都拷贝到RDB文件中)而存在的一种持久化.AOF非常类似与MySQL中的redo日志,它们都是记录每条使得服务器状态做出改变的命令,以顺序IO插入到AOF文件(mysql中当然不是这个)中.AOF策略...原创 2020-04-04 14:46:39 · 781 阅读 · 0 评论 -
Redis源码解析(7) 发布订阅机制
void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) { sds chan; robj *chanobj, *eventobj; int len = -1; char buf[24]; /* If notifications for this class of events...原创 2020-04-04 14:46:14 · 584 阅读 · 0 评论 -
Redis源码解析(6) 键的过期处理策略
惰性删除//在数据库中获取某个键的过期时间long long getExpire(redisDb *db, robj *key) { dictEntry *de; //储存字典中返回的项 /* No expire? return ASAP */ // 在expire字典中获取键的过期时间 // 如果过期时间不存在,那么直接返回 if (dictSiz...原创 2020-04-04 14:45:59 · 640 阅读 · 0 评论 -
Redis源码解析(5) 压缩列表
引言压缩列表是在列表中元素较少的时候作为列表和哈希键的底层实现之一,它最大程度的节省了内存,但却增加的各种操作的时间复杂度,在元素较少的时候是一种优秀的数据结构,因为此时的操作带来的时间损耗是可以忽略不计的.压缩列表确实是一种神奇的数据结构,每一项的大小都不相同,且不使用指针却能把所有的数据巧妙的连接起来.但因为其操作时间复杂度的原因,它的适用场景实在是不多,redis这样对内存要求及其严格的...原创 2020-04-04 14:45:43 · 434 阅读 · 1 评论 -
Redis源码解析(4) 整数集合
引言整数集合是集合键的底层实现之一,它其中提供了"升级"机制来节省内存,但带来的是当升级时要进行的O(N)的拷贝.它只运用在集合都是整数且数量不多的时候,整数不必多说,数量不多是因为其插入的复杂度是O(N),当数据多了以后是巨慢无比的.typedef struct intset { // 编码方式 uint32_t encoding; //初始编码为INTSET_EN...原创 2020-04-04 14:45:23 · 498 阅读 · 0 评论 -
Redis源码解析(3) 跳跃表
引言跳跃表是一个非常实用的数据结构,有趋近于红黑树的效率,却比红黑树简单的多.Redis中用跳跃表来作为有序set的数据结构之一,在集群中也有使用,确实是我们应该掌握的一种数据结构.redis中跳跃表的实现也是非常的经典,且十分易懂,不管从什么角度来说,于我们而言确实都是很值得学习的.我们首先来看看基础的数据结构typedef struct zskiplistNode { // 成...原创 2020-04-04 14:45:10 · 531 阅读 · 0 评论 -
Redis源码解析(2) 字典与迭代器
引言字典这个结构是redis中非常重要的一种结构,其不仅可以作为数据库的结构,还可以作为哈希表的结构,是一个非常重要的数据结构,这篇文章先列出其中重要的数据结构,然后重点分析dictAdd,由此推出扩容策略与渐进式rehash.//哈希表结点typedef struct dictEntry { // 键 用于哈希冲突的时候进行比较 void *key; ...原创 2020-04-04 14:44:57 · 866 阅读 · 0 评论 -
Redis源码解析(1) 动态字符串与链表
Redis源码解析:01简单动态字符串SDSRedis源码解析:02链表原创 2020-04-04 14:44:38 · 860 阅读 · 0 评论 -
Twemproxy安装配置与使用
引言Twemproxy是一个由twitter开源的一个服务于redis和memcache的代理服务器,其减少了和缓存服务器直接连接的用户数量,其基本思想就是对用户的key进行哈希以后放入不同的redis集群,这样可以在一定程度上增加写的性能,解决了主从复制中写瓶颈的问题,但这也带来了一些问题,比如数据在多个集群之间是互相不可见的,那么如果一个集群挂了,数据虽然没有丢失(取决于redis中AOF的...原创 2020-03-16 21:45:37 · 684 阅读 · 0 评论 -
问题解决: Failed to start redis.service: Unit redisd.service not found.
引言这个问题出现在把redis编译安装以后,执行其中的/redis-3.2.3/utils/install_server.sh脚本把redis注册成一个服务以后出现的问题.默认的服务名称应该是redis_6379, 在init.d下可以看到,为了更加方便,我把其改为了redisd我们可以看到并没有运行成功解决的方法是执行如下命令systemctl enable redisd //后面是...原创 2020-03-15 10:51:14 · 46766 阅读 · 0 评论