redis
文章平均质量分 63
YangGangAVA
这个作者很懒,什么都没留下…
展开
-
结合redis设计与实现的redis源码学习-2-SDS(简单动态字符串)
上一次我们学习了redis的内存分配方式,今天我们来学习redis最基本的数据结构SDS,在redis的数据库里,包含字符产值的简直对在底层都是由SDS实现的。 SDS的基本数据结构是sdshdr结构体:struct sdshdr{ int len; //记录数组中已经使用的字节的数量,等于所保存的字符串长度 int free; //记录buf数组中未使用字节的数量 cha原创 2017-09-24 12:05:11 · 269 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-21-哨兵(Sentinel.c)
Sentinel是redis的高可用性解决方案:由一个或多个Sentinel组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后向原来主服务器的slave发送新的复制指令,让他们成为新主服务器的从服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求,还会监视已原创 2017-12-05 01:01:08 · 263 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-8.3-t_list.c(列表键)
T_list.c主要说明了列表键和列表键的命令实现方式;#include "server.h"//将一个值放入列表中,根据where判断是头插还是尾插void listTypePush(robj *subject, robj *value, int where) { if (subject->encoding == OBJ_ENCODING_QUICKLIST) { in原创 2017-11-04 00:04:53 · 396 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-11-数据库(server.h/redisDb,notify.c)
在之前的学习中我们了解了redis所有的数据结构和使用方法,现在我们开始来学习redis数据库相关的内容。 这一节先来学习服务器中的数据库,主要代码在server.h和Db.c中。 redis服务器的所有数据库都保存在服务器状态redisServer结构体的db数组中,db数据的每一个项都是redisDb结构,每个redisDb结构代表一个数据库,其中dict字典保存了数据库中的所有键值对,这个原创 2017-11-26 13:46:08 · 371 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-11.1-命令的实现(Db.c)
这小节我们来看数据库代码的具体实现: 函数声明在server.h中:robj *lookupKey(redisDb *db, robj *key, int flags);robj *lookupKeyRead(redisDb *db, robj *key);robj *lookupKeyWrite(redisDb *db, robj *key);robj *lookupKeyReadOrRe原创 2017-11-26 16:20:57 · 340 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-12-RDB持久化(rdb.h/rio.h)
因为redis是一个内存数据库,他将自己的数据库状态存储在内存中,一旦服务器锦城推出,服务器中的数据库状态也会消失不见。为了解决这个问题,redis提供了RDB持久化功能,这个功能可以将redis在内存中的数据库状态保存在磁盘里,避免数据意外丢失。 RDB持久化既可以手动执行,也可以根据服务器配置定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中,这个文件是一个经过压缩的二进制文原创 2017-11-26 18:23:59 · 1820 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-13-AOF持久化(aof.c/bio.h)
出了RDB持久化功能以外,redis还提供了AOF(Append Only File)持久化功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。AOF持久化命令的实现AOF命令的实现可以分为命令追加,文件写入,文件同步三个步骤; 1、命令追加:当AOF持久化功能处于打开状态时,服务器在执行玩一个写命令后,回忆协议原创 2017-11-26 21:10:31 · 593 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-23-排序(sort.c)
Redis的Sort命令可以对列表键,集合键或者有序集合键值进行排序。也可以使用SORT alphabet来对字符进行排序。一、sort命令的实现sort命令会先创建一个和列表长度相同的数组,数组的每个元素都是一个redisSortObject结构,然后遍历数组,将各个obj指针所指向的列表项转换成一个double浮点数,,保存早结构的score中,根据score的值对数组进行排序,遍历数组,将各个原创 2017-12-15 00:23:50 · 390 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-20-复制(replication.c)
在Redis中,用户可以通过执行slaveof命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。功能实现PSYNC命令:具有完整重同步和部分重同步两种模式:-1、完整重同步用于处理初次复制的情况:完整重同步会将主服务器生成的RDB文件发送给从服务器,并且记原创 2017-12-03 23:03:32 · 937 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-22-集群(cluster.c)
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。一、节点一个Redis集群通常由多个节点组成,在刚开始的时候,每个节点都是独立的,他们都处于一个只包含自己的集群当中,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。使用CLUDSTER MEET 命令可以连接各个节点。1、启动节点一个节点就是一个运行在集群模式原创 2017-12-06 23:51:35 · 324 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-14-事件(ae.c/ae_epoll.c)
Redis服务器是一个事件驱动程序,服务器需要处理两类事件: 文件事件(file event):Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 时间事件(time event):Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时原创 2017-11-28 01:17:59 · 422 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-24-二进制位数组(Bitops.c)
Redis提供了SETBIT,GETBIT,BITCOUNT,BITOP四个命令用于处理二进制位数组。 例:SETBIT为位数组指定偏移量上的二进制位设置值,偏移量从0开始计数; GETBIT获取位数组指定偏移量上的二进制位值; BITCOUNT统计位数组中,值为1的二进制位的数量; BITOP可以对多个位数组进行按位与,或,异或运算。 命令 结果 SETBIT bit 0 1原创 2017-12-16 23:28:48 · 902 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-25-慢查询日志(slowlog)
Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监控和优化查询速度。 服务器配置有两个和慢查询日志相关的选项: -1、slowlog-log-slower-than选项指定执行时间超过多少微妙的命令会被记录到日志上。 -2、slowlog-max-len选项指定服务器最多保存多少条慢查询日志。 服务器使用先进先出的方式保存多条慢查询日志,当达原创 2017-12-17 10:14:41 · 307 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-19.1-客户端
Redis服务器是典型的一对多服务程序:一个服务器可以与多个客户端建立网络连接,每个客户单可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。 通过使用I/O多路复用技术实现的文件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。 对于每个与服务器进行连接的客户端,服务器使用redisClient结构来保存客户端当前原创 2017-12-17 14:23:47 · 227 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-19-服务器(server.c)
Redis服务器负责与多个客户端建立网络连接,处理客户端发送三个的命令请求,在数据库中爆粗你客户单执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。命令请求的执行过程当服务器与客户端的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:-1、读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区中; -2、对输入缓冲区中的命令请求进行分析,提取出原创 2017-12-02 15:31:50 · 440 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-18-网络连接库(networking.c)
networking.cRedis 的网络连接库,负责发送命令回复和接受命令请求, 同时也负责创建/销毁客户端, 以及通信协议分析等工作. 下面是部分使用的结构体,定义在server.h中//命令结构体struct redisCommand { char *name; redisCommandProc *proc;//命令处理器 int arity;//元数 ch原创 2017-12-02 14:40:32 · 1315 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-17-发布与订阅(pubsub.c)
Redis的发布预定月功能由PUBLISH,SUBSCRIBE,PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或者多个频道,成为这个频道的订阅者:每当有其他客户端向被订阅的频道发送消息是,该频道的所有订阅者都会收到这条消息。 客户端还可以通过执行PSUBSCRIBE来订阅一个或者多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会原创 2017-11-30 23:02:16 · 388 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-3-链表
在上一篇中,我们了解了redis的基础数据结构SDS,在redis中,基本上所有的数据都是以SDS的形式存储的,无论是long还是int。 在有了基础数据类型后,我们就要了解它是怎样在redis中使用的,今天我们来分析redis链表的实现。 在学习的过程中基本是复习对链表的操作,只是有一些实现方法和理念解决了运行速度和适用环境的问题。 redis的链表具有以下特点: 1、双端:获取某个节点的原创 2017-09-24 15:48:32 · 221 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-4-dict(字典)
redis字典实现,一不小心把markdown草稿删了,找到缓存中的直接复制过来了。原创 2017-09-28 22:51:11 · 284 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-1-内存分配(zmalloc)
读完redis设计与实现后的redis源码学习-1-redis的内存分配(zmalloc)。原创 2017-09-22 01:08:44 · 343 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-5-skiplist(跳跃表)
跳跃表示一种有序的数据结构他通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的,平均访问速度O(logN),最坏O(N)复杂度的节点查找,还可以通过顺序性操作类批量处理节点。 在redis中,在实现有序集合键和在集群节点中用作内部数据结构时用到了跳跃表。 跳跃表的特点:1、redis中的跳跃表实现由zskiplist和zskiplistNode两个结构组成,其原创 2017-09-28 23:40:39 · 274 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-6-intset(整数集合)
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个结合的元素数量不多时,redis就会使用整数集合作为集合建的底层实现。它可以保存类型为int16_t,int32_t,int64_t的整数值,并且保证集合中不会出现重复元素。 整数集合具有以下特性: 1、整数集合的底层实现是数组,这个数组以有序,无重复的方式保存集合元素,在需要时,会根据新添加元素的类型来改变这个数组的类型;原创 2017-10-10 23:58:19 · 203 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-8.0-object(对象)
重点来了! 在前面的几个章节里,我们陆续学习了redis用到的所有主要数据结构,但是redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象这五种类型的对象,美中对象都用到了至少一中前面的数据结构。 通过这五种不同的对象,redis可以在执行命令之前根据对象的类型来判断一个对象是否可以执行给定的命令原创 2017-10-15 23:42:19 · 259 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-10-hyperloglog(基数统计)
hyperloglog是redis用来做基数统计的算法,优点是在输入元素的数量或者体积非常大时,基数所需的空间是固定的,并且是很小的,在redis中,每个hyperloglog键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数;但是因为它智慧根据输入元素来计算基数,而不会储存输入元素本身,所以不能像集合那样,返回输入的各个元素。 它定义在hyperloglog.c中,因为对这个算法完原创 2017-10-29 13:48:37 · 579 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-9-zipmap(压缩图)
在学习了所有redis设计与实现的数据结构后,我发现在redis中还有一些特殊的数据结构,今天我们来学习zipmap。 zipmap和ziplist比较相似,使用特殊的内存存储方法来提升个数较少的键值对。具有以下特点: 1、使用1个字节的len来存储元素个数,当长度大于最大值那么只能遍历获得size了; 2、len后面是key的长度,一般使用1个字节或者5个字节表示; 3、free用来表示v原创 2017-10-21 21:58:57 · 494 阅读 · 2 评论 -
结合redis设计与实现的redis源码学习-8.1-object.c(对象实现)
在8.0中我们了解了redis对象的实现方式和一些特性,今天我们来看他的具体实现方式。#include "server.h"#include <math.h>#include <ctype.h>//创建一个robj对象,该对象在server.h中定义robj *createObject(int type, void *ptr) { robj *o = zmalloc(sizeof(*原创 2017-10-31 22:03:06 · 264 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-7-ziplist(压缩列表)
压缩列表是列表件和哈希键的底层实现之一,当一个列表件只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么redis就会使用压缩列表来做列表键的底层实现。 压缩列表的特点: 1、压缩列表是由一系列特殊编码的连续内存块组成的顺序型数据结构。 2、一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。 3、添加新节点到压缩列表,或者从压缩列表中原创 2017-10-13 08:25:29 · 251 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-8.2-t_string(字符串键)
t_string.c中定义了字符串键的实现过程。#include "server.h"#include <math.h> /* isnan(), isinf() *///检查客户端的字符串长度static int checkStringLength(client *c, long long size) { if (size > 512*1024*1024) { addR原创 2017-11-03 23:30:16 · 234 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-15-TCP网络连接(anet.c)
anet.c中实现了一些网络相关的设置操作,可以参考我的linux网络编程那篇文章。 这里使用的socket属性更多,帮我复习了tcp相关的知识。 我们先来看anet.h#ifndef ANET_H#define ANET_H#include <sys/types.h>#define ANET_OK 0#define ANET_ERR -1#define ANET_ERR_LEN 25原创 2017-11-29 00:15:03 · 717 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-16-事务(multi.c)
Redis通过MULTI,EXEC,WATCH等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性,按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求。 在client结构体中用mstate来表示事务的状态,它是一个结构体://事务命令的参数typedef struct multiCmd { robj原创 2017-11-30 01:15:54 · 307 阅读 · 0 评论 -
结合redis设计与实现的redis源码学习-26-工具函数(Util.h/.c)
Redis将很多的公用转换函数独立了出来,放入了Util.h中,包括字符串对比,内存转换,字符串数字转换,获取路径等,Redis的作者都是自己实现的,在这里我将这些函数认真学习,观察是在哪里高效并可以在之后的工作中使用。 因为Util的函数都是完全独立逻辑的,所以我在这里只看.c文件 Util.c#include <stdlib.h>#include <stdio.h>#include <s原创 2017-12-18 23:48:32 · 383 阅读 · 0 评论