Redis
文章平均质量分 64
该专栏记录本人学习Redis的记录
哎呦,帅小伙哦
这个作者很懒,什么都没留下…
展开
-
Redis——Lua脚本
1,Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务器端原子地执行多个redis命令。2,创建并修改Lua环境的步骤如下:1)创建一个基础的Lua环境,之后的所有修改都是针对这个环境进行的2)载入多个数据库到Lua环境里面,让Lua脚本可以使用这些函数库来进行数据操作3)创建全局表格redis,这个表格包含了对Redis进行操作的函数4)使用Redis自制的随机函数来替换Lua原有的带有副作用的随机函数,从而避免在脚本中原创 2021-04-07 21:45:26 · 146 阅读 · 0 评论 -
Redis——事务
1,Redis通过MULYI、EXEC、WATCH等命令来实现事务功能。事务的概念已经很清楚,这里不重复进行记录。2,一个事务从开始到结束通常会经历以下三个阶段:1)事务开始MULTI命令的执行标志着事务的开始。2)命令入队当一个客户端处于非事务状态时,这个客户端发送的命令会立即被服务器执行;与此不同的是,当一个客户端切换到事务状态之后,服务器会根据这个客户端发来的不同命令执行不同的操作:- 当客户端发送的命令为EXEC、DISCARD、WATCH、WULTI四个命令的其中一个,那么服务器立即执原创 2021-04-07 20:09:25 · 66 阅读 · 0 评论 -
Redis——发布与订阅
1,Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIRE等命令组成。通过执行SUBSCRIBE命令、客户端可以订阅一个或多个频道,从而成为这些频道的订阅者:每当有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到这条消息。2,除了订阅频道之外,客户端还可以通过执行PSUBSCRIBE命令订阅一个或多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会被发送给这个频道的所有订阅者,它还会被发送给所有与这个频道相匹配的模式的订阅者。3,原创 2021-04-07 16:02:16 · 95 阅读 · 0 评论 -
Redis——集群
1,Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。2,节点要组件一个正在可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。可以使用CLUSTER MEET 命令向一个节点node发送CLUSTER MEET命令,可以让node节点与ip和port所指定的节点进行握手,当握手成功时,node节点就会将ip和port所指定的节点添加到node节点当前所在的集群中。一个节点就是一个运行在集群模式下的Redis服务器,Red原创 2021-04-07 00:08:38 · 65 阅读 · 0 评论 -
Redis——Sentinel(哨兵)
1,Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替一下线的主服务器继续处理命令请求。2,启动并初始化Sentinel的步骤:1)初始化服务器Sentinel的本质只是一个运行在特殊模式下的Redis服务器,所以启动Sentinel的第一步就是初始化一个普通的Redis服原创 2021-04-04 22:59:12 · 145 阅读 · 0 评论 -
Redis——复制
1,在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器。被复制的服务器我们称呼为主服务器,而对主服务器进行复制的服务器则被称为从服务器。2,旧版复制功能的实现redis的复制功能分为同步和命令传播两个操作:1)同步同步操作用于将从服务器的数据库状态更新至主服务当前所处的数据库状态。当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作。从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来原创 2021-04-01 17:13:59 · 387 阅读 · 0 评论 -
Redis——服务器
1,一个命令请求从发送到获得回复的过程中,客户端和服务器需要完成一系列操作。第一步:发送命令请求,当用户在客户端中键入一个命令请求时,客户端将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。第二步:读取命令请求,当客户端与服务器之间的套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:1)读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面2)对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及原创 2021-03-31 23:14:32 · 102 阅读 · 0 评论 -
Redis——客户端
客户端1,对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/redisClient结构来存储客户端的状态。服务器结构中用一个链表来保存与该服务器相连接的所有客户端。2,下面介绍客户端的属性1)套接字描述符fd:其实是-1的时候代表是伪客户端。伪客户端的命令请求来源于AOF文件或者Lua脚本,而不是网络。普通客户端的fd属性的值为大于1的整数。服务器使用fd大于1的套接字与客户端进行通信。2)名字:默认情况下,一个链接到服务器的客户端是没有名字的,但是可以通过setn原创 2021-03-31 20:04:35 · 191 阅读 · 0 评论 -
Redis——事件
1,Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:1)文件事件:Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。2)时间事件:Redis服务器中的一些操作需要在给定时间点执行,而时间事件就是服务器对这类定时操作的抽象。2,Redis文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据**套接字目前执行的任务来为套接字关联不同的事件处理器。原创 2021-03-31 15:08:26 · 142 阅读 · 0 评论 -
Redis——AOF持久化
1,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。而RDB持久化通过保存数据库中的键值对来记录数据库状态。2,AOF持久化功能的实现可以分为命令追加、文件写入、文件同步三个步骤。1)命令追加:当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。3,系统提供fsync和fdatasync两个同步函数,它们可以强制让操作系统立即将缓冲区中的数据写入到硬盘里面。4,服务器配置appendfsyn原创 2021-03-30 21:03:41 · 302 阅读 · 0 评论 -
Redis——RDB持久化
1,Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务其中的数据库状态也会消失不见。RDB持久化功能可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,这个文件还可以还原成数据库的状态。2,Redis命令可以用于原创 2021-03-30 17:04:10 · 120 阅读 · 0 评论 -
Redis——数据库
1,Redis中redis.h/redisServer结 结构的db数组中的每一项都是一个redisDb结构。dbnum属性来决定应该创建多少个数据库,这个值由服务器配置的database选项决定,默认情况下是16。struct redisServer{ //一个数组,保存着服务器中的所有数据库 redisDb *db; //服务器的数据库数量 int dbnum;}2,在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDB原创 2021-03-29 17:38:11 · 154 阅读 · 0 评论 -
Redis——对象
1,前面学习了几种数据结构,Redis系统使用这些数据结构创建了一个对象系统。这样就可以根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处是可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。2,Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的3个属性分别是type、encoding、ptr。typedef struct redisObject{ //类型 unsigned type:4; //编原创 2021-03-28 13:06:42 · 215 阅读 · 0 评论 -
Redis压缩列表
1,当一个列表只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做底层实现结构。2,压缩列表是Redis为了节约内存而开发的,**是由一系列特殊编码的连续内存块组成的顺序型数据结构。**一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值。3,压缩列表各部分组成如下:zlbytes(4字节):记录整个压缩列表占用的内存字节数:在对压缩列表进行内存重分配,或者计算zlend的位置时使用zltail(4字节):记录压缩列原创 2021-03-26 22:16:57 · 210 阅读 · 0 评论 -
Redis数据结构——整数集合
1,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为这种集合的底层实现结构。它是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t、或者int64_t的整数值,并且保证集合中不会出现重复元素。每个intset.h/intset结构表示一个整数集合:typedef struct intset{ //编码方式 uint32_t encoding; //集合包含的元素数量 uint32_t length; //保存元素的原创 2021-03-26 16:41:10 · 134 阅读 · 0 评论 -
Redis数据结构——跳跃表
1,跳跃表是一种有序数据结构,它可以通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批处理节点。在大部门情况下,跳跃表的效率可以和平衡树相媲美。2,Redis中只有两个地方用到了跳跃表,一个是实现有序集合,另一个是在集群节点中用作内部数据结构。...原创 2021-03-25 19:02:52 · 132 阅读 · 0 评论 -
Redis数据结构——字典
1,字典,又称为符号表、关联数组、或映射,是一种用于保存键值对的抽象数据结构。2,**Redis的字典使用哈希表作为底层实现。**哈希表的结构定义如下:typedef struct dictht{ dictEntry **table;//哈希表数组 unsigned long size;//哈希表大小 unsigned long sizemask; //哈希表大小掩码,用于计算索引值,总是等于size - 1 unsigned long used; //该哈希表已有的节点数}dicket;原创 2021-03-22 21:28:48 · 263 阅读 · 0 评论 -
Redis数据结构——链表
1,链表结点的定义:typedef struct listNode{ //前置节点 struct listNode *prev; //后置节点 struct listNode *next; //节点的值 void *value;}listNode;2,Redis中的链表的定义如下:typedef struct list{ listNode *head;//表头节点 listNode *tail;//表尾节点 unsigned long len//链表所包含的节点数量 void原创 2021-03-22 18:50:57 · 77 阅读 · 0 评论 -
Redis数据结构——SDS简单动态字符串
1,C语言中定义的字符串是以空字符结尾的字符数组,而Redis中自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型。2,sds的结构如下:struct sdshdr{//记录buf数组中已使用字节的数量//等于SDS所保存的字符串长度int len;//记录buf数组中未使用字节的数量int free;//字节数组,用于保存字符串char buf[];}3,SDS与C字符串的区别1)常数复杂度获取字符串长度,程序计算C字符串的长度的原创 2021-03-22 16:13:23 · 176 阅读 · 2 评论