我们再来学习如何从跳跃表中查询数据,跳跃表本质上是一个链表,但它允许我们像数组一样定位某个索引区间内的节点,并且与数组不同的是,跳跃表允许我们将头节点L0层的前驱节点(即跳跃表分值最小的节点)zsl->header.level[0].forward当成索引0的节点,尾节点zsl->tail(跳跃表分值最大的节点)当成索引zsl->length-1的节点,索引按分值从小到大递增查询:也允许我们将尾节点当成索引0的节点,头节点L0层的前驱节点当做索引zsl->length-1的节点,索…
Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡. 一:主从复制过程 Redis的复制功能分为同步(sync)和命令传播(commandpropagate)两个操作: 同步操作用于将从节点的数据库状态更新至主节点当前所处的数据库状态: 命令传播操作则用于在主节点的数据库状态被修改,导致主从节点的数据库状态不一致时,让主从节点的数据库重新回到一致状态: 1:同步 当客户端向从节点发送SLAYEOF命令,或者从节点的配置文件中配置了…
上一篇文章已经介绍了MemoryCache,MemoryCache存储的数据类型是Object,也说了Redis支持五中数据类型的存储,但是微软的Redis缓存组件只实现了Hash类型的存储.在分析源码之前,先学几个关于Redis操作的命令. 一.Redis命令 Redis所有的命令在http://doc.redisfans.com/上有详细介绍.下面介绍几个常用的关于Hash类型的命令. HSET:用于添加缓存 用法:HSET key field value . 返回值:如果 field 是哈…
Redis中,处理网络IO时,采用的是事件驱动机制.但它没有使用libevent或者libev这样的库,而是自己实现了一个非常简单明了的事件驱动库ae_event,主要代码仅仅400行左右. 没有选择libevent或libev的原因大概在于,这些库为了迎合通用性造成代码庞大,而且其中的很多功能,比如监控子进程,复杂的定时器等,这些都不是Redis所需要的. Redis中的事件驱动库只关注网络IO,以及定时器.该事件库处理下面两类事件: a:文件事件(file  event):用于处理Redis…
字典是一种用于保存键值对(key value pair)的抽象数据结构.在字典中,一个键和一个值进行关联,就是所谓的键值对.字典中的每个键都是独一无二的,可以根据键查找.更新值,或者删除整个键值对等等. 字典在Redis中的应用相当广泛,如Redis的数据库就是使用字典来作为底层实现的,对数据库的增.删.查.改操作也是构建在对字典的操作之上的.比如下面的命令: redis> SET msg "hello world" OK 该命令会在Redis数据库中创建一个键为"ms…
Redis集群通过分片的方式来保存数据库中的键值对:一个集群中,每个键都通过哈希函数映射到一个槽位,整个集群共分16384个槽位,集群中每个主节点负责其中的一部分槽位. 当数据库中的16384个槽位都有节点在处理时,集群处于上线状态:相反,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态. 所谓键的分配,实际上就是指槽位在集群节点中的分配:所谓键的迁移,实际上指槽位在集群节点间的迁移. 一:数据结构    在集群最主要的数据结构,记录集群状态的clusterState结构体中,与槽位相…
Redis集群是Redis提供的分布式数据库方案,通过分片来进行数据共享,并提供复制和故障转移功能. 一:初始化 1:数据结构 在源码中,通过server.cluster记录整个集群当前的状态,比如集群中的所有节点:集群目前的状态,比如是上线还是下线:集群当前的纪元等等.该属性是一个clusterState类型的结构体.该结构体的定义如下: typedef struct clusterState { clusterNode *myself; /* This node */ ... int sta…
跳跃表(skiplist) 有序集合(sorted set)是Redis中较为重要的一种数据结构,从名字上来看,我们可以知道它相比一般的集合多了一个有序.Redis的有序集合会要求我们给定一个分值(score)和元素(element),有序集合将根据我们给定的分值对元素进行排序.Redis共有两种编码来实现有序集合,一种是压缩列表(ziplist),另一种是跳跃表(skiplist),也是本章的主角.下面,让笔者带领大家稍微了解下有序集合的使用. 假设某软件公司统计了公司内的程序员所掌握的编程语…
Ziplist是用字符串来实现的双向链表,对于容量较小的键值对,为其创建一个结构复杂的哈希表太浪费内存,所以redis 创建了ziplist来存放这些键值对,这可以减少存放节点指针的空间,因此它被用来作为哈希表初始化时的底层实现.下图即ziplist 的内部结构. Zlbytes是整个ziplist 所占用的空间,必要时需要重新分配. Zltail便于快速的访问到表尾节点,不需要遍历整个ziplist. Zllen表示包含的节点数. Entries表示用户增加上去的节点. Zlend是一个255…
一.src/server.c 中的redisCommandTable列出的所有redis支持的命令,其中字符串命令包括从get到mget:列表命令从rpush到rpoplpush:集合命令包括从sadd到sscan:有序集合命令从zadd到zscan:哈希表命令包括从hse到hscan:地理命令包括从geoadd到geodist:位操作从bitop到bitpos:HyperLogLog命令包含padd到pfmerge等. 二.每种存储类型对应的底层数据结构 字符串-->sds.c  简单动态字符…