我的感觉这种技术虽然很感兴趣GET/SET LFU缓存,但不适用与redis性质的数据服务器:用户期望keys被创建后至少存在几毫秒。拒绝key的创建似乎在redis上就是一种错误。...3.3、事件 redis服务器是一个事件驱动程序。 需要处理两类事件: 1)文件事件:redis是通过套接字与客户端或者其他服务器连接的,而文件事件就是服务器对套接字操作的抽象。...,当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件...套接字就会产生 AE_READABLE 事件, 引发连接应答处理器执行, 并执行相应的套接字应答操作。...并且因为 Sentinel 需要与多个实例创建多个网络连接, 所以 Sentinel 使用的是异步连接。 接下来介绍 Sentinel 如何通过命令连接和订阅连接与被监视主服务器进行通讯。
ae.AE_WRITABLE:客户端对套接字执行read操作,对服务端来说套接字有可写事件。...请求过程模拟: redis启动,处于服务状态,监听套接字; 客户端发起连接,服务端监听到对应的READABLE事件,通过acceptTcpHandler处理连接; 客户端发起命令,服务端监听到对应的...主服务器accept后,得到对应的cfd 从服务器向主服务器发送ping,用于检查套接字连接是否正常,以及数据传输是否正常。...如果归自己,就返回数据,如果不归自己管,就返回一个MOVED错误(该错误其实不算错误,只是一个操作),该错误会永久改变客户端的连接到正确的槽归属节点上,随后正确的节点会返回数据。...、ASKING redis-trib可以实现槽的迁移,如果客户端访问了正在迁移过程中的槽,服务端就会返回给客户端ASK错误(该错误也不算一个错误,只是一个操作),该错误会改变本次请求到正确的槽归属节点上
连接设置:如客户端连接超时时间、是否开启 TCP keepalive 等。 通信协议设置:如 TCP listen() 函数的等待队列长度、Unix 套接字文件路径等。...套接字文件路径 unixsocketperm 700 # Unix 套接字文件的权限 glueoutputbuf yes # 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启 hash-max-zipmap-entries...SELECT 命令在连接上指定数据库id 2.5 快照配置项 save #指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 Redis默认配置文件中提供了三个条件...因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。...redis/redis.sock # Unix 套接字文件路径 unixsocketperm 700 # Unix 套接字文件的权限 # 通用配置项 loglevel notice
您可以配置一个副本实例来接受或不接受写操作。写副本实例对于存储一些临时数据可能很有用(因为写在副本上的数据在与主服务器重新同步后很容易删除),但是如果客户端由于配置错误而写副本,也可能会导致问题。...使用“renmin -command”隐藏所有管理/危险命令,可以在一定程度上提高只读副本的安全性。 复制同步策略:磁盘或套接字。...2)无磁盘:Redis master创建一个新的进程,直接将RDB文件写入副本套接字,而不需要接触磁盘。...一定要确保此值大于repl-ping-replica-period指定的值,否则每当主服务器和副本之间的流量较低时,就会检测到超时。 同步后在复制套接字上禁用TCP_NODELAY ?...该信息可用的另一个地方是master的“ROLE”命令的输出。 副本通常报告的所列IP和地址通过以下方式获取: IP:通过检查副本与主连接使用的套接字的对等地址来自动检测地址。
先写入AOF缓冲区,Redis可以提供多种AOF缓冲区同步硬盘策略,在性能和安全性上作出平衡。...主服务器先把数据写到客户端输出缓冲区中,然后再把客户端输出缓冲区里的数据写到客户端套接字中,最后通过网络连接发送给客户端。...步骤二:建立套接字连接从服务器根据设置的IP和端口,创建连向主服务器的套接字连接。如果从服务器创建的套接字能连向主服务器,那么从服务器将为该套接字关联复制处理器。...每个SentinelRedisInstance结构代表一个被Sentinel监控的Redis服务器实例,可以是主服务器、从服务器或者另一个Sentinel服务器。...无论哪种编程语言的客户端,如果需要正确连接Redis Sentinel,必须要有Sentinel节点集合和masterName。而在此基础上,实现一个Redis Sentinel客户端的具体步骤如下。
写反对副本实例可能有助于存储一些临时数据(因为数据写在副本上的在与主服务器重新同步后很容易被删除)但是 # 如果客户端因为一个原因而写入它,也可能会导致问题错误配置。...# RDB无磁盘加载+ Redis模块不处理I/O读也可以在与master的初始同步阶段,如果出现I/O错误,Redis将中止。只有当你在做你正在做的事情时才使用。...# 然而,直接从套接字解析RDB文件可能意味着我们必须在接收到完整的RDB之前刷新当前数据库的内容。...# # repl-timeout 60 # 在复制套接字同步后禁用TCP_NODELAY ? # # 如果选择“yes”,Redis将使用更少的TCP包和更少的带宽来发送数据到副本。...# 优先级低的副本被认为更有利于提升,例如,如果有三个优先级为10,100,25的副本,Sentinel将选择优先级为10的副本,这是最低的。
为什么用Redis? 一个字,快!传统的关系型数据库如 Mysql 等已经不能适用所有的场景了,比如在高并发,访问流量高峰等情况时,数据库很容易崩了。...当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息 maxclients 128 # 指定Redis最大内存限制,Redis...因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。...当一个slave从一个错误的master那里同步数据时开始,直到slave被纠正为从正确的master那里同步数据时结束。 ## 3. 当想要取消一个正在进行的failover时所需要的时间。...需要注意的是,主从切换后配置文件已经被自动进行了更改,我们现在看一下新上位的主机 redis 日志,如下 可以看到,当主机挂了的时候,一直连接主机被拒绝,当哨兵选举它为主机后,它成功执行重写的配置文件
套接字:socket 连接,也就是客户端连接。当一个套接字准备好执行连接、写入、读取、关闭等操作时, 就会产生一个相应的文件事件。...负责监听多个套接字,当套接字产生事件时,会向文件事件分派器传送那些产生了事件的套接字。...当多个文件事件并发出现时, I/O 多路复用程序会将所有产生事件的套接字都放到一个队列里面,然后通过这个队列,以有序、同步、每次一个套接字的方式向文件事件分派器传送套接字:当上一个套接字产生的事件被处理完毕之后...2)建立套接字(socket)连接 slave 将根据指定的 IP 地址和端口,向 master 发起套接字(socket)连接,master 在接受(accept) slave 的套接字连接之后,为该套接字创建相应的客户端状态...以部分重同步为例,主从复制的核心步骤流程图如下: 25、哨兵 哨兵(Sentinel) 是 Redis 的高可用性解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器
flag O:客户端是MONITOR模式 P:客户端是Pub/Sub的订阅者 r:客户端是针对集群节点的只读模式 S:客户端连接到此实例的从节点 u:客户端未阻塞 U:客户端通过Unix套接字连接 x:...客户端正在执行事务 文件描述符事件包括: r:客户端套接字可读 w:客户端套接字可写 CLIENT PAUSE 最早可用版本:2.9.50 时间复杂度:O(1) 这个命令可以使所有连接暂停一段时间(单位...这个命令通常用来将连接从一个Redis实例迁移到另一个实例,例如当一个实例需要进行系统升级时,我们应该这样做: 使用CLIENT PAUSE暂停所有客户端 等待几秒钟,以便从节点与主节点数据同步完成 将一个从节点切换成主节点...如果设置为ERROR,那么,被强制解除阻塞的连接会返回一个-UNBLOCKED错误。...,可以是connect(需要与主节点连接),connecting(正在连接),sync(尝试进行主从同步),connected(从节点在线);第五行是从节点收到的数据量 对于sentinel 1) "sentinel
部分重同步 从 Redis 2.8 开始, 在网络连接短暂性失效之后, 主从服务器可以尝试继续执行原有的复制进程(process), 而不一定要执行完整重同步操作。...客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。...每当一个 Redis 实例被重新配置(reconfigured) —— 无论是被设置成主服务器、从服务器、又或者被设置成其他主服务器的从服务器 —— Sentinel 都会向被重新配置的实例发送一个 CONFIG...主服务器或从服务器的机器上运行 Redis Sentinel 进程。...不过, 在以上这些条件满足之后, Sentinel 在对实例进行重新配置之前仍然会等待一段足够长的时间, 确保可以接收到其他 Sentinel 发来的配置更新, 从而避免自身因为保存了过期的配置而对实例进行了不必要的重新配置
注意:从服务器可以在主从服务器之间的连接断开时进行自动重连, 在 Redis 2.8 版本之前, 断线之后重连的从服务器总要执行一次完整重同步(full resynchronization)操作, 但是从...只读从服务器会拒绝执行任何写命令, 所以不会出现因为操作失误而将数据不小心写入到了从服务器的情况。...你可能会感到好奇, 既然从服务器上的写数据会被重同步数据覆盖, 也可能在从服务器重启时丢失, 那么为什么要让一个从服务器变得可写呢?...Sentinel 集群通过命令连接向被监视的主从服务器发送 hello 信息 (每秒一次),该信息包括 Sentinel 本身的 IP、端口、id 等内容,以此来向其他 Sentinel 宣告自己的存在...Sentinel 集群使用 ping 命令来检测实例的状态,如果在指定的时间内(down-after-milliseconds)没有回复或则返回错误的回复,那么该实例被判为下线。
操作演示: 6.5> WATCH(v2.2.0) 官方文档: http://www.redis.cn/commands/watch.html 指令格式:WATCH 标记所有指定的key被监视起来,在事务中有条件的执行...12.2.1> 非阻塞I/O 当我们启动一个客户端时,客户端于服务端建立连接,并通过套接字Socket来处理他们之间的请求。...比如我们执行了get muse指令,执行过程如下所示: 步骤1:服务端要先监听客户端的请求——listen; 步骤2:客户端请求发过来的时候与其建立连接——accept; 步骤3:紧接着服务端需要从套接字...文件事件处理器是由套接字,I/O多路复用程序,文件事件分派器,事件处理器构成的。 I/O多路复用程序(epoll / kqueue / select......,依据操作系统的不同,会采用不同的函数,Linux 使用的是 epoll,Mac OS 则是 kqueue)会监听多个套接字,每当一个套接字准备执行应答,读写,关闭等操作时,就会产生对应的文件事件,这些事件会存储到一个事件队列中
再加上上一条问题,导致redis如果在做扩容,原先已经失效的索引仍然存在,并且之后对这个key一定每次都会收到MOVED消息,然后每次都重新创建redis context和新连接,并覆盖原先的连接,并且覆盖先没有释放前一个...Redis-Cluster适配设计 Redis-Cluster环境条件 因为Slot只有16384(16K)个,即便把所有的Slot按Index放在数组里缓存也不会消耗太大的内存,并且这样查找是O(1)...> ASK跳转还有一个特别的步骤是客户端先要发送一个ASKING命令,然后再重发这次的命令,不然处于导入转态的槽会被拒绝访问 > 在重新分片过程中的多个键值操作核能导致TRYAGAIN错误,这时候需要尝试重发命令...限制了最大重定向次数,防止重定向死循环 按需连接的时候,如果出现超时、连接被拒绝、连接失败的错误0.1秒后重试 如果按slot查找连接没找到,则会返回一个随机的连接,然后根据ASK或者MOVED跳转来处理...流程图如下: image.png Sentinel适配设计 设计思路 Sentinel比较简单,大体上和Cluster一致,有几个不一样的地方如下: 第一次连接的是Sentinel节点而不是数据节点
2) 当RDB文件创建完毕,主服务器会通过套接字将RDB文件传送给从服务器。...4.1.4、无须硬盘的复制 主服务器在进行完整同步的时候,需要在本地创建RDB文件,然后通过套接字将这个RDB文件传送给从服务器。...,而是会派生出一个子进程,然后由子进程通过套接字直接将RDB文件写入从服务器。...将Sentinel和被监视的服务器放到不同机器上运行 用户应该将Sentinel和被监视的Redis服务器放到不同的机器上运行,并且各个Sentinel也应该放到不同的机器上运行,这样Sentinel网络才能够更准确...相反,如果一部分Sentinel与被监视主服务器的网络连接情况较差,或者两者在网络上的距离较远,那么这些Sentinel对于主服务器的下线判断的准确性就会差一些,如果把它们的quorum值设置得太小,可能会错误地触发故障转移操作
因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no appendonly no 19....由于Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。 redis命令 Redis 命令用于在 redis 服务上执行操作。...' 127.0.0.1:6379> ping QUEUED 127.0.0.1:6379> exec //redis无情的拒绝了事务的执行,原因是“之前出现了错误” (error) EXECABORT...在redis2.8版本之前,如果从服务器与主服务器因某些原因断开连接的话,都会进行一次主从之间的全量的数据同步;而在2.8版本之后,redis支持了效率更高的增量同步策略,这大大降低了连接断开的恢复成本...三台均测试无误,主从同步部署完成 配置哨兵模式 1.每台机器上修改redis主配置文件redis.conf文件设置:bind 0.0.0.0 ---配置主从时已经完成 2.每台机器上修改sentinel.conf
非精准的 LRU - 实际上 Redis 实现的 LRU 并不是可靠的 LRU,也就是名义上我们使用 LRU 算法淘汰键,但是实际上被淘汰的键并不一定是真正的最久没用的。 6.2....WATCH 使得 EXEC 命令需要有条件地执行:事务只能在所有被监视键都没有被修改的前提下执行,如果这个前提不能满足的话,事务就不会被执行。 WATCH 命令可以被调用多次。...Redis 不支持回滚 Redis 不支持回滚的理由: Redis 命令只会因为错误的语法而失败,或是命令用在了错误类型的键上面。...文件事件 服务器通过套接字与客户端或者其它服务器进行通信,文件事件就是对套接字操作的抽象。...Redis 基于 Reactor 模式开发了自己的网络时间处理器,使用 I/O 多路复用程序来同时监听多个套接字,并将到达的时间传送给文件事件分派器,分派器会根据套接字产生的事件类型调用响应的时间处理器
事实上 SYNC 是一个旧协议,在新的 Redis 实例中已经不再被使用,但是其仍然向后兼容:但它不允许部分重同步,所以现在 PSYNC 被用来替代 SYNC。...重新启动和故障转移后的部分重同步 从 Redis 4.0 开始,当一个实例在故障转移后被提升为 master 时,它仍然能够与旧 master 的 slaves 进行部分重同步。...客观下线条件只适用于主服务器:对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。...每当一个 Redis 实例被重新配置(reconfigured) —— 无论是被设置成主服务器、从服务器、又或者被设置成其他主服务器的从服务器 —— Sentinel 都会向被重新配置的实例发送一个 CONFIG...注意:Redis 集群可能会在将来提供同步写的方法。Redis 集群另外一种可能会丢失命令的情况是集群出现了网络分区, 并且一个客户端与至少包括一个主节点在内的少数实例被孤立。
虽然 Redis 哨兵有一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel...客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。...每当一个 Redis 实例被重新配置(reconfigured) —— 无论是被设置成主服务器、从服务器、又或者被设置成其他主服务器的从服务器 —— Sentinel 都会向被重新配置的实例发送一个 CONFIG...主服务器或从服务器的机器上运行 Redis Sentinel 进程。...那些连接了错误主服务器的从服务器会被重新配置, 使得这些从服务器会去复制正确的主服务器。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。...哨兵模式 sentinal:哨兵,它是redis集群中非常重要的一个组件,主要功能如下: 集群监控,负责监控redis master和slave进程是否正常工作 消息通知,如果某个redis实例有故障,...另一方面, 如果条件达不到 min-slaves-to-write 和 min-slaves-max-lag 所指定的条件, 那么写操作就不会被执行, 主服务器会向请求执行写操作的客户端返回一个错误。...宕机后损失的数据太多了,那么就拒绝写请求,这样可以把master宕机时由于部分数据未同步到slave导致的数据丢失降低的可控范围内 减少脑裂的数据丢失 如果一个master出现了脑裂,跟其他slave...上,比如故障转移之后,那么哨兵会确保它们连接到正确的master上 slave->master选举算法 如果一个master被认为odown了,而且majority哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作
Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵。...消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。...脑裂导致的数据丢失 脑裂,也就是说,某个 master 所在机器突然脱离了正常的网络,跟其他 slave 机器不能连接,但是实际上 master 还运行着。...ack 消息,那么就直接拒绝客户端的写请求。...连接到了一个错误的 master 上,比如故障转移之后,那么哨兵会确保它们连接到正确的 master 上。