
Redis
文章平均质量分 81
奥利弗的巨大泰迪
这个作者很懒,什么都没留下…
展开
-
Redis源码(五)——整数集合
一、整数集合(intset)的定义与实现 整数集合是Redis中集合的底层实现之一,当集合只包含整数且集合的元素数目不大是,Redis是使用整数集合作为集合的底层实现的。整数集合的实现在src的intset.h和intset.c中:typedef struct intset { // 编码方式 uint32_t encoding; //原创 2018-01-10 22:26:45 · 344 阅读 · 0 评论 -
Redis源码(四)——跳跃表
跳跃表(skiplist)的定义与实现 在对排行榜数据进行排序时,我们会用到Redis中的有序集合对象(sorted set),跳跃表就是有序集合的底层实现之一。跳跃表是一种有序的数据结构,每个节点中都维持着多个指向其他节点的指针,所以可以快速地访问节点。跳跃表的查找速度平均为O(logN),最差为O(N)。 src下的redis.h中用zskiplistNode和zs原创 2018-01-09 21:11:27 · 327 阅读 · 0 评论 -
Redis源码(八)——Redis的数据库
在前面的博客中,对Redis的底层数据结构和Redis中的几种对象做了相对详尽的分析,但是对于Redis——作为一种高速分布式数据库,我们并没有对Redis的一些典型功能例如存取键、设置过期时间、主从复制等作出介绍。接下来我们将对Redis的一些功能作出详细的分析。作为一种数据库,Redis的数据库功能是最基本也是最核心的功能,接下来就对此进行介绍。 一、数据库的结构定义 在原创 2018-01-17 20:55:07 · 701 阅读 · 0 评论 -
Redis源码(十二)——哨兵Sentinel
如果当系统中只有一台Redis服务器运行时,假设服务器宕机了,那么所有的服务都将不可用,这对系统来说是不可忍受的。那么备份就是一个很自然的想法了。前面的博客中我们讲到了Redis的主从复制,应用Redis主从复制的功能,我们对主服务器配置几台从服务器从而对主服务器进行备份,主从服务器内的数据保持一致。但是仅仅做了主从是不够的——当主服务器挂了以后,从服务器只能提供读服务,而无法提供写服务,系统仍然原创 2018-01-24 11:21:13 · 973 阅读 · 0 评论 -
Redis源码(七)——Redis中五种对象
在前面的博客中,介绍了Redis中用所有底层数据结构,如简单动态字符串(SDS)、链表、字典、跳跃表,整数集合和压缩链表。Redis就利用上述的六种底层数据结构来构造了五种数据库对象——字符串、列表、哈希、集合和有序集合。 我们知道Redis是一个“key-value”数据库,其中的key和value都是用对象表示。Redis中每个对象都是由RedisObject结构体表示:t原创 2018-01-15 21:12:01 · 465 阅读 · 0 评论 -
Redis源码(十一)——Redis的主从复制
Redis中可以发送SLAVEOF命令让一个服务器A成为另一个服务器B的“slave”,从而去复制B,称A为从服务器(slave),B为主服务器(master) 关于复制,2.8版本以前及以后实现有一些不同,2.8版本以前的复制在断线重连后效率较低,所以我们在这里只分析下2.8版本以后的复制。复制功能分为同步(sync)和命令传播(command propagate)两个步骤。原创 2018-01-23 11:06:35 · 781 阅读 · 0 评论 -
Redis源码(三)——字典
一、字典(dictionary)的定义与实现 在使用Redis中,我们会经常用到哈希(hash)对象。哈希对象中存在key、field和value,每一个field都对应一个value。我曾经使用哈希对象来缓存不同平台上的书籍数据——平台id为key,书的id为field,需要的数据为value。哈希对象的底层就是通过字典来实现的。 src下的dict.h和dict.c原创 2018-01-04 21:12:14 · 349 阅读 · 0 评论 -
Redis源码(二)——链表
Redis中的链表是一个应用十分广泛的底层数据结构,常用的Redis列表(List)底层实现之一就是链表。我曾用Redis的列表缓存过分布式服务节点的ip。Redis列表的一些操作命令在这里就不做赘述了,有兴趣的同学不妨装个Redis自己动手实践下。 言归正传,继续来讲Redis的底层数据结构——链表。熟悉数据结构的同学一定对链表不会陌生。在src下的adlist.h和adlist.原创 2018-01-04 19:22:12 · 311 阅读 · 0 评论 -
Redis源码(一)——简单动态字符串
一、什么是简单动态字符串 字符串是Redis中最简单的一个数据结构,打开Redis的源码后可以发现,Redis的底层是通过C语言来实现的,然而Redis并没有使用C语言中的字符串类型,而是重构了一种新的字符串类型——简单动态字符串(simple dynamic string,SDS)。那么Redis为什么要自己去开发一种抽象字符串类型呢?在我提供的代码中,src下的sds原创 2018-01-03 20:17:53 · 518 阅读 · 0 评论 -
Redis源码——开篇
接下来的博客主攻Redis的源码,我们知道Redis是现在很流行的一个缓存数据库,大多的公司都会选择使用Redis作为数据库的缓存。在找实习以及找工作中的面试中,很多面试官也会对Redis技术很感兴趣。对于一项技术,比会去使用它更重要也是更高层的是理解内部的源码实现,剖析作者这么设计的原理及思维。所以很多面试官会很喜欢问候选人关于Redis内部的技术实现。作为一个小菜鸟,在面试时我也被问了不少Re原创 2018-01-02 19:07:40 · 478 阅读 · 1 评论 -
Redis源码(十)——Redis的客户端和服务器
在前面的博客中,有些内容已经涉及到了Redis服务器或者客户端的一些属性,如上一篇博客关于Redis的RDB持久化中关于save选项来设置服务器的状态等。那么接下来这篇博客中就分析下Redis的客户端以及服务器的属性及操作。 一、Redis客户端redis.h中的redisClient结构定义了Redis的客户端:/* With multiplexing we need to ta原创 2018-01-22 10:34:24 · 1998 阅读 · 0 评论 -
Redis源码(九)——Redis的持久化:RDB及AOF
我们知道Redis的数据库数据是储存在内存中的,那么如果Redis服务器进程被kill了或关闭了,那么服务器中的所有数据都会消失,所以我们需要对Redis的数据进行持久化即保存在硬盘中。 Redis有两种持久化的方案——RDB和AOF(Append OnlyFile)。 一、RDB持久化RDB持久化通过将数据库中的键值对保存到rdb文件中来对Redis进行备份。src下的原创 2018-01-21 14:36:35 · 536 阅读 · 0 评论 -
Redis源码(六)——压缩列表
一、压缩列表(ziplist)的定义与实现 压缩列表是一种为了节约内存而开发的顺序数据结构,是列表及哈希对象的底层实现之一。当列表中只有少量的列表元素,且列表元素是小整数值或者较短的字符串,Redis就会用压缩列表作为列表对象的底层实现;当哈希对象中只包含少量键值对,而且键值都是小整数或者长度较短的字符串,Redis就用压缩列表作为哈希的实现。src中的ziplist.c和z原创 2018-01-11 20:24:34 · 453 阅读 · 0 评论 -
Redis源码(十三)——集群
这是Redis源码系列最后一篇博客咯~之前因为出去玩所以隔了很久才更新~ 在前面的博客中提到我们可以选择哨兵Sentinel+主从复制的功能来实现高可用的Redis数据库方案,从而完成复制和故障转移的需求。事实上通过Redis集群(cluster)也能起到相同的作用。集群通过分片(sharding)来进行数据共享,并提供复制和故障转移的功能。那接下来就来介绍下Redis集群的相关功能及实现。原创 2018-02-09 13:36:00 · 437 阅读 · 0 评论