数据库
Jingle's
这个作者很懒,什么都没留下…
展开
-
18 Redis-复制
本文内容均来自《Redis设计与实现》一书1.引言在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称被复制的服务器为 主服务器(master),而对主服务器进行复制的服务器被称为从服务器(slave)。示例假设存在两个Redis服务器,地址分别为127.0.0.1:6666和127.0.0.1:7777,现在我们向120.0.0.1:6666发送以下命令:127.0.0.1:666...翻译 2020-06-23 23:51:50 · 195 阅读 · 0 评论 -
17 Redis-事件
1.引言Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 时间事件(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。.翻译 2020-06-11 17:29:09 · 157 阅读 · 0 评论 -
16 Redis-AOF持久化
1.引言除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。示例我们对一个空白数据库执行以下写命令,那么数据库中将包含以下三个键值对。RDB持久化保存数据库状态的方法是将msg、fruits、numbers三个键的键值对保存到RDB文件中,而AOF持久化保存数据库状态的方法是将服务器执行的SET、SAD...翻译 2020-06-10 22:34:41 · 172 阅读 · 0 评论 -
15 Redis-RDB持久化
数据库状态:Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,我们将服务器中的非空任意数据库以及它们的键值对统称为数据库状态。1.抛砖引玉因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘里面,..翻译 2020-06-09 00:21:15 · 150 阅读 · 0 评论 -
14 Redis-数据库
1.服务器中的数据库Redis服务器将所有的数据库都保存在服务状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis/redisDb结构,每个redisDb结构代表一个数据库。结构// 服务器状态typedef struct redisServer { // ······ // 数组,保存服务器中的所有数据库 redisDb *db; // 服务器的数据库数量 int dbnum; /翻译 2020-06-07 00:09:48 · 178 阅读 · 0 评论 -
13 Redis-对象的操作
1.命令类型Redis中用于操作键的命令基本上可以分为两种类型。可以对任意类型的键执行的命令:DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令。对特定类型的键执行的命令:字符串键:SET、GET、APPEND、STRLEN。 哈希键:HDEL、HSET、HGET、HLEN。 列表键:RPUSH、LPOP、LINSERT、LLEN。 集合键:SADD、SPOP、SINTER、SCARD。 有序集合键:ZADD、ZCARD、ZRANK、ZSCORE。2.翻译 2020-06-01 00:53:17 · 180 阅读 · 0 评论 -
12 Redis-有序集合对象
有序集合对象的编码可以是ziplist或者skiplist。1.定义ziplist编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member),第二个节点保存元素的分值(score)。压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的位置,而分值较大的元素被放置在靠近表尾的位置。skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳..翻译 2020-05-31 00:30:16 · 140 阅读 · 0 评论 -
11 Redis-集合对象
集合对象的编码可以是intset或者hashtable。1.定义intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值全部被设置为NULL2.编码转换当集合对象可以同时满足以下两个条件时,对象使用intset编码:集合对象保存的所有元素都是整数值。 集合对象保存的元素数量不超过512个。不能...翻译 2020-05-30 23:08:48 · 152 阅读 · 0 评论 -
10 Redis-哈希对象
哈希对象的编码可以是ziplist和hashtable。1.定义ziplist编码的哈希对象使用压缩列表作为底层实现。每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表的表尾,再将保存了值的压缩列表节点推入到压缩列表的表尾。保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值得节点在后。先添加到哈希对象中得键值对会被放在压缩列表得表头方向,而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向。hashtable编码的哈希对象使...翻译 2020-05-30 22:47:12 · 110 阅读 · 0 评论 -
09 Redis-列表对象
列表对象的编码可以是ziplist或者linkedlist。1.定义ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点保存一个列表元素。linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。(StringObject为字符串对象的简化表示)注意:linkedlist的编码的列表对象在底层的双端链表结构中包含了多个字符串对象,这种嵌套字符串对象的行为在哈希对象、集合对象和有...翻译 2020-05-28 23:52:13 · 119 阅读 · 0 评论 -
08 Redis-字符串对象
字符串对象的编码可以是int、raw或者embstr。1.定义如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void*转换成long),并将字符串对象的编码设置为int。如果一个字符串对象保存的是一个字符串值,并且这个字符串值的长度大于39字节,那么字符串对象将使用一个简单动态字符串来保存这个字符串值,并将对象的编码设置为raw。如果字符串对象保存的是一个字符串值,并且这个字符串值的长...翻译 2020-05-27 23:37:50 · 137 阅读 · 0 评论 -
01 Redis-简单动态字符串(SDS)
1.定义 SDS结构struct sdshdr { int len; int free; char buf[];}len:记录buf数组中已使用的字节数;等于SDS所保存字符串的长度。free:记录buf数组中未使用的字节数。buf:字节数组,用于保存字符串。注意:1.SDS遵循C字符串以空字符串为结尾的惯例,保留空字符的1字节空间,不计算在SDS的len属性里,并为空字符分配额外的1字节空间;2.添加空字符到字符串末尾的操作,是由SDS函数自动完.翻译 2020-05-18 14:30:48 · 137 阅读 · 0 评论 -
07 Redis-对象的类型与编码
前言Redis用的主要数据结构有简单动态字符串、双端链表、字典、压缩列表、跳跃表、整数集合等。但是Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构构建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象五种类型的对象,每种对象用到至少一种前面的数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。同时,我们可以针对不同的使用场景,为对象设置不同的数据结构,从而优化对象在不同场.翻译 2020-05-27 00:19:17 · 163 阅读 · 0 评论 -
06 Redis-压缩列表
压缩列表是列表键和哈希键的底层实现之一。当一个列表项只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来作为列表键的底层实现。另外,当一个哈希键只包含少量键值对时,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来作为哈希键的底层实现。1.压缩列表的构成压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点,每个节点.翻译 2020-05-25 22:48:41 · 122 阅读 · 0 评论 -
05 Redis-整数集合
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。1.定义结构typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset;contents:是一个数组,是整.翻译 2020-05-24 14:16:32 · 111 阅读 · 0 评论 -
04 Redis-跳跃表
跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。跳跃表的效率可以和平衡树相媲美,并且跳跃表的实现比平衡树要简单,所以不少程序都使用跳跃表来代替平衡树。Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量较多,又或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。1.定义..翻译 2020-05-23 19:00:53 · 135 阅读 · 0 评论 -
03 Redis-字典
Redis的数据库就是使用字典来作为底层实现的,对数据库的增删改查操作也是构建在对字典的操作之上的。字典还是哈希键的底层实现之一,当一个哈希键包含的键值对比较多,或者键值对中的元素都是比较长的字符串时,Redis会使用字典作为哈希键的底层实现。1.定义结构// 哈希表typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; ...翻译 2020-05-23 00:39:30 · 149 阅读 · 0 评论 -
02 Redis-链表
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表地长度。列表键地底层实现之一就是链表。当一个列表键地包含了数量较多的元素,或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。链表在Redis中的应用:列表键、发布与订阅、慢查询、监视器、保存客户端的状态信息、构建客户端输出缓冲区。1.定义结构// 链表节点typedef struct listNode { // 前置节点 struct ..翻译 2020-05-21 23:57:14 · 137 阅读 · 0 评论