![](https://img-blog.csdnimg.cn/20201119123023279.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Redis
文章平均质量分 90
在此衷心感谢《Redis设计与实现》的作者黄建宏先生,学习无止境,加油吧少年!
你走吧起风了__
孤独本是常态,逢人何必言深。
展开
-
通过 Java 编程手动实现布隆过滤器
.什么是布隆过滤器?首先,我们需要了解布隆过滤器的概念。布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于1970年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map 、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。位数组中的每个元原创 2021-05-25 13:12:37 · 162 阅读 · 0 评论 -
Redis底层数据结构 ------> quicklist
之前的文章我曾总结到了Redis数据结构一链表和Redis数据结构一压缩列表这两种数据结构,他们是Redis List(列表)对象的底层实现方式。但是考虑到艇表的附加空间相对太高,prev和next 指针就要占去 16个字节(64bit 系统的指针是8个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理效率。因此Redis3.2版本开始对列表数据结构进行了改造,使用quicklist代替了 ziplist和 linkedlist.如图:一、基本结构qui.原创 2021-05-24 13:56:58 · 258 阅读 · 0 评论 -
Redis过期键淘汰删除策略的实现与底层原理
如果一个键过期了,可以有下面3个过期删除策略:①定时删除(Redis不支持)②惰性删除③定期删除注意:在这3种策略中,第①种和第③种为主动删除策略,而第②种则为被动删除策略Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以 很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡一、定时删除概念:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作Redis服务器没有使用这种策原创 2020-12-04 13:17:21 · 586 阅读 · 0 评论 -
Redis(设计与实现):---AOF持久化之AOF文件重写(aof_rewrite函数、REDIS_AOF_REWRITE_ITEMS_PER_CMD常量、BGREWRITEAOF命令)
一、AOF文件重写的概念为什么需要AOF文件重写举个例子,如果客户端执行了以下命令:那么服务器为了保存当前list键的状态,必须在AOF文件中写入六条命令因为AOF持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器、甚至整个宿主计算机造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多AOF文件重写的原理:为了原创 2020-11-17 12:54:06 · 312 阅读 · 0 评论 -
Redis(设计与实现):---AOF持久化之AOF文件的写入与还原(aof_buf缓冲区、flushAppendOnlyFile函数、appendfsync选项)
AOF持久化介绍除了RDB持久化功能之外,Redis还提供了AOF(Append OnlyFile)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,如下图所示:AOF文件介绍开启AOF持久化功能之后,Redis会将你本次在数据库中所操作的写记录追加到一个文件中(系统会自动在第一行添加一个SELECT命令用来指定数据库)被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,因为Re原创 2020-11-17 12:38:14 · 562 阅读 · 0 评论 -
Redis(设计与实现):---RDB持久化之RDB文件结构
总体结构RDB文件为二进制格式保存,下面我们为了演示效果,采用字符串的形式演示REDIS(常量):RDB文件的最开头是REDIS部分,这个部分的长度为5字节,保存着“REDIS”五个字符。 通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否RDB文件db_version(变量):长度为4字节,它的值是一个字符串表示的整数,这个整数记录了RDB文件的 版本号,比如"0006"就代表RDB文件的版本为第六版databases(变量):databases部分包含着零个或任意多个原创 2020-11-16 19:36:55 · 314 阅读 · 0 评论 -
Redis(设计与实现):---RDB持久化之自动间隔性保存(save选项、struct saveparam、dirty属性、lastsave属性)
一、自动间隔性保存介绍(save选项)前面一篇文章介绍了SAVE、BGSAVE命令,其中BGSAVE命令可以在不阻塞服务器进程的情况下执行,所以Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令save选项的格式用户可以通过save选项设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令如果用户没有主动设置save选项,那么服务器会为save选项设置默认条件:上图的意思是,只要满足以上三个条件中的任意一个,BGSAV原创 2020-11-16 19:08:57 · 741 阅读 · 0 评论 -
Redis(设计与实现):---RDB持久化之RDB文件的创建与载入(SAVE命令、BGSAVE命令、rdbSave函数、rdbLoad函数)
数据库状态Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态一、RDB持久化介绍因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘里原创 2020-11-15 20:01:41 · 565 阅读 · 0 评论 -
Redis(设计与实现):---监视器(MONITOR命令、replicationFeedMonitors函数)
一、监视器介绍通过执行MONITOR命令,客户端可以将自己变为一个监视器,实时地接收并打印出服务器当前处理的命令请求的相关信息:每当一个客户端向服务器发送一条命令请求时,服务器除了会处理这条命令请求之外, 还会将关于这条命令请求的信息发送给所有监视器,如下图所示:二、成为监视器(MONITOR命令、REDIS_MONITOR标志)发送MONITOR命令可以让一个普通客户端变为一个监视器MONITOR命令的实现原理可以用 以下伪代码来实现:def MONITOR(): # 打开客户端的原创 2020-11-14 12:13:52 · 350 阅读 · 0 评论 -
Redis(设计与实现):---慢查询日志(SLOWLOG命令、slowlog-log-slower-than选项、slowlog-max-len选项、struct slowlogEntry)
一、慢查询日志介绍Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度二、慢查询日志选项slowlog-log-slower-than选项:指定执行时间超过多少微秒(1秒等于1000 000微秒)的命令请求会被记录到日志上举个例子,如果这个选项的值为100,那么执行时间超过100微秒的命令就会被记录到慢 查询日志如果这个选项的值为500,那么执行时间超过500微秒的命令就会被记录到慢查询日志slowlog-max-len选项原创 2020-11-14 12:07:24 · 1441 阅读 · 0 评论 -
Redis(设计与实现):---SORT命令的实现(struct redisSortObject)
一、SORT 命令命令格式:SORT <key>功能: 对键key进行排序默认不带任何选项的SORT: 1.只可以对包含数字键的键key进行排序 2.默认是升序排序例如下面对一个包含3个数字的列表进行排序SORT命令的实现(structredisSortObject)以下是redisSortObject结构的完整定义:SORT命令为每个被排序的键都创建一个与键长度相同的数组,数组的每个项都是一个redisSortObject结构,根原创 2020-11-10 20:13:27 · 144 阅读 · 0 评论 -
Redis(设计与实现):---事务之事务的ACID性质(原子性、一致性(Redis事务错误处理)、隔离性 、耐久性)
事务的ACID性质在传统的关系式数据库中,常常用ACID性质来检验事务功能的可靠性和安全性在Redis中,事务总是具有以下的特性:原子性(Atomicity)一致性(Consistency)隔离性 (Isolation)当Redis运行在某种特定的持久化模式下时,事务也具有耐久性 (Durability)一、原子性事务具有原子性指的是,数据库将事务中的多个操作当作一个整体来执行,服务器要么就执行事务中的所有操作,要么就一个操作也不执行对于Redis的事务功能来说,事务队列中的命令原创 2020-11-10 19:47:27 · 909 阅读 · 4 评论 -
Redis(设计与实现):---事务之WATCH命令(watched_keys字典、touchWatchKey函数、REDIS_DIRTY_CAS标识)
一、WATCH命令介绍WATCH命令是一个乐观锁(optimistic locking)功能: 它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复演示案例以下是一个事务执行失败的例子: 在时间T4,客户端B修改了"name"键的值,当客户端A在T5执行EXEC命令时,服务器会发现WATCH监视的键"name"已经被修改,因此服务器拒绝执行客户端A原创 2020-11-09 16:10:06 · 364 阅读 · 0 评论 -
Redis(设计与实现):---事务之事务的实现(MULTI命令、EXEC命令)
事务功能Redis通过MULTI、EXEC、WATCH等命令来实现**事务(transaction)**功能事务的特性:事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求Redis事务不支持回滚机制,具体见ACID原子性:事务的错误处理:如果事务中的命令是在执行期间出现了错误,事务的后续命令也会继续执行下去,并且之前执行的命令也不会原创 2020-11-09 15:58:45 · 173 阅读 · 0 评论 -
Redis(设计与实现):---发布与订阅之查看订阅信息(PUBSUB CHANNELS/NUMSUB/NUMPAT命令)
PUBSUB命令是Redis 2.8新增加的命令之一,客户端可以通过这个命令来查看频道或者模式的相关信息,比如某个频道目前有多少订阅者,又或者某个模式目前有多少订阅者,诸如此类。PUBSUB命令是Redis 2.8新增加的命令之一,客户端可以通过这个命令来查看频道或者模式的相关信息,比如某个频道目前有多少订阅者,又或者某个模式目前有多少订阅者,诸如此类下面将分别介绍PUBSUB命令的三个子命令,以及这些子命令的实现原理一、PUBSUB CHANNELS命令功能:用于返回服务器当前被订阅的频道原创 2020-11-07 13:43:47 · 4831 阅读 · 5 评论 -
Redis(设计与实现):---发布与订阅之消息的发送(PUBLISH命令)
一、PUBLISH命令命令格式如下:PUBLISH <channel> <message>当一个客户端执行PUBLISH命令的时候,会将消息message发送给频道channelPUBLISH命令执行完之后,服务器需要执行以下两个动作:将消息message发送给channel频道的所有订阅者如果有一个或多个模式pattern与频道channel相匹配,那么将消息message发送给 pattern模式的订阅者二、将消息发送给频道订阅者因为服务器状态中的pubsu原创 2020-11-07 13:25:28 · 1134 阅读 · 0 评论 -
Redis(设计与实现):---发布与订阅之模式的订阅与退订(PSUBSCRIBE命令、PUNSUBSCRIBE命令、pubsub_patterns属性、struct pubsubPattern)
pubsub_patterns属性上一篇文章说过,服务器将所有频道的订阅关系都保存在服务器状态的pubsub_channels属性里面,与此类似,服务器也将所有模式的订阅关系都保存在服务器状态的pubsub_patterns属性里面:struct redisServer { // ... //保存所有模式订阅关系 list *pubsub_patterns; // ...};pubsub_patterns属性是一个链表,链表中的每个节点都包含着一个pubsu原创 2020-11-07 13:19:38 · 327 阅读 · 0 评论 -
Redis(设计与实现):---发布与订阅之频道的订阅与退订(SUBSCRIBE命令、UNSUBCRIBE命令、pubsub_channels属性)
pubsub_channels字典Redis将所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值则是一个链表,链表里面记录了所有订阅这个频道的客户端:struct redisServer { // ... //保存所有频道的订阅关系 dict *pubsub_channels; // ...};比如说,下图就展示了一个pubsub_channels字典示例,这个字典记录了以下信息:client-原创 2020-11-05 20:25:23 · 433 阅读 · 0 评论 -
Redis(设计与实现):---发布与订阅介绍
一、频道订阅(SUBSCRIBE、PUBLISH)通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的(subscriber)订阅者 :每当有其他客户端使用PUBLISH命令向被订阅的频道发送消息(message)时,频道的所有订阅者都会收到这条消息演示案例假设A、B、C三个客户端都执行了命令,那么这三个客户端就是"news.it"频道的订阅者,如下图所示:c SUBSCRIBE "news.it"如果这时某个客户端执行下面命令,向"news.it"频道发原创 2020-11-05 20:14:44 · 131 阅读 · 0 评论 -
Redis(设计与实现):60---集群之集群的消息(MEET、PING、PONG、FAIL、PUBLISH、struct clusterMsg)
集群的消息集群中的各个节点通过发送和接收消息(message)来进行通信,我们称发送消息的节点为发送者(sender,接收消息的节点为接收者(receiver),如下图所示节点发送的消息主要有以下五种:MEET消息: 当发送者接到客户端发送的CLUSTER MEET命令时,发送者会向接收者 发送MEET消息,请求接收者加入到发送者当前所处的集群里面PING消息: 集群里的每个节点默认每隔一秒钟就会从已知节点列表中随机选出五个节 点,然后对这五个节点中最长时间没有发送过PING消息的节点发送PI原创 2020-11-04 20:23:42 · 791 阅读 · 0 评论 -
Redis(设计与实现):---集群之集群的复制(CLUSTER REPLICATE命令、slaveof属性、REDIS_NODE_SLAVE标识、slaves属性、numslaves属性)
一、集群的复制Redis集群中的节点分为主节点(master)和从节点(slave):主节点用于处理槽从节点则用于复制某个主节点,并在被复制的主节点下线时,代替下线主节点继续处理命令请求二、复制的演示案例举个例子,对于包含7000、7001、7002、7003四个主节点的集群来说,我们可以将7004、7005两个节点添加到集群里面,并将这两个节点设定为节点7000的从节点,如下图所示(图中以双圆形表示主节点,单圆形表示从节点)下表记录了集群各个节点的当前状态,以及它们正在做的工作如果原创 2020-11-03 18:35:10 · 584 阅读 · 0 评论 -
Redis(设计与实现):---集群之ASK错误、ASKING命令、REDIS_ASKING标识
一、ASK错误在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存在目标节点 里面当客户端向源节点发送一个与数据库键有关的命令,并且命令要处理的数据库键恰好就属于正在被迁移的槽时:源节点会先在自己的数据库里面查找指定的键,如果找到的话,就直接执行客户端发送的命令(底层实现:如果节点收到一个关于键key的命令请求,并且键key所属的槽i正好就指派给了这个节点,那么节点会尝试在自己的数据库里查找键key,如果找原创 2020-11-03 18:13:06 · 1551 阅读 · 0 评论 -
Redis(设计与实现):---集群之重新分片(redis-trib软件、SETSLOT IMPORTING/MIGGATING、GETKEYSINSLOT、MIGRATE命令)
一、重新分片的概念Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点重新分片操作可以在线(online)进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求二、redis-trib软件Redis集群的重新分片操作是由Redis的集群管理软件redis-trib负责执行的,Redis提供了进行重新分片所需的所有命令,而redis-trib则通过向源节点和目标原创 2020-11-01 12:31:41 · 356 阅读 · 0 评论 -
Redis(设计与实现):---集群之节点数据库的实现(slots_to_keys跳跃表、CLUSTER GETKEYSINSLOT命令)
一、集群模式下与单机模式下数据库的异同相同点: 集群节点保存键值对以及键值对过期时间的方式,与前面文章介绍的单机Redis服务器保存键值对以及键值对过期时间的方式完全相同不同点: 节点只能使用0号数据库,而单机Redis服务器则没有这一限制二、图示举个例子,下图展示了节点7000的数据库状态,数据库中包含列表键"lst",哈希 键"book",以及字符串键"date",其中键"lst"和键"book"带有过期时间三、slots_to_keys跳跃表除了将键值对保存在数据库里面之外,节点还会原创 2020-11-01 12:21:14 · 494 阅读 · 0 评论 -
Redis(设计与实现):---集群之计算键所属槽(CLUSTER KEYLOST命令)、判断槽所属节点、MOVED错误
一、计算键所属槽(CLUSTER KEYLOST命令)使用的算法(CRC16语句)节点使用以下伪代码算法来计算给定键key属于哪个槽:def slot_number(key): return CRC16(key) & 16383 其中CRC16(key)语句用于计算键key的CRC-16校验和 ,而&16383语句则用于计算出一个介于0至16383之间的整数作为键key的槽号。CLUSTER KEYLOST命令使用“CLUSTER KEYSLOT 命令”可以查看原创 2020-10-30 18:04:27 · 562 阅读 · 0 评论 -
Redis(设计与实现):---集群之在集群中执行命令
一、在集群中执行命令在对数据库中的16384个槽都进行了指派之后,集群就会进入上线状态,这时客户端就可以向集群中的节点发送数据命令了二、判断执行键所属槽当客户端向节点发送与数据库键有关的命令时,接收命令的节点会计算出命令要处理的数据库键属于哪个槽, 并检查这个槽是否指派给了自己:如果键所在的槽正好就指派给了当前节点,那么节点直接执行这个命令如果键所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误, 指引客户端转向(redirect)至正确的节点,并再次发送之前想要执行的命原创 2020-10-30 17:46:41 · 154 阅读 · 0 评论 -
Redis(设计与实现):---集群之槽信息的记录(slots属性、numslot属性、CLUSTER ADDSLOTS命令的实现)
一、记录节点的槽指派信息(struct clusterNode)clusterNode结构见文章:传送门在此clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽:struct clusterNode { // ... unsigned char slots[16384/8]; int numslots; // ...};slots属性slots属性是一个二进制位数组(bit array),这个数组的长度为16384/8原创 2020-10-28 16:51:57 · 442 阅读 · 0 评论 -
Redis(设计与实现)---集群之槽介绍、槽分配(CLUSTER ADDSLOTS命令)
一、槽介绍Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽二、集群的上线、下线状态当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);相反地,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。例如,在前面的文章中我们使用CLUSTER MEET命令将7000、7001、7002三个节点连接到了同一个原创 2020-10-28 16:28:57 · 1447 阅读 · 1 评论 -
Redis(源码剖析):---集群之集群数据结构(clusterNode、clusterLink、clusterState、CLUSTER MEET命令的实现)
一、struct clusterNodeclusterNode结构保存了一个节点的当前状态,比如节点的创建时间、节点的名字、节点 当前的配置纪元、节点的IP地址和端口号等等每个节点都会使用一个clusterNode结构来记录自己的状态,并为集群中的所有其他节点(包括主节点和从节点)都创建一个相应的clusterNode结构,以此来记录其他节点的状态:struct clusterNode { //创建节点的时间 mstime_t ctime; //节点的名字,由40 个原创 2020-10-27 15:11:34 · 451 阅读 · 0 评论 -
Redis(设计与实现)---集群之集群节点、节点启动(CLUSTER MEET/NODE命令、cluster-enabled选项)
一、集群介绍Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能二、集群节点介绍一个Redis集群通常由多个节点(node)组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。节点的连接(CLUSTER MEET命令)连接各个节点的工作可以使用CLUSTER MEET命令来完成,该命令的格式如下:CL原创 2020-10-26 18:07:31 · 1883 阅读 · 0 评论 -
Redis(设计与实现):---Sentinel之接收服务器和从服务器的频道消息(SUBSCRIBE命令)
一、接收频道消息(SUBSCRIBE命令)当Sentinel与一个主服务器或者从服务器建立起订阅连接之后,Sentinel就会通过订阅连接,向服务器发送以下命令:SUBSCRIBE __sentinel__:helloSentinel对__sentinel__:hello频道的订阅会一直持续到Sentinel与服务器的连接断开为止。图示通过前一篇文章和上面的介绍,我们知道,对于每个与Sentinel连接的服务器,Sentinel既通过命令连接向服务器的 sentinel:hello频道发送原创 2020-10-24 15:16:55 · 408 阅读 · 1 评论 -
Redis(设计与实现)---Sentinel之向主服务器和从服务器发送频道消息(PUBLISHS命令)
一、发送频道消息(PUBLISHS命令)在默认情况下 ,Sentinel会以每两秒一次的频率, 通过命令连接向所有被监视的主服务器和从服务器发送以下格式的命令:PUBLISH __sentinel__:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"这条命令向服务器的__sentinel__:原创 2020-10-24 15:04:18 · 303 阅读 · 0 评论 -
Redis(设计与实现)---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)
一、获取主服务器信息Sentinel默认会以每十秒一次的频率, 通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息举个例子,假设如下图所示,主服务器master有三个从服务器slave0、slave1和 slave2,并且一个Sentinel正在连接主服务器,那么Sentinel将持续地向主服务器发送INFO命令,并获得类似于第2张图所以内容的回复:INFO命令回复的信息内容:通过分析主服务器返回的INFO命令回复,Sentinel可以获取以下两原创 2020-10-23 11:16:33 · 775 阅读 · 0 评论 -
Redis(设计与实现):---Sentinel之故障转移(SLAVEOF命令)
故障转移:在选举产生出领头Sentinel之后,领头Sentinel将对已下线的主服务器执行故障转移操作该操作包含下面3个步骤:①在已下线主服务器属下的所有从服务器里面,挑选出一个从服务 器并将其转换为主服务器②让已下线主服务器属下的所有从服务器改为复制新的主服务器③将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线 时,它就会成为新的主服务器的从服务器一、选出新的主服务器故障转移操作第一步要做的就是在已下线主服务器属下的所有从服务器中,挑选出一个状态良好、数据原创 2020-10-23 11:05:36 · 1144 阅读 · 0 评论 -
Redis(设计与实现):--->Sentinel之检测服务器、Sentinel下线状态(down-after-milliseconds、quorum、is-master-down-by-addr)
一、检测主观下线状态在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内)发送PING命令,并通过实例返回的PING命令回复来判断实例是否在线.图示下图展示的例子中,带箭头的连线显示了Sentinel1和Sentinel2是如何向实例发送PING命令的:Sentinel1将向Sentinel2、主服务器master、从服务器slave1和slave2发送PING命令.Sentinel2将向Sentinel1、主服务器mas原创 2020-10-19 18:53:19 · 1086 阅读 · 0 评论 -
Redis(设计与实现)--->选取领头Sentinel
小伙伴们大家好呀,一转又是两天过去了,你们比昨天更博学了吗?hhh,废话不多说,直接上正题。一、概念当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作。二、选举领头Sentinel的规则和方法1.所有在线的Sentinel都有被选为领头Sentinel的资格,换句话说,监视同一个主服务器的 多个在线Sentinel中的任意一个都有可能成为领头Sentinel2.每次进行领头原创 2020-10-19 18:44:21 · 237 阅读 · 0 评论 -
redis的五种基本数据类型及其内部实现详解
小伙伴们大家好呀,好久不见啦(十天没写博客呢。hh),最近没有偷懒哦,而是在学习Redis。 好了废话不多说,上干货吧!一、redis的五种数据类型redis作为目前最流行的Key-Value类型的内存数据库,对于数据库的操作都在内存中进行,并可定期的将数据异步的持久化到磁盘之上。由于是纯内存的操作,因此它的性能比普通的关系型数据库高出很多,同时由于是单线程串行的执行指令,因此也避免了加锁和释放锁的开销。相比于memcache,redis的每个value值最大可存储1GB,而memcache只有10原创 2020-10-16 11:56:28 · 763 阅读 · 0 评论