NoSQL
子时已过
这个作者很懒,什么都没留下…
展开
-
Redis学习笔记(四) 跳跃表与整数集合
(一)跳跃表跳跃表是一种有序的数据结构,它通过每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,或者有序集合中元素的成员是比较长的字符串时,Redis就会使用跳跃表作为有序集合键的底层实现。Redis中的两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构。Redis的跳跃表由zskiplistNode 与 zskiplist 两个结构定义。其中zskiplistNod原创 2020-06-28 12:42:21 · 145 阅读 · 0 评论 -
Redis学习笔记(三) 字典
Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。redis字典所用的哈希表由disht结构定义。typedef struct dictht{ dictEntry **table;//哈希表数组 unsigned long size;//哈希表大小 unsigned long sizemask;//哈希表大小掩码,用于计算索引值 ,总是等于size -1 unsigned long used;//该哈希表已原创 2020-06-21 10:40:03 · 162 阅读 · 0 评论 -
Redis学习笔记(二) 链表
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。redis中链表应用广泛,如list中就使用了链表。每一个链表节点使用listNode结构标识(双向链表):typedef struct listNode{ //前置节点 struct listNode *prev; //后置节点 struct listNode *next; //节点值 void *value;}链表大家都熟悉不做过多说明,再看下l原创 2020-06-16 08:19:42 · 140 阅读 · 0 评论 -
Redis 学习笔记(一) 字符串 SDS
SDS 简单动态字符串。SDS的结构:struct sdshdr{ int len;//记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度 int free;//记录BUF数组中未使用字节的数量 char buf[];//字节数组,用于保存字符串}1、与c语言的字符串相比,SDS获取长度时,时间复杂度位O(1),c的复杂度位O(n)。2、杜绝缓冲区溢出,c字符串若未重新分配内存,在进行字符串拼接时,会导致扩展字符串s1的数据溢出到s2所在的空间,导致s2所保存的内容被原创 2020-06-15 08:36:28 · 784 阅读 · 0 评论 -
Redis学习笔记(二十一) 事务
文章开始啰嗦两句,写到这里共21篇关于redis的琐碎知识,没有过多的写编程过程中redis的应用,着重写的是redis命令、客户端、服务器以及生产环境搭建用到的主从、哨兵、集群实现原理,如果你真的能看的进去,相信对你在以后用到redis时会有一定的帮助。写到现在,redis相关的内容暂时告一段落了,以后可能更着重的去介绍c#相关的知识,包括用到IL、.net core底层、微服务等知识。哎呀,写着写着突然又想啰嗦几句,最近几年c#在国内式微java如日中天,好多微软系的小伙伴或者各路大神都不看好c#,原创 2020-06-13 23:04:17 · 178 阅读 · 0 评论 -
Redis学习笔记(二十) 发布订阅(下)
当一个客户端执行SUBSCRIBE命令订阅某个或某些频道时,这个客户端与被订阅频道之间就建立起了一种订阅关系。Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值是一个链表,链表里面记录了所有订阅这个频道的客户端:struct redisServer{ //保存所有频道的订阅关系 dict *pubsub_channels;}如果频道已经有其他的订阅者,那么他在pubsub_channels字典中必然有相原创 2020-06-12 23:11:42 · 152 阅读 · 0 评论 -
Redis学习笔记(十九) 发布订阅(上)
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,它的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者:每当有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到这条消息。偷个懒今天模拟下发布订阅的过程。首先启动6379端口的服务端:然后通过redis-cli命令启动三个客户端,其中两个分别执行subscri原创 2020-06-11 22:19:48 · 133 阅读 · 0 评论 -
Redis学习笔记(十八) 集群(下)
复制和故障转移Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制 的主节点下线时,代替下线主节点继续处理命令请求。设置从节点:CLUSTER REPLICATE < node_id >可以让接收命令的节点称为node_id 所指定节点的从节点,并开始对主节点进行复制。1)接收到该命令的节点首先会在自己的clusterState.nodes字典中找到node_id所对应节点的clusterNode结构,并将自原创 2020-06-10 22:34:22 · 269 阅读 · 0 评论 -
Redis学习笔记(十七) 集群(上)
Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作。一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含自己的集群当中,我们通过使用CLUSTER MEET命令将节点连接到一起,构成一个包含多节点的集群。集群的数据结构:clusterNode结构保存了一个节点的当前状态,比如节点创建时间、节点名称、节点当前的配置纪元、节点的ip端口。每个节点都会使用一个clusterNode结构记录自己的状态,并为集群中的所原创 2020-06-09 22:50:09 · 141 阅读 · 0 评论 -
Redis学习笔记(十六) Sentinel(哨兵)(下)
身体偶感不适,消失了一段时间,我又回来啦。不多说,继续把哨兵看完。检测主观下线状态默认情况下,Sentinel会以每秒一次的频率向所有与他创建了命令连接的实例(主从服务器以及其他Sentinel)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线。实例对PING命令的回复可以分为两种情况:有效回复:实例返回+PONG、-LOADING、-MASTERDOWN三种回复的其中一种。无效回复:实例返回除+PONG、-LOADING、-MASTERDOWN三种回复之外的回复或者规定时间内原创 2020-06-08 22:34:54 · 151 阅读 · 0 评论 -
Redis学习笔记(十五)Sentinel(哨兵)(中)
上一篇我们模拟了单机器下哨兵模式的搭建,那么接下来我们看下哨兵模式的实现与工作。为什么又分成两篇呢?因为篇幅太长(偷懒),再一个这篇主要说的是Sentinel的初始化以及信息交换,下一篇着重说下状态检查、Sentinel头领选举与故障转移 。启动并初始化Sentinel当一个Sentinel启动时,需要执行以下步骤:(1)初始化服务器。因为Sentinel本事上是一个运行在特殊模式下的Redis服务器,所以启动时的第一步也就是初始化一个普通的Redis服务器。不同点是在初始化的时候不会载入RDB或原创 2020-05-23 22:24:50 · 916 阅读 · 0 评论 -
Redis学习笔记(十四)Sentinel(哨兵)(上)
哨兵模式(Sentinel)是Redis的高可用解决方案。由一个或多个Sentinel实例组成的Sentinel系统,可以监控任意多个主服务器,以及这些主服务器下的所有从服务器,当某个主服务器下线时,自动将这个主服务器下的某个从服务器升级为新的主服务器,代替下线的主服务器继续处理命令。另外Sentinel系统还会继续监视已下线的主服务器,当主服务器恢复时,它将被降级成该主服务器的从服务器。在看哨兵模式的实现过程之前,我们先看一下哨兵的用法:1、我们将redis.windows.conf配置文件拷贝3份出原创 2020-05-23 10:23:59 · 248 阅读 · 0 评论 -
Redis学习笔记(十三) 复制(下)
上一篇写了Redis复制功能的简单应用,下面我们看下Redis复制功能的实现过程。下面基本上是理论部分,枯燥乏味,但希望大家能看看,毕竟知识不都是感兴趣的.耐得住寂寞,经得起诱惑,方能守得住繁华 .旧版复制功能的实现Redis的复制功能分为同步和命令传播两个操作:1、同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。2、命令传播操作则用于在主服务器 的数据库状态被修改,导致从服务器的数据库状态出现不一致时,让主服务器的数据库重新回到一致状态。从服务器对主服务器的同步操作需要通原创 2020-05-22 06:33:47 · 154 阅读 · 0 评论 -
Redis学习笔记(十二) 复制(上)
偷个懒,晚上工作忙的太晚,整个复制功能的内容还没有写完,这里先说一下复制功能的简单应用。在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)。进行复制中的主从服务器双方的数据库将保存相同的数据,概念上我们将这种现象称为数据库状态一致或简称一致。现在我们简单模拟主从同步:1、拷贝一份redisServer的代码出来,修改redis.win原创 2020-05-20 23:24:08 · 181 阅读 · 0 评论 -
Redis学习笔记(十一) 服务器
Redis服务器负责与多个客户端建立网络通信,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。命令请求过程(以set命令为例)1、客户端向服务器发送命令请求 SET KEY VALUE。Redis服务器的命令请求来自于Redis客户端,当用户从客户端键入一个命令请求时,客户端会将这个命令命令请求请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。2、服务器接收并处理客户端发送来的命令请求 SET KEY VA原创 2020-05-19 23:22:07 · 573 阅读 · 0 评论 -
Redis学习笔记(十) 客户端
Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式处理命令请求,并于多个客户端进行网络通信。每个与服务器进行连接的客户端,服务端都为这些客户端建立相应的redisClient结构(客户端状态),保存客户端当前的状态信息,以及执行相关功能时需要用到的数据结构。Redis服务器状态结构的原创 2020-05-18 22:50:45 · 199 阅读 · 0 评论 -
Redis学习笔记(九) AOF持久化
除了RDB持久化功能之外,Redis还提供了AOF持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭前的数据库状态。AOF持久化功能的实现可以分为命令追加append、文件写入、文件同步sync三个步骤。1、服务器在执行完一个写命令后,会议协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区末尾。2、Redis的服务器进程是原创 2020-05-17 21:01:06 · 124 阅读 · 0 评论 -
Redis学习笔记(八) RDB持久化
Redis是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将存储在内存中的数据库状态保存到磁盘,那么服务器 进程一旦退出,服务器中的数据库状态也会消失不见。为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将数据库状态保存到磁盘里面1、RDB文件的创建与载入Redis可以使用SAVE或BGSAVE命令创建RDB文件。SAVE命令会阻塞服务器进程,直到RDB文件创建完毕,在服务器阻塞过程中服务器不能处理任何命令,所以此时客户端发送来的命令都会被拒绝。BGSAVE命令会原创 2020-05-17 09:46:58 · 198 阅读 · 0 评论 -
Redis学习笔记(七) 数据库
Redis 服务器将所有的数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDB:struct redisServer{ //一个数组保存着服务器中的所有数据库 redisDb *db; //数据库的个数 int dbnum;}dbnum:服务器初始化时,程序根据dbnum 来决定应创建多少少数据库,由服务器配置的database选项决定,默认16.在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前目标数据库原创 2020-05-16 08:01:40 · 192 阅读 · 0 评论 -
Redis学习笔记(六) 对象
前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS)、双向链表、字典、压缩列表、整数集合等。但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象、列表对象、哈希对象、集合对象、有序集合对象,除此之外,redis的对象系统还实现了基于计数技术的内存回收机制,另外redis还通过引用计数技术实现了对象共享机制(适当条件下,多个数据库键共享同一个对象来节约内存)。最后,redis的对象带有访问时间记录信息,该信息可以用于计算数原创 2020-05-15 00:10:52 · 210 阅读 · 0 评论 -
Redis学习笔记(五) 压缩列表
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2020-05-13 23:04:23 · 206 阅读 · 0 评论