redis学习笔记
2023-11-01 14:40:06 0 举报
AI智能生成
redis学习笔记涉及redis命令,数据结构和集群
作者其他创作
大纲/内容
Redis是一个Key-Value的存储系统,使用ANSI C语言编写
String、List、Set、SortedSet、Hash
常见
Bitmap、Geo
不常见
Stream
v5.0新增
Key是字符串,value的数据类型有
Redis中命令忽略大小写,但是key不忽略大小写
简介
1. 用 : 分割
2. 把表名转换为key前缀
3. 第二段放置主键值
4. 第三段放置列名
key设计
字符串、整数、浮点数
Redis的String能表达3种值的类型
赋值
set key value
set
取值
get key
get
取值并赋值
getset key value
getset
当value不存在时赋值
setnx key value
setnx
向尾部追加值
append key value
append
获取字符串长度
strlen key
strlen
递增数字
incr key
incr
增加指定的整数
incrby key increment
incrby
递减数字
decr key
decr
减少指定的整数
decrby key decrement
decrby
常见操作
1. key/value是字符串
2. 普通的赋值
用于实现乐观锁watch
3. incr用于乐观锁
4. setnx用于分布式锁
应用场景
String字符串
可以存储有序、可重复的元素,个数最多为2^32-1个
获取头部或尾部附近的记录是极快的
从左侧插入列表
lpush key v1 v2 v3....
lpush
从左侧取出
lpop key
lpop
从右侧插入列表
rpush key v1 v2 v3.....
rpush
从右侧取出
rpop key
rpop
将值插入到列表头部
lpushx key value
lpushx
将值插入到列表尾部
rpushx key value
rpushx
从左侧取出,当列表为空时阻塞,可以设置最大阻塞时间(s)
blpop key timeout
blpop
从右侧取出,当列表为空时阻塞,可以设置最大阻塞时间(s)
brpop key timeout
brpop
获取列表中元素个数
llen key
llen
获取列表中下表为index的元素,从0开始
lindex key index
lindex
返回列表中指定区间的元素
lrange key start end
lrange
删除列表中与value相等的元素
从列表左侧开始删除
count > 0
从列表右侧开始删除
count < 0
删除所有值为value的元素
count = 0
lrem key count value
lrem
将列表index位置的元素设为value值
lset key index value
lset
对列表进行修剪,只保留start-end区间
end
start
key
ltrim key start end
ltrim
从key1列表右侧弹出并插入到key2列表左侧
rpoplpush key1 key2
rpoplpush
从key1列表右侧弹出并插入到key2列表左侧,会阻塞
brpoplpush key1 key2
brpoplpush
将value插入到列表,且位于值pivot之前或之后
linsert key BEFORE/AFTER pivot value
linsert
1. 作为栈或队列使用
2. 可用于各种列表
List列表
无序、唯一元素,集合中最大的成员数为2^32-1
为集合添加新成员
sadd key mem1 mem2
sadd
删除集合中指定成员
srem key mem1 mem2
srem
获得集合中所有元素
smembers key
smembers
返回集合中一个随机元素,并将该元素删除
spop key
spop
返回集合中一个随机元素,不会删除该元素
srandmember key
srandmember
获取集合中元素的数量
scard key
scard
判断元素是否在集合内
sismember key member
sismember
求多集合的交集
sinter key1 key2 key3
sinter
求多集合的差集
sdiff key1 key2 key3
sdiff
求多集合的并集
sunion key1 key2 key3
sunion
适用于不能重复且不需要顺序的数据结构
Set集合
元素本身是无序不重复的,每个元素关联一个分数,可按分数排序,分数可重复
为有序集合添加新成员
zadd key score1 member1 score2 member2 .....
zadd
删除有序集合中指定成员
zrem key mem1 mem2
zrem
获得有序集合中的元素数量
zcard key
zcard
zcount key min max
zcount
在集合的member分值上加increment
zincrby key increment member
zincrby
获得集合中member的分值
zscore key member
zscore
获得集合中member的排名(按分值从小到大)
zrank key member
zrank
获得集合中member的排名(按分值从大到小)
zrevrank key member
zrevrank
获得集合中指定区间成员,按分数递增排序
zrange key start end
zrange
获得集合中指定区间成员,按分数递减排序
zrevrange key start end
zrevrange
由于可以按照分值排序,所以适用于各种排行榜
SortedSet有序集合
Redis_Hash是一个String类型的field和value的映射表,它提供了字段和字段值的映射,每个hash可以存储2^32-1键值对
赋值,不区别新增或修改
hset key field value
hset
批量赋值
hmset field1 value1 field2 value2....
hmset
赋值,如果field存在则不操作
hsetnx key field value
hsetnx
查看某个field是否存在
hexists key field
hexists
获取一个字段值
hget key field
hget
获取多个字段值
hmget key field1 field2.....
hmget
获取所有字段值
hgetall key
hgetall
删除指定字段
hdel key field1 field2 ....
hdel
指定字段自增increment
hincrby key field increment
hincrby
获得字段数量
hlen key
hlen
对象的存储,表数据的映射
Hash散列表
用于进行位操作,通过一个bit位来表示某个元素对应的值或状态,其中key就是对应元素本身
Bitmap本身会极大的节省存储空间
设置key在offset处的bit值(0/1)
setbit key offset value
setbit
获取key在offset处的bit值
getbit key offset
getbit
获得key的bit位为1的个数
bitcount key
bitcount
返回第一个被设置为bit值的索引值
bitpos key value
bitpos
对多个key进行逻辑运算后存入destkey中
bitop [and/or/xor/not] destkey key [key......]
bitop
1. 用户每月签到,用户id为key,日期作为偏移量,1表示签到
2. 统计活跃用户,日期为key,用户id为偏移量,1表示活跃
3. 查询用户在线状态,日期为key,用户id为偏移量,1表示在线
Bitmap位图
geo是Redis用来处理位置信息的,在Redis3.2中正式使用,主要是利用了Z阶曲线、Base32编码和gethash算法
在X轴和Y轴上将十进制数转化为二进制数,采用X轴和Y轴对应的二进制数依次交叉后得到一个六位数编码,把数字从小到大依次连接起来的曲线称为Z阶曲线,是一种把多维转换成一维的方法
Z阶曲线
主要用来把二进制数据编码成可见的字符串
任意给定一个二进制数,以5个位(bit)为一组进行切分,对切分而成的每个组进行编码得到一个字符
Base32编码
是一种地理位置信息编码方法,经过Geohash映射后,地球上任意位置的经纬度坐标可以表示成一个较短的字符串,可以方便的存储在数据库中,附在邮件上,以及方便的使用在其他服务中
通过zset的score进行排序就可以得到坐标附近的其他元素
通过将score还原成坐标值就可以得到元素的原始坐标
Redis中经纬度使用52位的整数进行编码,放入zset中,在使用Redis进行Geo查询时,其内部对应的操作只是zset的操作
Geohash算法
概念
添加地理坐标
geoadd key 经度 纬度 成员名称1 经度1 纬度1 成员名称2 经度2 纬度2 ....
geoadd
返回标准的geohash串
geohash key 成员名称1 成员名称2....
geohash
返回成员经纬度
geopos key 成员名称1 成员名称2 ....
geopos
计算成员间距离
geodist key 成员1 成员2 单位
geodist
根据成员查找附近的成员
georadiusbymember key 成员 值单位 count 数 asc/desc
georadiusbymember
常用操作
1. 记录地理位置
2. 计算距离
3. 查找“附近的人”
Geo地理位置
Redis5.0后新增的数据结构,用于可持久化的消息队列
消息ID的序列化生成
消息遍历
消息阻塞和非阻塞读取
消息的分组消费
未完成消息的处理
消息队列监控
它几乎满足了消息队列具备的全部内容
每个Stream都有唯一的名称,就是Redis的key,首次使用xadd指令追加消息时自动创建
将指定消息数据追加到指定队列(key)中,*表示最新生成的id(当前时间+序列号)
xadd key id <*> field1 field2 ....
xadd
Count:读取条数
BLOCK:阻塞读(默认不阻塞)
key:队列名称
id:消息id
从消息队列中读取
xread [Count count] [BLOCK milliseconds] STREAMS key [key ....] ID [ID ....]
xread
读取队列中给定ID范围的消息COUNT:返回消息条数(id从小到大)
xrange key start end [COUNT]
xrevrange
删除队列的消息
xdel key id
xdel
创建一个新的消费组
xgroup create key groupname id
删除指定消费组
xgroup destroy key groupname
删除指定消费组中的某个消费者
xgroup delconsumer key groupname cname
修改指定消息的最大id
xgroup setid key id
从队列中的消费组中创建消费者并消费数据(consumer不存在则创建)
xreadgroup group groupname consumer COUNT streams key
xreadgroup
xgroup
消息队列
Stream数据流
类型
String
List
Map(hash)
Set
Sorted-Set
Value(RedisObject)
Key
DB(RedisDB)
Redis没有表的概念,Redis实例所对应的db以编号区分,db本身就是Key的命名空间
实例
结构
Redis中存在数据库概念,该结构由redis.h中的redisDb定义
redis服务器初始化时,会预先分配16个数据库,所有数据库保存到结构redisServer的一个成员redisServer.db数组中
redisClient中存在一个名叫db的指针指向当前使用的数据库
id:数据库库号,为0-15
dict:存储数据库所有的key-value
expires:存储key的过期时间
redisDb
RedisDB
是一个对象,包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象
表示对象的类型,占4位
REDIS_STRING、REDIS_LIST、REDIS_HASH、REDIS_SET、REDIS_ZSET
执行type命令时,就是通过读取RedisObject的type字段获得对象的类型
type(4位)
表示对象的内部编码,占4位
每个对象有不同的实现编码,Redis可以跟不同不同的使用场景来为对象设置不同的编码,大大提高了Redis的灵活性和效率
通过object encoding命令,可以查看对象采用的编码方式
encoding(4位)
记录的是对象最后一次被命令程序访问的时间(v4.0占24位,v2.6占22位)
高16位存储一个分钟数级别的时间戳,低8位存储访问计数
LRU(24位)
记录的是该对象被引用的次数,类型为整型
refcount>1,称为共享对象
主要用于对象的引用次数和内存回收
Redis为了节省内存,当有一些对象重复出现时,新的程序不会创建新对象,而是仍然使用原来的对象
refcount
指向具体的数据
ptr
RedisObject
Redis使用SDS(Simple_Dynamic_String),用于存储字符串和整型数据
1. SDS在C字符串基础上加入了free和len字段,获取字符串长度:SDS是O(1),C字符串是O(n)
2. SDS由于记录了长度,在可能造成缓冲区溢出时会自动重新分配内存,杜绝了缓存区溢出
3. 可以存取二进制数据,以字符串长度len来作为结束标识
优势
主要用于存储字符串和整型数据、存储key、AOF缓冲区和用户输入缓冲
场景
字符串对象
它是有序集合的底层实现,效率高,实现简单
将有序链表中的部分节点分层,每一层都是一个有序链表
基本思想
查找时优先从最高层开始向后查找,当到达某个节点时,如果next节点值大于要查找的值或next指针指向null,则从当前节点下降一层继续向后查找
查找
正面:插入上层
背面:不插入
通过抛硬币(概率1/2)的方式来决定新插入节点跨越的层数
插入
找到指定元素并删除每层的改元素即可
删除
每层都是一个有序链表,查找次数近似于层数
底层包含所有元素
空间复杂度O(n)扩充了一倍
特点
1. 可以快速查找到需要的节点
2. 可以在O(1)的时间复杂度下,快速获得跳跃表的头节点、尾节点、长度和高度
有序集合的实现
跳跃表
字典dict又称散列表(hash),是用来存储键值对的一种数据结构
Redis整个数据库使用字典来存储的
对Redis进行CRUD操作其实就是对字典中的数据进行CRUD操作
用来存储数据的容器,采用头指针+偏移量的方式能够以O(1)的时间复杂度定位到数据所在的内存地址
数组
作用是把任意长度的输入通过散列算法转换成固定类型、固定长度的散列值
Hash函数可以把Redis里的key:包括字符串、整数、浮点数统一转换成整数
Hash函数
= hash(key) % 数组容量 (hash值 % 数组容量得到的余数)
数组下标
不同的key经过计算后出现数组下标一致,称为Hash冲突
采用单链表在相同的下标位置处存储原始Key/Value
当根据Key查找Value时,找到数组下标,遍历单链表可以找出Key相同的value
hash冲突
包括字典(dict)、Hash表(dictht)、Hash表节点(dictEntity)
type字段指向dictType结构体,里边包括了对该字典操作的函数指针,是为了实现各种形态的字典而抽象出来的操作函数(多态)
Redis字典除了主数据库的K-V数据存储之外,还可以用于:散列表对象、哨兵模式中的主从节点管理等,不同应用中,字典的形态都可能不同
Dict字典
1. hash表的数组初始容量为4,随着k-v存储量的增加需要对hash表数组进行扩容,新扩容量为当前量的一倍
2. 索引值 = Hash值 & 掩码值(Hash值与Hash表容量取余)
Hash表
Key字段存储的是键值对中的键
v字段是个联合体,存储的是键值对中的值
next指向下一个哈希表节点,用于解决hash冲突
Hash表节点
实现
字典达到存储上限,需要rehash(扩容)
申请新内存 -> 地址赋给h[1] -> rehashidx=0 -> h[1]=h[0](索引重新计算)
流程
1. 初次申请默认容量为4个dictEntry,非初次申请为当前hash表容量的一倍
2. rehashidx=0标识要进行rehash操作
3. 新增加的数据在新的hash表h[1]
4. 修改、删除、查询在老hash表h[0]、新hash表h[1]中(rehash中)
5. 将老的hash表h[0]的数据重新计算索引值后全部迁移到新的hash表h[1]中,这个过程称为rehash
说明
当数据量巨大时rehash的过程是非常缓慢的,所以需要进行优化
服务器忙则只对一个节点进行rehash,闲时可批量rehash(100节点)
渐进式rehash
1. 主数据库的K-V数据存储
2. 散列表对象(hash)
3. 哨兵模式中的主从节点管理
扩容
字典
ziplist是由一系列特殊编码的连续内存块组成的顺序型数据结构
是一个字节数组,可以包含多个节点(entry),每个节点可以保存一个字节数组或一个整数
zlbytes:压缩列表的字节长度
zltail:压缩列表为元素相对于压缩列表起使地址的偏移量
zllen:压缩列表的元素个数
entry1.....entryX:压缩列表的各个节点
zlend:压缩列表的结尾,占一个字节,恒为0xFF
数据结构
previous_entry_length:前一个元素的字节长度
encoding:表示当前元素的编码
content:数据内容
entryX编码结构
sorted-set和hash元素个数少且是小整数或短字符串
直接使用
list用快速链表数据结构存储,而快速链表是双向列表和压缩列表的组合
间接使用
压缩列表
intset是一个有序的(整数升序)、存储整数的连续存储结构
当Redis集合类型的元素都是整数并且都处在64位有符号整数范围内(2^64),使用该结构体存储
可以保存类型为int16_t、int32_t或int64_t的整数值,并且保证集合中不会出现重复元素
整数集合
quicklist是Redis底层重要的数据结构,是列表的底层实现
Redis3.2之前,Redis采用双向链表(adlist)和压缩列表(ziplist)实现,Redis3.2以后结合两者的优势设计出了quicklist
1. 双向:链表具有前置节点和后置节点的引用,获取这两个节点时间复杂度都是O(1)
2. 普通链表(单链表):节点类保留下一节点的引用,链表类只保留头节点的引用,只能从头节点插入删除
3. 无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问都是以NULL结束
4. 带链表长度计数器:通过len属性获取链表长度的时间复杂度为O(1)
5. 多态:链表节点使用void*指针来保存节点值,可以保存各种不同类型的值
双向列表
是一个双向链表,链表中每个节点都是一个ziplist结构(每个节点都能够存储多个数据元素)
快速列表
quicklit每个节点的实际数据存储结构为ziplist,这种结构优势在于节省存储空间
为了进一步降低ziplist的存储空间,还可以对ziplist进行压缩
Redis采用的压缩算法是LZF,其基本思想是:数据与前面重复的记录重复位置及长度,不重复的记录原始数据
压缩过的数据可以分为多个片段,每个片段有:解释字段和数据字段
数据压缩
列表的底层实现、发布与订阅、慢查询、监视器等功能
stream主要由:消息、生产者、消费者和消费组构成
Redis Strean底层主要使用了listpack(紧凑列表)和Rax树(基数树)
表示一个字符串列表的序列化,可用于存储字符串或整数,用于存储stream的消息内容
listpack
是一个有序字典树,按照key的字典排序,支持快速定义、插入和删除操作
被用在Redis_Stream结构内存储消息队列,在Stream里面消息ID的前缀是时间戳+序号,这样的消息可以理解为时间序列消息
使用Rax结构进行存储就可以快速地根据消息ID定位到具体的消息,然后继续遍历指定消息后的所有消息
Rax树
stream的底层实现
流对象
Type
Redis通过encoding属性为对象设置不同的编码
对于少而小的数据,Redis采用小的和压缩的存储方式,体现了Redis的灵活性,大大提高了Redis的存储量和执行效率
REDIS_ENCODING_INT
int
简单动态字符串
大字符串,长度大于44字节
REDIS_ENCODING_RAW
RAW
编码的简单动态字符串
小字符串,长度小于44字节
REDIS_ENCODING_EMBSTR
embstr
REDIS_ENCODING_QUICKLIST
quicklist
list
当散列表元素的个数较多或元素不是小整数或短字符串时
REDIS_ENCODING_HT
dict
hash
当Redis集合类型元素都是整数且都处于64位有符号整数范围内
REDIS_ENCODING_INTSET
intset
当Redis集合类型元素都是整数且都处于64位有符号整数外
当元素个数较少,且元素都是小整数或短字符串时
REDIS_ENCODING_ZIPLIST
ziplist
当元素个数较多或元素不是小整数或短字符串时
REDIS_ENCODING_SKIPLIST
skiplist + dict
zset
encoding
底层数据结构
Redis长期使用,key不断增加,Redis作为缓存使用,物理内存会占满,内存开始与硬盘交换(swap),频繁IO下性能急剧下降
Redis作为缓存使用,不断增加Key
maxmemory默认为0,不限制,造成:超过物理内存后性能急剧下降,甚至崩溃
一个Redis实例,保证系统运行1G,剩下的就都可以设置Redis
一般来说物理内存的3/4
设置后,当趋近maxmemory时,通过缓存淘汰策略,从内存中删除对象
设置的场景
maxmemory 1024mb
redis.conf
CONFIG GET maxmemory
shell
设置
maxmemory
解决
Redis的key是固定的,不会增加
Redis作为DB使用,保证数据完整性,不能淘汰,可以做集群,横向扩展
缓存淘汰策略:禁止驱逐(默认)
不设置的场景
Redis中可以使用expire命令设置一个键的存活时间,过了这段时间,改键就会自动被删除
设置失效时间
expire key ttl (单位:s)
查看剩余失效时间,-2表示失效
ttl key
命令
redisDb结构体定义了一个expires字典,用于维护一个Redis数据库中设置了失效时间的键
当使用expire命令设置key的失效时间时,Redis首先到dict字典表中查找要设置的key是否存在,如果存在则添加对应映射到expires
使用setex命令插入数据时,Redis首先将key/value添加到dict字典表中,然后将key/expire添加到expires中
原理
expire
Redis数据删除有定时删除、惰性删除和主动删除三种,目前采用惰性+主动的方式
在设置键的过期时间同时,创建一个定时器,让定时器在键过期时间来临时,立即执行对键的删除操作
需要创建定时器,且消耗CPU,一般不推荐
定时删除
在key被访问时,如果发现它已经失效,则删除它
惰性删除
maxmemory-policy allkeys-lru
redis.conf可以配置主动删除策略,默认是no-enviction(不删除)
最近最少使用算法,根据数据的历史访问记录来进行淘汰数据
如果数据最近被访问过,那么将来被访问的几率也更高
核心思想
1. 新数据插入到链表头部
2. 每当缓存命中(缓存数据被访问),则将数据移到链表头部
3. 当链表满时,将链表尾部的数据丢弃
4. 在Java中可以用LinkHashMap实现
最常见的实现是使用一个链表保存缓存数据
在服务器配置中保存了LRU计数器server.lrulock,会定时更新,该值根据server.unixtime计算出来
另外,每一个redis对象都会设置相应的lru,每次访问数据时,会更新redisObject.lru
在数据集中随机挑选几个键值对,取出其中lru最大的键值对淘汰
不会遍历key
淘汰机制
从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-lru
从数据集中挑选最近最少使用的数据淘汰
allkeys-lru
两种策略
Redis的LRU
LRU (Least Recently used)
最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小
volatile-lfu
allkeys-lfu
LFU (Least frequently used)
从已设置过期时间的数据集中任意选择数据淘汰
volatile-random
从数据集中任意选择数据淘汰
allkeys-random
策略
Random
从过期时间表中随机挑选几个键值对,取出其中ttl最小的键值对淘汰
从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-ttl
ttl
禁止驱逐数据,默认
noenviction
主动删除
在不确定时一般采用的策略
比allkeys-lru性能差
希望请求符合平均分布
自己控制,防止缓存穿透
策略选择
删除策略
缓存过期/淘汰策略
会阻塞Redis服务器进程,知道RDB文件创建完毕,在创建期间Reids服务器不能接受任何请求
SVAE
BGSAVE会派生出一个子进程然后由子进程负责创建RDB文件
在BGSAVE执行的时候,不允许再执行SAVE、BGSAVE等指令
BGSAVE
serverCron函数默认每个100ms执行一次,该函数会对正在运行的服务器进行维护,它的其中一项工作就是坚持server选项所设置的保存条件是否已经满足,满足就会自行BGSAVE
使用dirty属性记录自上次save之后数据库中数据的修改次数,lastsave记录上次成功执行save命令的时间
自动save的触发
save条件
自动save
创建
会在Redis服务器启动时自动执行,如果检测到RDB文件存在,就会自动载入
并且如果开启了AOF持久化,会优先使用AOF来还原数据库
载入
创建与载入
RDB持久化
aof_buf
命令追加
Redis的服务器进程就是一个事件循环( loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时运行的函数.
因为服务器在处理文件事件时可能会执行写命令,使得一些内容被追加到aof_buf缓冲区里面,所以在服务器每次结束一个事件循环之前,它都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF 文件里面,这个过程可以用以下伪代码表示:
文件写入
文件同步
AOF实现原理
将多个命令整合进一个命令
为了解决由子进程执行重写导致的数据库状态不一致情况,设置了一个AOF重写缓冲区
BGREWRITEAOF
AOF重写
AOF文件的载入与数据还原
AOF持久化
持久化
使用SLAVEOF命令让一个服务器去复制另一个服务器,被复制的是主服务器,进行复制的是从服务器
适用于第一次进行数据库复制或者更改复制的主数据库,将数据库整体复制,较为花时间
完整重同步(SYNC)
适用于从服务器断线之后重连的情况,只复制断开期间执行的命令
部分重同步(PSYNC)
同步
适用于主从服务器的数据库状态一致后,对主服务器执行的命令发送到从服务器
命令传播
复制的方法
主从服务器都维护一个复制偏移量,记录当前执行命令的字节数,在主服务器执行命令、从服务器复制的时候更
可以记录从服务器相较于主服务器缺少的命令有多少
复制偏移量
默认为1M的固定长度先进先出队列
在服务传播的时候,会记录传播的命令。这样如果主从服务器复制偏移量之差小于1M的情况下,只需要将缺少的命令从缓冲区复制到从服务器即可,不用完整重同步
复制积压缓冲区
每个服务器开启时都有一个随机的ID,从服务器会记录主服务器的ID。断线重连的时候会带上之前的主服务器ID,如果主服务器ID与接收到的ID一致,就可以确定发送方是从服务器,然后根据复制偏移量之差决定是否采用部分重同步。
服务器运行ID
1.设置主服务器的地址和端
2.建立套接字连接
3.发送PING命令
4.身份验证(masterauth密码验证)
5.发送端口信息
6.同步
7.命令传播
复制的实现
部分重同步的实现
在命令传播阶段,从服务器会以每秒一次的频率向主服务器发送命令
主从服务器可以通过发送和接收REPLCONF ACK命令来检查两者之间的网络连接是否正常:如果主服务器超过一秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道主从服务器之间的连接出现问题了。
检测主从服务器的网络连接状态
辅助实现min-slaves配置选项
检测命令丢失
心跳检测
复制
redis数据结构
redis
0 条评论
下一页