redis
文章平均质量分 80
gqtcgq
这个作者很懒,什么都没留下…
展开
-
Redis源码解析:29事务
Redis通过MULTl,EXEC,WATCH,DISCARD等命令来实现事务(transaction)功能。 事务从MULTI命令开始,之后,该客户端发来的其他命令会被排队,客户端发来EXEC命令之后,Redis会依次执行队列中的命令。并且在执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕后,然后才去处理其他客户端的命令请求。原创 2016-07-06 20:47:13 · 1939 阅读 · 0 评论 -
Redis源码解析:20sentinel(一)初始化、建链
sentinel(哨兵)是redis的高可用解决方案。由一个或多个sentinel实例组成的分布式系统,可以监控任意多个主节点,以及它们属下的所有从节点。当某个主节点下线时,sentinel可以将下线主节点属下的某个从节点升级为新的主节点。 一:哨兵进程 哨兵,本质上是redis服务器的一种运行模式。也就是说它们共用大部分的代码,只是哨兵模式中有部分代码是自己特有的。原创 2016-05-29 12:34:39 · 3075 阅读 · 0 评论 -
Redis源码解析:17Resis主从复制之主节点的部分重同步流程及其他
本文主要讲解主节点部分重同步的实现,以及主从复制中的其他功能。本文是Redis主从复制机制的最后一篇文章。 主节点在收到从节点发来的PSYNC命令之前,主节点的部分重同步流程,与完全重同步流程是一样的。在收到PSYNC命令后,主节点调用masterTryPartialResynchronization函数,尝试进行部分重同步。 首先看一下部分重同步的实原创 2016-04-30 17:31:13 · 4857 阅读 · 0 评论 -
Redis源码解析:15Resis主从复制之从节点流程
Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡。 一:主从复制过程 Redis的复制功能分为同步(sync)和命令传播(commandpropagate)两个操作: 同步操作用于将从节点的数据库状态更新至主节点当前所处的数据库状态; 命令传播操作则用于在主节点的原创 2016-04-17 10:43:46 · 5100 阅读 · 5 评论 -
Redis源码解析:16Resis主从复制之主节点的完全重同步流程
主从复制过程中,主节点根据从节点发来的命令执行相应的操作。结合上一章中讲解的从节点在主从复制中的流程,本章以及下一篇文章讲解一下主节点在主从复制过程中的流程。 本章主要介绍完全重同步流程。 一:从节点建链和握手 从节点在向主节点发起TCP建链,以及复制握手过程中,主节点一直把从节点当成一个普通的客户端处理。也就是说,不为从节点保存状态,只是收到从节点原创 2016-04-25 12:20:54 · 4700 阅读 · 2 评论 -
Redis源码解析:19Hiredis异步API代码解析
Hiredis中的异步API函数需要与事件库(libevent,libev, ev)一起工作。因为事件循环的机制,异步环境中的命令是自动管道化的。因为命令是异步发送的,因此发送命令时,必要情况下,需要提供一个回调函数,以便在收到命令回复时调用该函数。 异步API涉及到的函数分别是:redisAsyncContext *redisAsyncConnect(const char *原创 2016-05-12 09:40:57 · 12550 阅读 · 0 评论 -
Redis源码解析:12AOF持久化
除了RDB持久化功能之外,Redis还提供了AOF(AppendOnly File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。与RDB持久化相比,AOF持久化可能丢失的数据更少,但是AOF持久化可能会降低Redis的性能。 写人AOF文件的所有命令都是以Redis的统一请求协议原创 2016-03-29 12:55:55 · 1359 阅读 · 1 评论 -
Redis源码解析:11RDB持久化
Redis的RDB持久化的相关功能主要是在src/rdb.c中实现的。RDB文件是具有一定编码格式的数据文件,因此src/rdb.c中大部分代码都是处理数据格式的问题。 一:RDB文件格式 上图就是一个完整RDB文件的格式。 RDB文件的最开头是REDIS部分,这个部分的长度为5字节,保存着"REDIS"五个字符。通过这个字符原创 2016-03-19 21:55:19 · 2054 阅读 · 0 评论 -
Redis源码解析:14Redis服务器与客户端间的交互
Redis服务器是典型的一对多服务器程序,通过使用由IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。 Redis客户端与服务器之间通过TCP协议进行通信。TCP协议是一种流式协议,数据以字节流的形式进行传递,没有固有的"报文"或"报文边界"的概念,如果需要设置边界,需要应用层自行处理。原创 2016-04-09 17:07:21 · 6155 阅读 · 0 评论 -
Redis源码解析:26集群(二)键的分配与迁移
Redis集群通过分片的方式来保存数据库中的键值对:一个集群中,每个键都通过哈希函数映射到一个槽位,整个集群共分16384个槽位,集群中每个主节点负责其中的一部分槽位。当数据库中的16384个槽位都有节点在处理时,集群处于上线状态;相反,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态。所谓键的分配,实际上就是指槽位在集群节点中的分配;所谓键的迁移,实际上指槽位在集群节点间的迁移原创 2016-06-25 11:46:50 · 3552 阅读 · 0 评论 -
Redis源码解析:21sentinel(二)定期发送消息、检测主观下线
六:定时发送消息 哨兵每隔一段时间,会向其所监控的所有实例发送一些命令,用于获取这些实例的状态。这些命令包括:”PING”、”INFO”和”PUBLISH”。 “PING”命令,主要用于哨兵探测实例是否活着。如果对方超过一段时间,还没有回复”PING”命令,则认为其是主观下线了。 “INFO”命令,主要用于哨兵获取实例当前的状态和信息,比原创 2016-05-29 13:05:59 · 3381 阅读 · 0 评论 -
Redis源码解析:25集群(一)握手、心跳消息以及下线检测
Redis集群是Redis提供的分布式数据库方案,通过分片来进行数据共享,并提供复制和故障转移功能。 一:初始化1:数据结构 在源码中,通过server.cluster记录整个集群当前的状态,比如集群中的所有节点;集群目前的状态,比如是上线还是下线;集群当前的纪元等等。该属性是一个clusterState类型的结构体。该结构体的定义如下:typedef struct原创 2016-06-20 19:34:43 · 8716 阅读 · 1 评论 -
Redis源码解析:28集群(四)手动故障转移、从节点迁移
一:手动故障转移 Redis集群支持手动故障转移。也就是向从节点发送”CLUSTER FAILOVER”命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原来的主节点降级为从节点。 为了不丢失数据,向从节点发送”CLUSTER FAILOVER”命令后,流程如下: a:从节点收到命令后,向主节点发送CLUSTER原创 2016-07-05 12:30:44 · 6891 阅读 · 2 评论 -
Redis源码解析:27集群(三)主从复制、故障转移
一:主从复制 在集群中,为了保证集群的健壮性,通常设置一部分集群节点为主节点,另一部分集群节点为这些主节点的从节点。一般情况下,需要保证每个主节点至少有一个从节点。 集群初始化时,每个集群节点都是以独立的主节点角色而存在的,通过向集群节点发送”CLUSTER MEET ”命令,可以使集群节点间相互认识。节点间相互认识之后,可以通过向某些集群节点发原创 2016-07-05 12:22:01 · 4144 阅读 · 0 评论 -
Redis源码解析:30发布和订阅
Redis的发布与订阅功能,由SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,以及PUBLISH等命令实现。 通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道。当有客户端通过PUBLISH命令向某个频道发布消息时,频道的所有订阅者都会收到这条消息。 除了订阅具体的频道之外,客户端还可以通过执行PSUBS原创 2016-07-13 12:52:09 · 3308 阅读 · 0 评论 -
Redis源码解析:18Hiredis同步API和回复解析API代码解析
Redis的sentinel模式使用了Hiredis代码,Hiredis是redis数据库一个轻量级的C语言客户端库。它实现的向Redis发送命令的API函数redisCommand,使用方法类似于printf。因此只要熟悉redis命令,就可以很容易的使用该函数将redis命令字符串,转换成统一请求协议格式之后,发送给Redis服务器。 Hiredis库包含三类API:同步操原创 2016-05-08 09:55:22 · 5993 阅读 · 3 评论 -
Redis源码解析:24sentinel(五)TLIT模式、执行脚本
十一:TILT模式 根据之前的介绍可知,哨兵的运行,非常依赖于系统时间,但是当系统时间被调整,或者哨兵中的流程因为某种原因(比如负载较高、IO发生阻塞、进程被信号停止等)而被阻塞时,哨兵的行为就会变得不可预知了。 所谓TILT模式,就是一种特殊的保护模式。进入TILT模式后,哨兵只定期发送命令用于收集信息,而不采取实质性的动作,比如不会进行故障转移流程。原创 2016-06-05 10:47:20 · 4046 阅读 · 1 评论 -
Redis源码解析:23sentinel(四)故障转移流程
十:故障转移流程中的状态转换 当哨兵针对某个主节点进行故障转移时,该主节点的故障转移状态master->failover_state,要依次经历下面六个状态:SENTINEL_FAILOVER_STATE_WAIT_STARTSENTINEL_FAILOVER_STATE_SELECT_SLAVESENTINEL_FAILOVER_STATE_SEND_SLAVEO原创 2016-06-05 10:38:09 · 2284 阅读 · 1 评论 -
Redis源码解析:22sentinel(三)客观下线以及故障转移之选举领导节点
八:判断实例是否客观下线 当前哨兵一旦监测到某个主节点实例主观下线之后,就会向其他哨兵发送”is-master-down-by-addr”命令,询问其他哨兵是否也认为该主节点主观下线了。如果有超过quorum个哨兵(包括当前哨兵)反馈,都认为该主节点主观下线了,则当前哨兵就将该主节点实例标记为客观下线。 注意,客观下线的概念只针对主节点实例,而与从节点和哨兵原创 2016-06-05 10:24:00 · 3239 阅读 · 1 评论 -
Redis源码解析:10scan类命令的实现
像keys或者smembers命令,需要遍历数据集合中的所有元素。在一个大的数据库中使用,可能会阻塞服务器较长的一段时间,造成性能问题,因此不适用与生产环境。 在Redis2.8.0中引入了scan类命令,可用于迭代整个数据库或者是哈希键、集合键和有序集合键这样的数据集合。 scan类命令支持增量式迭代,它们每次执行都只会返回少量元素,所以这些命令可以用于生产环原创 2016-03-13 22:03:30 · 3378 阅读 · 0 评论 -
Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加、删除、查看、更新等操作的实现;客户端切换数据库的实现;键超时相关功能的实现、键空间事件通知等。 以上这些功能,键空间事件通知是在src/notify.c中实现的,其他功能都是在src/db.c中实现的。 在redis.h中定义的redisServe原创 2016-03-13 21:57:54 · 1468 阅读 · 0 评论 -
Redis源码解析:08对象
前面介绍了Redis用到的所有主要数据结构,比如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等。然而Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种前面所介绍的数据结构。 Redis在执行命令之前,根据对象的类型原创 2016-02-28 16:14:40 · 957 阅读 · 0 评论 -
Redis源码解析:02链表
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,因为Redis使用的C语言并没有内置这种数据结构,所以Redis自己实现了链表。 链表在Redis中的应用非常广泛,比如列表的底层实现之一就是链表。当一个列表中包含的元素比较多时,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表的底层实现。 除了列表之外,Redis中的发布与订阅、原创 2016-01-05 21:23:45 · 754 阅读 · 0 评论 -
翻转整数的二进制位
一个无符号的整数,如果需要翻转其二进制位,可以采用下面的方法,以32位整数为例:unsigned int v; // 32-bit word to reverse bit order// swap odd and even bitsv = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);// swap consecutive pai原创 2016-01-17 20:00:34 · 3592 阅读 · 0 评论 -
02Redis入门指南笔记(基本数据类型)
三:入门1:热身 获得符合规则的健名列表:keys pattern pattern支持glob风格的通配符,具体规则如下表: Redis命令不区分大小写。keys命令需要遍历Redis中的所有健,当键的数量较多时会影响性能,不建议在生产环境中使用。 判断一个键是否存在:exists key原创 2015-12-03 13:09:44 · 4182 阅读 · 0 评论 -
07Redis入门指南笔记(主从复制、哨兵)
现实项目中通常需要若干台Redis服务器的支持: 结构上,单个 Redis 服务器会发生单点故障,而且一台服务器需要承受所有的请求负载。这就需要为数据生成多个副本并分配在不同的服务器上; 容量上,单个 Redis 服务器的内存非常容易成为存储瓶颈,所以需要进行数据分片。 同时拥有多个 Redis 服务器后就会面临如何管理集群的问题,包括如原创 2015-12-12 11:16:43 · 6670 阅读 · 3 评论 -
06Redis入门指南笔记(安全、通信协议、管理工具)
一:安全1:可信的环境 Redis以简洁为美。在安全层面Redis也没有做太多的工作。Redis的安全设计是在“Redis运行在可信环境”这个前提下做出的。在生产环境运行时不能允许外界直接连接到 Redis 服务器上,而应该通过应用程序进行中转,运行在可信的环境中是保证Redis安全的最重要方法。 Redis的默认配置会接受来自任何地址发送来的请求,要更改这原创 2015-12-12 09:12:49 · 3370 阅读 · 0 评论 -
08Redis入门指南笔记(集群)
即使使用哨兵,此时的 Redis 集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于所有节点中,内存最小的数据库节点,形成木桶效应。 对 Redis 进行水平扩容,在旧版Redis 中通常使用客户端分片来解决这个问题,即启动多个 Redis 数据库节点,由客户端决定每个键交由哪个数据库节点存储,下次客户端读取该键时直接到该节点读取。 这种原创 2015-12-12 19:51:58 · 2807 阅读 · 2 评论 -
05Redis入门指南笔记(持久化)
Redis的强劲性能很大程度上是由于将所有数据都存储在了内存中,然而当Redis重启后,所有存储在内存中的数据就会丢失。在一些情况下,希望Redis能将数据从内存中以某种形式同步到硬盘中,使得重启后可以根据硬盘中的记录恢复数据。这一过程就是持久化。 Redis支持两种方式的持久化,一种是RDB方式,另一种是AOF方式。前者会根据指定的规则将内存中的数据存储在硬盘上,而后者在每次执原创 2015-12-12 08:57:09 · 1078 阅读 · 0 评论 -
09安装运行redis-trib.rb所需的环境
运行redis-trib.rb脚本配置Redis的cluster,需要安装ruby环境,这里采用源码安装: 1:下载源码包:https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz 2:解压安装:tar xzvf ruby-2.2.3.tar.gz -C /root/rediscd /root/redis/rub原创 2015-12-12 20:03:46 · 5839 阅读 · 1 评论 -
Redis源码解析:01简单动态字符串SDS
Redis没有直接使用C字符串(以’\0’结尾的字符数组),而是构建了一种名为简单动态字符串( simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。在Redis里面,C字符串只会作常量值,比如打印日志:redisLog(REDIS_WARNING,"Fatal: Can't initialize Background Jobs.");原创 2015-12-30 20:55:42 · 1306 阅读 · 1 评论 -
Redis源码解析:03字典
字典是一种用于保存键值对(keyvalue pair)的抽象数据结构。在字典中,一个键和一个值进行关联,就是所谓的键值对。字典中的每个键都是独一无二的,可以根据键查找、更新值,或者删除整个键值对等等。 字典在Redis中的应用相当广泛,如Redis的数据库就是使用字典来作为底层实现的,对数据库的增、删、查、改操作也是构建在对字典的操作之上的。比如下面的命令:redis> SE原创 2016-01-17 20:29:48 · 977 阅读 · 0 评论 -
Redis源码解析:13Redis中的事件驱动机制
Redis中,处理网络IO时,采用的是事件驱动机制。但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右。 没有选择libevent或libev的原因大概在于,这些库为了迎合通用性造成代码庞大,而且其中的很多功能,比如监控子进程,复杂的定时器等,这些都不是Redis所需要的。原创 2016-04-03 10:55:30 · 3107 阅读 · 1 评论 -
Redis源码解析:07压缩列表
压缩列表(ziplist)是列表键和哈希键的底层实现之一。当列表键只包含少量列表项,并且每个列表项要么是小整数值,要么是长度较短的字符串时;或者当哈希键只包含少量键值对,并且每个键值对的键和值要么是小整数值,要么是长度较短的字符串时,那么Redis就会使用压缩列表来做为列表键或哈希键的底层实现。 压缩列表是Redis为了节约内存而开发的,可用于存储字符串和整数值。它是一个顺原创 2016-02-21 17:32:06 · 1097 阅读 · 0 评论 -
10Redis键空间通知(keyspace notifications)
Redis的键空间通知(keyspacenotifications)功能是自2.8.0版本开始加入的,客户端可以通过订阅/发布(Pub/Sub)机制,接收那些以某种方式改变了Redis数据空间的事件通知。比如:所有改变给定key的命令;所有经过lpush操作的key;所有在0号数据库中过期的key等等。 通知是通过Redis的订阅/发布机制发送的,因此,所有支持订阅/发布功能的原创 2016-03-05 14:33:29 · 13687 阅读 · 0 评论 -
Redis源码解析:06整数集合
整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。 intset可以保存类型为int16_t,int32_t,int64_t的整数值,并且保证集合中不会出现重复元素。 整数集合的结构体定义在intset.h中:typedef struct intset {原创 2016-02-14 08:57:18 · 684 阅读 · 0 评论 -
Redis源码解析:05跳跃表
一:基本概念 跳跃表是一种随机化的数据结构,在查找、插入和删除这些字典操作上,其效率可比拟于平衡二叉树(如红黑树),大多数操作只需要O(log n)平均时间,但它的代码以及原理更简单。跳跃表的定义如下: “Skip lists are data structures that use probabilistic balancing rather than原创 2016-01-31 08:46:18 · 2511 阅读 · 0 评论 -
03Redis入门指南笔记(事务、生存时间、排序、消息通知、管道)
一:事务1:概述 Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。 事务的原理是是先将属于一个事务的所有命令都发送给Redis,然后再让Redis依次执行这些命令。比如:127.0.0.1:6379> multiOK127.0.0.1:6379> sa原创 2015-12-09 08:53:00 · 1520 阅读 · 0 评论 -
01Redis入门指南笔记(简介、安装、配置)
一:简介 Redis是一个开源的高性能key-value数据库。Redis是RemoteDIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。Redis字典中的value支持的数据类型有:字符串,散列,列表,集合,有序集合。 Redis数据库中的所有数据都存储在内存中,内存的读写速度远快于原创 2015-11-30 17:51:03 · 1372 阅读 · 1 评论 -
Redis源码解析:04字典的遍历dictScan
dict.c中的dictScan函数,用来遍历字典,迭代其中的每个元素。该函数使用的算法非常精妙!!!所以必须记录一下。 遍历一个稳定的字典,当然不是什么难事,但Redis中的字典因为有rehash的过程,使字典可能扩展,也可能缩小。这就带来了问题,如果在两次遍历中间,字典的结构发生了变化(扩展或缩小),字典中的元素所在的位置相应的会发生变化,那如何保证字典中原有的元素都可以被原创 2016-01-17 20:46:59 · 3778 阅读 · 6 评论