Redis设计与实现学习笔记
文章平均质量分 56
江南浪人
这个作者很懒,什么都没留下…
展开
-
Redis 简单动态字符串
Redis使用SDS(simple dynamic string)用作字符串默认实现。struct sdshdr{//已使用buf数组的字节数量,也就是字符串长度int len;//未使用的长度int free;//保存字符串char buf[];}SDS遵循C语言字符串以空字符串结尾,保留1个字节的空字符串'\0',该空串不记入len中。原创 2015-06-23 23:08:59 · 633 阅读 · 0 评论 -
Redis 客户端
通过使用有I/O多路复用技术原创 2015-07-22 23:12:35 · 476 阅读 · 0 评论 -
Redis 事件(1) -- 文件事件
Redis 服务器是一个事件驱动程序,服务器需要处理以下两类事件:1)文件事件Redis服务器通过套接字与客户端(或其他Redis服务器)进行连接,而文件时间就是服务器对套接字操作的抽象。服务器与客户端(或其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些时间来完成一系列网络通信操作。2)时间事件Redis服务器中的一些操作(比如serverCron函数)需要在给原创 2015-07-11 21:52:03 · 1072 阅读 · 0 评论 -
Redis 事件(2) -- 时间事件
Redis时间事件分为以下两类: 1.定时事件:程序在指定时间执行一次。 2.周期性事件:程序每隔指定时间执行一次。 时间事件的属性:1.id:服务器为时间事件创建的全局唯一ID,ID号从小到大递增。2.when:毫秒精度的unix时间戳,记录时间事件的到达时间。3.timeProc:时间事件处理器,一个函数。当时间事件到达事,执行此函数。时间事件的返回原创 2015-07-12 22:13:52 · 1179 阅读 · 0 评论 -
Redis RDB持久化
RDB持久化可以自动,也可以手动,这个功能将某个时间点上的数据库状态保存到一个经过压缩的二进制文件中。SAVE命令会阻塞服务,执行完成前客户端的所有请求都会拒绝。BGSAVE命令会新建一个子进程执行持久化操作,不阻塞服务。服务器状态维护了一个dirty计数器以及一个lastsave属性,供RDB持久化策略使用。dirty计数器记录距离上一次成功执行SAVE或BGSA原创 2015-07-01 23:34:31 · 429 阅读 · 0 评论 -
Redis RDB文件结构
Redis RDB文件保存的是二进制数据,结构包括5部分:REDIS | db_version | databases | EOF | check_sumdb_version长度为4个字节,它的值是一个字符串表示的整数,记录RDB文件的版本号。databases记录数据库实例,和各个数据库实例的键值对数据,如果redis-server中所有db都为空,那这个值也为空,长原创 2015-07-04 21:38:34 · 1455 阅读 · 0 评论 -
Redis AOF持久化
Redis提供了AOF(Append Only File)持久化功能,AOF通过保存服务器所执行命令来记录数据库状态的,和MySQL记录增删改的log有点像哈。AOF持久化功能实现分为命令追加(append)、文件写入(write)和文件同步(sync)三个步骤。1.AOF命令追加当开启AOF持久化功能时,服务器会在执行完一个写命令后,会以协议格式将执行的写命令追加到服原创 2015-07-11 17:42:22 · 400 阅读 · 0 评论 -
Redis 数据库(1)--redis中的数据库
Redis服务器的所有数据库都保存在服务器状态 redis.h/redisServer结构的db数组中,db数组中每项都是一个 redis.h/redisDb结构,代表一个数据库实例。struct redisServer {//...int dbnum;//...redisDb *db;//...} ;初始化数据库实例默认是16个,可以用过selec原创 2015-07-01 22:01:33 · 616 阅读 · 0 评论 -
Redis 数据库(2) redis键过期策略
Redis有4个命令可以设置键的过期时间:1. expire 设置key的生存时间为ttl秒;2. pexpire 设置key的生存时间为ttl毫秒; 3. expireat 设置key的过期时间为ts的秒数时间戳;4. pexpireat 设置key的过期时间为ts的毫秒数时间戳;实际上 expire, pexpire, expireat 3个命令都是原创 2015-07-01 22:47:39 · 503 阅读 · 0 评论 -
Redis 类型检查和命令多态
Redis中用于操作键的命令基本可以分为2类。其中一种是可以对任何类型的键执行,比如DEL,EXPIRE,RENAME,TYPE,OBJECT,TTL等命令。另一种只能对特定的键执行,比如:SET,GET,APPEND,STRLEN 等仅限用于字符串的键类型;HDEL,HSET,HGET,HLEN 等仅限用于哈希键类型;RPUSH,LPOP,LINSERT,LL原创 2015-07-01 21:58:03 · 500 阅读 · 0 评论 -
Redis 对象
Redis中每个对象都由一个redisObject结构表示:typeof struct redisObject {//类型unsigned type : 4;//编码unsigned encoding : 4;//指向底层数据结构的指针void *ptr;// . . .} robj;type 对象的类型REDIS_STRING 字符串对象原创 2015-06-28 00:08:08 · 363 阅读 · 0 评论 -
Redis 压缩列表
压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每项都是小整数或短字符串时,Redis就会使用压缩列表作为列表键的底层实现。ziplis组成:zlbytes : 记录列表占用内存字节数:在重新分配内存或计算zlend时使用zltail : 记录压缩列表表尾节点距离列表的起始地址有多少字节zllen : 记录压缩列表包含节点数量原创 2015-06-27 23:42:14 · 633 阅读 · 0 评论 -
Redis 哈希对象
哈希对象编码可以是ziplist或者hashtable。ziplist编码的哈希对象使用压缩列表作为底层实现。有新的键值对要保存时,程序会先将键值对的键推到列表表尾,再将键值对的值推到列表表尾。hashtable编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值对都是用一个字典键值对来保存。当哈希对象满足下面2个条件时,哈希对象使用ziplist编码,其余原创 2015-06-28 00:30:23 · 543 阅读 · 0 评论 -
Redis 字典的实现(1)
字典就是我们熟悉的map,键值对(key-value pair)的抽象数据结构。Redis数据库就是使用字典来作为底层实现的。先介绍下数据结构:1.哈希表typeof struct dictht {//哈希表数组dictEntry **table;//哈希表大小unsigned long size;//哈希表大小掩码,用于计算索引//总是等于size-1原创 2015-06-25 23:30:59 · 268 阅读 · 0 评论 -
Redis 字典的实现(2)
1.Redis 字典 Hash算法根据key计算hash值hash = dict -> type -> hashFunction(key);根据sizemask属性和哈希值,计算出索引,ht[x]可以是ht[0]或ht[1]index = hash & dict -> ht[x].sizemask;Redis使用MurmurHash2算法计算键的哈希值,优点在于即使输入的键是有原创 2015-06-27 15:47:27 · 383 阅读 · 0 评论 -
Redis 跳跃表的实现
Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量较多,或者有序集合中成员是较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。和链表、字典等数据结构在Redis内部的广泛应用不同,Redis只在实现有序集合键和集群节点中用到跳跃表。跳跃表节点 zskiplistNodetypeof struct zskiplistNode {原创 2015-06-27 16:49:04 · 463 阅读 · 0 评论 -
Redis 链表的数据结构
链表节点的数据结构:typeof struct listNode {//前置节点struct listNode *prev;//后置节点struct listNode *next;//节点的值void *value;} listNode;链接的数据结构:typeof struct list {//表头节点listNode *head;//表尾节点原创 2015-06-24 23:14:44 · 306 阅读 · 0 评论 -
Redis 服务器 单机数据库的实现
Redis命令请求的执行guocheng原创 2015-07-22 23:46:11 · 586 阅读 · 0 评论