Redis
文章平均质量分 94
GDUT_Ember
这个作者很懒,什么都没留下…
展开
-
Redis(三十九):认识慢查询日志
配置选项slowlog-log-slower-thanslowlog-max-len相关命令慢查询记录的保存slowlog_entry_idslowlog慢查询日志的阅览和删除阅览删除添加新日志重点在Redis配置文件中,有两个选项是跟慢查询日志有关的分别为slowlog-log-slower-thanslowlog-max-len配置选项slowlog-log-slower-than这个选项指定执行时间超过多少微秒的命令请求会被记录到慢查询日志上,相当于定义了命令执行的时间超过多少时.原创 2021-05-24 21:37:31 · 152 阅读 · 0 评论 -
Redis(三十八):排序
选项参数sort 命令的实现ALPHA选项的实现DESC与ASC选项BY选项带有ALPHA选项的BY选项的实现LIMIT选项的实现Get选项的实现STORE选项的实现SORT命令多个选项的执行顺序重点Redis可以使用sort命令对列表和集合进行排序选项参数ALPHA选项:可以对字符串进行排序可以看到,alpha对数字排序不影响,但如果出现字符串,那么就必须加上alpha,否则会报错,提示有scores不可以转变为doubleBy选项:可以指定权重,这里要知道sort命令都要指定权.原创 2021-05-24 18:14:27 · 617 阅读 · 0 评论 -
Redis(三十七):事务
事务的实现事务开始命令入队事务队列执行事务WATCH命令的实现监视机制的触发判断事务是否安全事务执行失败的栗子事务的ACID性质Redis对于原子性的实现Redis对于一致性的实现入队错误执行错误服务器停机Redis对于隔离性的实现Redis对于持久性的实现Redis为何不支持回滚Redis也是有事务功能的。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行过程中,是会阻塞服务的(这里是指事务在提交时,服务会阻塞的,不会去执行其他客户端提交的命令请求),服务器会优.原创 2021-05-23 22:09:21 · 115 阅读 · 0 评论 -
Redis(三十六):发布与订阅
频道的订阅与退订订阅频道退订频道模式的订阅与退订订阅模式退订模式发送消息将消息发送给频道订阅者将消息发送给模式订阅者查看订阅信息Pubsub ChannelsPubsub NumSubPubsub NumPat总结Redis的发布与订阅功能由Publish、Subscribe、Psubscribe等命令组成频道的订阅与退订订阅使用的命令是Subscribe或者PsubscribeSubscribe是指定订阅频道的名字,而Psubscribe是指定订阅频道的模式(名字的模式)当一个客户端执行Su.原创 2021-05-22 18:04:34 · 104 阅读 · 0 评论 -
Redis(三十五):集群——消息(MEET、PING、PONG、FAIL、PUBLISH)
消息消息头MEET、PING、PONG消息的实现FAIL消息的实现PUBLISH消息的实现为什么不直接广播发送PUBLISH命令前面已经知道了集群是怎么进行故障转移操作和如何进行选举从节点的,而且这两个过程还有前面的一些过程都离不开一个操作,那就是发送消息。消息集群中的各个节点(包括从节点)是通过发送消息和接受消息来进行通信的,称发送消息的节点为发送者,接收消息的节点为接收者。发送的消息类型主要有以下5种,这5种在前面的文章都提到过MEET消息:当发送者接收到客户端传来的CLUSTER ME.原创 2021-05-20 10:14:44 · 1796 阅读 · 1 评论 -
Redis(三十四):集群——复制与故障转移
复制与故障转移设置从节点故障检测故障转移选举新的主节点前面已经知道了集群的ASK错误与MOVED错误,前者针对重新分片过程中的转移,后者是一般槽不属于委任槽,要进行转移,前者会带有一次性表示,后者只要转移一次,以后的请求都是请求在转移的服务器上启用哨兵模式时,当监视的主服务器挂了,会有选举机制,同理,集群也有自己的选举机制与复制故障转移复制与故障转移Redis的集群中分为主节点和从节点,其中主节点是用来处理槽的(此时已经做了读写分离,主服务器用来写,而从服务器只能读),而从服务器需要复制某个主节点.原创 2021-05-18 23:05:00 · 307 阅读 · 0 评论 -
Redis(三十三):集群——ASK错误
ASK错误Cluster SetSlot Importing命令的实现cluster setslot migrating命令的实现ASK错误ASKING命令ASK错误和MOVED错误的区别上面已经知道了集群是如何执行命令与进行重新分片的。当集群中的服务器接收到键值对,会计算键值对所在的槽,判断这个槽是不是自己管,不是的话,就发送给对应的clusterNode,也知道了,集群是如何进行重新分片的。ASK错误前面提到过,集群可以进行重新分片,即将源节点的槽全部转移给目标节点管理,总共有6个步骤re.原创 2021-05-17 22:27:26 · 388 阅读 · 0 评论 -
Redis(三十二)集群:集群中如何执行命令与重新分片原理
在集群中执行命令计算键是属于哪个槽判断槽是否由当前节点负责处理MOVED错误节点数据库的形成slots_to_keys属性重新分片重新分片的实现原理在集群中执行命令前面已经说过,集群对于键值对的处理是分槽的,然后将槽分给集群里面的各个结点,必须所有槽都分配了,集群才能进入上线状态,并对外服务下面就来看看在集群中是怎么执行客户端的命令的(客户端肯定得要连接一个服务器,发送命令就是发送到服务器,但至于是该服务器的集群中哪个服务器处理,就要看槽是分配给谁的啦,然后槽分配给谁也涉及到一个权重问题,也就是负载.原创 2021-05-15 23:25:44 · 478 阅读 · 0 评论 -
Redis(三十一):集群(二)——切片
槽指派记录节点的槽指派信息传播节点的槽指派信息记录集群所有槽的指派信息Cluster AddSlots命令实现槽指派Redis集群是通过分片的方式来保存数据库中的键值对(分开槽)。集群的整个数据库被分为16384(2142^{14}214)个槽(slot),所有数据库中的每个键都属于这些槽中的一个,集群中的每个节点都可以处理0个或最多16384个槽当集群的整个数据库的所有槽都有节点进行处理时,集群处于上线状态,反之,如果有任何一个槽没有得到处理,那么集群就会处于下线状态所以,当节点连接到了同一个.原创 2021-05-14 18:33:43 · 162 阅读 · 1 评论 -
Redis(三十):集群(一)——集群的数据结构底层与建立连接过程
节点启动节点集群数据结构CLUSTER MEET命令的实现连接细节拓展前面我们已经讲过Redis实现高可用式的一种方法是哨兵模式(Sentinel),但其实哨兵模式高可用其实也不算很好,哨兵模式针对的主服务器只有一台(因为要监视同一台主服务器的哨兵才会在一起形成网络),所以Redis又提供了另外一种实现高可用式的方案,称为集群。哨兵模式仅仅解决了一个切换问题,就是主服务器宕机了,就让从服务器担任新的主服务器,继续提供服务,在这期间,依然会有一个瞬断问题(就是切换期间,服务器是停止对外提供服务的)那么.原创 2021-05-11 18:18:56 · 249 阅读 · 0 评论 -
Redis(二十九):Sentinel——Redis的哨兵模式原理(五)
选举领头的Sentinel故障转移挑选新的主服务器修改从服务器的复制目标将旧的主服务器变为从服务器前面提到了,Sentinel如何将一台服务器认定为客观下线,下面就来看,对于客观下线的服务器,Sentinel是怎么处理的选举领头的Sentinel当一台Sentinel认为被监视的服务器客观下线了之后,就会与监视这个下线主服务器的各个Sentinel进行协商,选举出一个领头的Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作(所以前面提到的领头Sentinel其实就是去完成故障转.原创 2021-05-10 20:07:02 · 131 阅读 · 0 评论 -
Redis(二十八):Sentinel——Redis的哨兵模式原理(四)
检测主观下线状态主观下线时长选项的作用范围监视同一台主服务器的多个Sentinel设置的主观下线时间可能不同检测客观下线状态发送SENTINEL is-master-down-by-addr命令接收SENTINEL is-master-down-by-addr命令接收Sentinel is-master-down-by-addr命令回复客观下线状态的判断条件不同Sentinel判断客观下线的条件可能不同前面已将介绍完了,Sentinel之间通过发送信息给被监听的服务器,发现其他监视同一台服务器的Sent.原创 2021-05-10 20:05:18 · 138 阅读 · 0 评论 -
Redis(二十七):Sentinel——Redis的哨兵模式原理(三)
Sentinel系统接收来自主服务器和从服务器的频道信息Sentinel系统向主服务器和从服务器发送信息Sentinel发送与接收信息过程更新Sentinel字典创建连接向其他Sentinel的命令连接在前面的一篇,已经说到Sentinel通过INFO命令获得主服务器的信息,然后保存在自己Master属性里(创建SentinelRedisInstance对象),然后主服务器里面的信息还有从服务器的信息,也会通过这些信息与从服务器建立连接,然后也是通过INFO命令获得从服务器的信息,然后保存在主服务器的S.原创 2021-05-10 12:24:26 · 133 阅读 · 0 评论 -
Redis(二十六):Sentinel——Redis的哨兵模式原理(二)
上一篇提到了Sentinel的初始化执行的步骤,最后一步为与主服务器建立了两条连接,一条为命令连接,另一条为订阅连接,下面我们就说一下这两条连接的功能,Sentinel怎样与主从服务器进行交流,Sentinel怎样与其他Sentinel进行交流获取主服务器信息Sentinel与主服务器建立了命令连接,而为了获取主服务器的信息,还要保持数据是最新的,Sentinel默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并且通过分析INFO命令的回复来获取主服务器的当前信息(INFO命令原创 2021-05-09 21:54:39 · 143 阅读 · 0 评论 -
Redis(二十五):Sentinel——Redis的哨兵模式原理(一)
Sentinel实现Redis高可用性的一个解决方案首先我们来理解什么是高可用性高可用性通常来描述一个系统的平均无故障时间,即服务器正常对外提供服务的时间,通过减少服务器的停工时间Sentinel(哨岗、哨兵)是Redis的高可用性的解决方案之一。由一个Sentinel实例组成的Sentinel系统可以监视整体来说是由一个或者多个Sentinel实例去组成的Sentinel系统,该系统可以监视多个任意多个主从服务器(一旦发现主服务器宕机了,就要在其属下的从服务器进行选举,充当主服务器),当被监视的原创 2021-05-09 21:48:41 · 148 阅读 · 0 评论 -
Redis:单机实现Sentinel
Sentinel的功能监控通知自动故障排除监控又主要指下面两方面master存活检测master与slaver运行情况检测通知:当被监控的服务器宕机了之后,需要给其他服务器发送提醒自动故障排除:被监控的主服务器宕机了之后,需要选举出新的主服务器,其他服务器要成为该新服务器的从服务器sentinel.conf介绍因为哨兵其实也是一台服务器,所以也有自己的配置文件,下面就来看看该配置文件该文件我是在解压的Redis文件夹下找到的,而不是在安装的文件夹找到的使用下面的命令,去除掉所原创 2021-05-07 23:12:57 · 249 阅读 · 1 评论 -
Redis(二十四):复制(三)——传播命令的心跳检测
心跳检测检测主从服务器的网络连接状态辅助实现min-slaves配置选项拓展min-slaves检测命令丢失心跳检测前面说过主从同步的最后一个步骤就是传播命令,现在问题来了,主服务器怎么去及时确定从服务器依然在连接呢?Redis使用了心跳检测去解决这个问题什么是心跳检测呢?在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送下面命令replconf ack <replication_offset>其中replication_offset是从服务器自身维护的一个复制偏移量.原创 2021-04-30 22:24:54 · 662 阅读 · 7 评论 -
Redis(二十二):复制(二)——Psync命令的实现与主从同步复制的实现
Psync命令的实现复制/同步的实现步骤1:设置主服务器的地址和端口步骤二:建立套接字连接步骤3:发送Ping命令步骤4:身份验证步骤5:发送端口信息步骤6:同步步骤7:命令传播Psync命令的实现前面我们提到过,现在Redis进行复制,从服务器是使用了Psync命令代替了Sync命令,下面介绍一下Psync命令的实现Psync的调用方式有两种从服务器没有复制过主服务器,或者从服务器执行了slaveof no one命令,取消了从主关系,那么当从服务器执行slaveof命令时,会发送Psync .原创 2021-04-30 22:22:55 · 1401 阅读 · 3 评论 -
Redis(二十一):复制
复制旧版复制功能的实现同步命令传播旧版复制功能的缺陷新版复制功能的实现部分重同步的实现复制偏移量复制积压缓冲区拓展固定长度队列调整复制积压缓冲区的大小服务器运行ID复制在Redis中,我们可以通过执行SLAVEOF命令或者设置slaveof选项(如果有主服务器有密码,还需要设置masterauth选项,最好把日志功能打开,即设置logfile选项,失败的话,可以从日志中看),让一个服务器去复制另一个服务器,被复制的服务器称为主服务器,而对主服务器进行复制的服务器称为从服务器举个栗子slaveof .原创 2021-04-29 23:08:55 · 128 阅读 · 0 评论 -
Redis单机集群
认识集群集群的模式哨兵模式高可用集群搭建单机集群创建文件夹复制默认配置文件,并修改一些选项开启所有服务器使用Ruby命令开启集群验证集群是否开启成功关闭集群恢复集群认识集群我们先从三个问题去认识集群什么是集群?集群就是多台服务器集中在一起,服务器有主从之分,客户端访问主服务器,从服务器一般不会提供服务,但从服务器会同步主服务器的数据。为什么要集群?如果没有集群,所有数据都在一台服务器上,假如该服务器宕机或者发生其他错误,就会停止服务,在现在并发量高的场景,Redis单机大概可以承担大概10万的.原创 2021-04-25 21:22:57 · 464 阅读 · 0 评论 -
Redis(二十):服务器的初始化
初始化服务器初始化服务器状态结构载入配置选项初始化服务器数据结构还原数据库状态执行事件循环初始化服务器Redis需要经过一系列的初始化和设置过程,比如初始化服务器状态(RedisServer结构),接收用户指定的服务器配置,创建相应的数据结构和网络连接,才可以进行后续的正常使用。总的来说,初始化有以下几个步骤需要进行初始化服务器状态结构载入配置选项初始化服务器数据结构还原数据库状态(持久化文件的读取)执行事件循环(前面提到过,Redis服务器运行的其实就是一个不断循环的事件)初始化服.原创 2021-04-24 22:49:03 · 419 阅读 · 0 评论 -
Redis(十九):ServerCron函数与相关服务器属性
serverCron函数serverCron是Redis中的一个周期时间事件,Redis服务器中的serverCron函数是默认每隔100毫秒执行一次,该函数负责管理服务器的资源更新服务器时间缓存Redis服务器中有不少命令都是需要获取系统的当前时间的(比如服务器那边判断客户端执行命令的总时长),而每次获取系统的当前时间都需要执行一次系统调用,为了减少系统调用的执行次数,服务器状态中的unixtime属性和mstime属性被用作当前时间的缓存。struct redisServer( //...原创 2021-04-24 22:47:58 · 340 阅读 · 0 评论 -
Redis(十八):服务器
命令请求的执行过程发送命令请求读取命令请求命令执行器的步骤查找命令的实现RedisCommand的结构大小写不会影响查找命令的结果集执行预备操作调用命令的实现函数执行后续工作将命令回复发送给客户端客户端接收并打印命令回复Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,并且在数据库中保存客户端执行命令所产生的数据,并且通过资源管理器来维持服务器自身的运转。命令请求的执行过程一个命令请求从发送到获得回复的过程中,客户端与服务器需要完成一系列的过程客户端向服务器发送命令请求服.原创 2021-04-23 22:40:22 · 117 阅读 · 0 评论 -
Redis(十七):客户端
客户端客户端状态属性套接字描述符名字标志输入缓冲区命令与命令参数命令的实现函数输出缓冲区身份验证时间客户端的创建与关闭创建普通的客户端关闭普通客户端Lub脚本的伪客户端AOF文件的伪客户端客户端Redis服务器是典型的一对多服务器程序,即一个服务器可以与多个客户端建立网络连接,每个客户端都可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。这个过程是通过IO多路复用技术配合上文件事件处理器来实现的(Reactor模式),Redis使用单线程单进程的方式去处理命.原创 2021-04-22 22:09:59 · 136 阅读 · 0 评论 -
Redis(十六):事件
事件文件事件文件事件处理的构成IO多路复用程序的实现事件的类型文件事件的处理器连接应答处理器命令请求处理器命令回复处理器完整的连接过程时间事件时间事件的实现ServerCron函数事件的调度与执行调度规则重点事件在AOF那章提到过,Redis服务器是一个事件驱动的程序,由一个Loop循环不断地接收事件执行和执行时间事件首先认识以下什么是套接字套接字是对运输层以下的一个抽象封装,将运输层以下,包括运输层的细节全部封装起来,这样应用层传数据给下层时,就不需要关注下面的细节,只需传给套接字即可。然后再.原创 2021-04-21 20:55:34 · 206 阅读 · 0 评论 -
Redis(十五):AOF持久化
AOF持久化的实现命令追加AOF文件的写入与同步3种方式的比较AOF文件的载入与数据还原AOF文件载入AOF重写AOF文件重写的实现AOF后台重写(BGREWRITEAOF命令)重点AOF持久化与前面提到的RDB持久化不同,RDB持久化是保存数据库中的键值对来记录数据库状态不同,AOF持久化则是通过保存Redis服务器所执行的些命令来记录数据库的状态,保存在AOF文件中,在AOF文件中,除了用于指定数据库的SELECT命令是服务器自动添加的以外,其他都是客户端发送的命令。AOF持久化的实现AOF持久.原创 2021-04-20 20:38:48 · 150 阅读 · 0 评论 -
Redis(十四):RDB持久化(二)
RDB文件架构Redis部分db_version部分databases部分key_value_pairs部分VALUE编码字符串对象列表对象集合对象哈希对象有序集合对象INSET编码的集合ZIPLIST编码的列表、有序集合、哈希表EOF常量check_sum部分重点RDB文件架构完整的RDB文件包含下面5个部分REDIS(常量)db_versions(变量)databases(变量)EOF(常量)check_sum(变量)Redis部分RDB文件的最开头是REDIS部分,这个部分其.原创 2021-04-19 17:00:35 · 177 阅读 · 0 评论 -
Redis(十三):RDB持久化(一)
RDB文件的创建与载入创建(SAVE与BGSAVE)载入RDB文件SAVE命令执行时的服务器状态BGSAVE命令执行的服务器状态RDB文件载入时的服务器状态自动间隔性保存设置保存条件dirty计数器和lastsave属性检查条件是否满足Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘里面去,避免数据意外丢失。RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中RDB持久化功能所生成的RDB文件.原创 2021-04-19 16:53:19 · 168 阅读 · 0 评论 -
Redis(十二):Redis过期键删除策略、AOF、RDB、复制功能对过期键处理与数据库通知实现原理
Redis的过期删除键策略实现Redis惰性删除策略的实现Redis定期删除策略的实现AOF、RDB和复制功能对过期键的处理RDB生成RDB文件载入RDB文件AOFAOF文件写入AOF文件重写复制功能数据库通知键空间通知键事件通知notify-keyspace-events的配置发送通知的实现原理Redis的过期删除键策略实现前面我们已经提到过,删除策略总共有以下三种定时删除惰性删除定期删除Redis对于后面两种策略都有实现,至于为什么不实现定时策略,前面已经说过,定时器需要使用时间事件,.原创 2021-04-18 12:28:38 · 563 阅读 · 0 评论 -
Redis(十一):键的生存时间与过期时间
设置过期时间保存过期时间移除过期时间计算并返回剩余生存时间过期键的判定过期键的删除策略定时删除惰性删除定期删除Redis中可以通过EXPIRE命令和PEXPIRE命令可以给键设置生存时间(Time To Live TTL),也可以指定什么级别,毫秒级别或者秒级别,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键set msg valueexpire msg 5get msg也可以使用SETEX命令,在设置字符串的同时又为键设置过期时间,但这个命令只能用于字符串键,其实现的原.原创 2021-04-17 23:11:38 · 398 阅读 · 0 评论 -
Redis(十):数据库的键空间
数据库服务器中的数据库切换数据库数据库的键空间添加新键值对删除键值对更新键值对对键取值读写键空间时的维护操作数据库服务器中的数据库Redis服务器将所有的数据库都保存在服务器状态结构中,也是一个结构体,名为redis.h/redisServerstruct redisServer( //... 。。。 //数据库数量 int dbnum; //储存redis所有数据库的数组 redisDB *db;);在初始化服务器时,程序会根据服务器状态的dbnu.原创 2021-04-17 23:09:51 · 205 阅读 · 0 评论 -
Redis(九) 类型检查与命令多态、内存回收与对象共享
类型检查类型检查的实现多态命令的实现内存回收计数技术对象共享不能共享包含字符串的对象(列表,有序集合,集合,哈希)对象的空转时长空转时长的作用类型检查Redis中用于操作键(即对象)的命令基本上可以分为两种类型,分别如下可以对任何键进行操作只能对指定键进行操作比如DEL、EXPIRE、RENAME、TYPE、OBJECT命令,都是可以对任何键,任何Redis对象可以操作的。//字符串对象set a 1//列表对象并添加rpush b 2 3 4//集合对象并添加sadd c 5 .原创 2021-04-17 12:38:36 · 112 阅读 · 0 评论 -
Redis(八):集合对象与有序集合对象
集合对象集合对象的编码可以是intset(整数集合)或者hashtable(哈希表)使用intset编码作为底层的集合对象,所插入的元素都被保存在整数集合的数组里面使用hashtable编码作为底层的集合对象,所插入的元素都被保存在哈希表中(键值对是两个SDS对象,都存放在dictEntry结点中),插入的元素充当键值对的键,而键值对的值全部设为NULL。下图是整数集合作为底层实现下图是哈希表作为底层实现编码的转换当集合对象可以同时满足以下两个条件时,使用intset编码集合对象保存的原创 2021-04-16 18:33:53 · 288 阅读 · 0 评论 -
Redis(七):列表对象与哈希对象
Redis(七):列表对象与哈希对象列表对象前面已经认识了字符串对象,现在来认识列表对象在Redis版本3.2之前,列表对象的编码可以是ziplist或者linkedlist,分别是压缩列表(连续的内存块,结点里面的值保存的是字节数组或者整数)和双端链表(保存的是SDS)。不过从版本3.2开始,列表对象的实现都用quicklist了(下面会说)。注意双向链表结构中包含了多个字符串(SDS),这种嵌套字符串对象的行为在稍后介绍的哈希对象、集合对象和有序集合对象中都会出现,而且字符串对象是Redis原创 2021-04-15 20:47:25 · 161 阅读 · 0 评论 -
Redis(六):字符串对象
字符串对象对象对象的类型与编码类型编码和底层实现字符串对象embstr字符串对象对象前面提到的都是Redis主要数据结构简单动态字符串SDS(字符串)双端链表(list列表)字典(哈希表hash)压缩列表(list和hash的底层实现之一)跳跃表(zset的底层之一)整数集合(set底层之一)Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含了字符串对象、列表对象、哈希对象、集合对象和有序集合对象这5种类型的对象,每种对象都.原创 2021-04-15 20:45:21 · 128 阅读 · 0 评论 -
Redis(五):压缩列表
压缩列表压缩列表的构成压缩列表结点的构成Previous_entry_lengthencodingcontent连锁更新重点压缩列表压缩列表是列表键和哈希键的底层实现之一(列表键list的另一个底层实现是链表,哈希键hash另一个实现底层是哈希表)当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么redis会使用压缩列表来做列表键的底层实现。另外当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,也会采用压缩.原创 2021-04-14 15:37:17 · 279 阅读 · 0 评论 -
Redis(四):整数集合
整数集合集合键集合是指不重复且无序的字符串元素构成的整体(与列表不同的就是,它是无序且不重复的,所以不可以通过索引(列表有LIndex)来获取里面的值,只能逐个获取)。无序意味着里面所有元素的读写是可以任意的,不存在像列表一样一定是往两头插入或者在指定元素之间插入,或者是从两头开始弹出取值、通过索来取值。整数集合是集合键(set)的底层实现之一,当一个集合只包含整数值元素时,并且这个集合的元素数量不多时,Redis就会用整数集合作为集合键的底层实现。整数集合的实现整数集合(intset)是Redi原创 2021-04-12 22:21:59 · 404 阅读 · 0 评论 -
Redis(三):有序集合底层实现
跳跃表跳跃表的实现跳跃表结点层前进指针跨度后退指针分值和成员跳跃表重点跳跃表跳跃表是一种有序的数据结构,他通过在在每个结点中维护多个指向其他节点的指针,从而达到快速访问的目的。跳跃表支持平均O(logN)O(logN)O(logN),最坏O(N)O(N)O(N)复杂度的节点查询,所以可以支持顺序性的操作批量去处理节点。在大部分情况下,跳跃表的效率跟平衡树差不多,但实现起来比平衡树简单。跳跃表是Redis中有序集合键的底层(也就是ZSet)。Redis只在两个地方使用了跳跃表,一个是实现有序集合.原创 2021-04-11 18:19:45 · 790 阅读 · 0 评论 -
Redis(二):字典实现
字典字典:一种用于保存键值对的抽象数据结构Redis所使用的C语言没有字典结构,所以Redis构建了自己的字典实现set msg2 haha在数据库中创建了两个SDS对象(msg2与haha),这两个对象分别为键和值,共同组成一个键值对,这个键值对就是保存在Redis自己构建的字典中的。字典除了用来表示数据库时(像是一个数据库一样存储数据,数据即键值对),字典还是哈希键的底层实现之一,当一个哈希键(这里的哈希键其实指的是数据库的5大基本数据类型里面的哈希)包含的键值对比较多时,又或者键值对中的元原创 2021-04-10 15:31:01 · 143 阅读 · 0 评论 -
Redis(一):简单动态字符串
简单动态字符串(SDS)SDS的定义SDS与C字符串的区别常数复杂度获取字符串长度杜绝缓冲区的溢出减少修改字符串时带来的内存重分配次数空间预分配惰性空间释放二进制安全(binary-safe)总结简单动态字符串(SDS)Redis里面的字符串并不是像C语言那样传统的字符串,即以空指字符(\0)结尾的字符数组(下面都用C字符串来表示),Redis使用的是一种名为**简单动态字符串(Simple dynamic string,简称SDS)**的抽象类型,并将SDS用作Redis的默认字符串表示。在Red.原创 2021-04-09 16:34:19 · 181 阅读 · 0 评论