Redis_草稿图_1
2024-04-23 20:00:18 4 举报
Redis_草稿图_1是一个描述Redis数据库核心概念和特性的设计图。Redis是一个开源的高性能键值存储系统,主要用于处理大量数据缓存、消息队列、任务队列等任务。草稿图包含了Redis的基本结构,如内存数据库、非阻塞I/O、网络框架等。同时,图还详细解释了Redis的数据类型,如字符串、散列、列表、集合等,及其特性。此外,图中还标注了Redis的持久化策略,如AOF日志和RDB快照,以及它们的优劣势。这张草稿图对于理解Redis的工作原理和数据结构非常有帮助。
作者其他创作
大纲/内容
v1
读策略
命令
RDB
AOF
启动优先级
低
高
体积
小
大
恢复速度
快
慢
数据安全性
容易丢数据
根据策略决定
intset
encodingINTSET_ENC_INT64
length4
contents
master
线程2
删除缓存
k1
dictEntry
NULL
返回键key的值
1
embstr编码创建的内存块结构
k3=4
数据库
ht[0]
web1
HashObject
StringObject\"name\"
StringObject\"author\"
StringObject\"publisher\"
1.连接断开
主服务器
服务器向客户端发送命令回复
2
011
用户
3.重新来凝结到master,建立的是socket长连接
MySQL
'R'
'e'
'd'
'i'
's'
' '
'C'
'l'
'u'
't'
'r'
'\\0'
...
dictht
table
size4
sizemask3
used0
evport
开始新的事件循环
v2
客户端
类型
编码
对象
REDIS_STRING
REDIS_ENCODING_INT
使用整数值实现的字符串对象
REDIS_ENCODING_EMBSTR
使用embstr编码的简单动态字符串实现的字符串对象
REDIS_ENCODING_RAW
使用简单动态字符串实现的字符串对象
REDIS_LIST
REDIS_ENCODING_ZIPLIST
使用压缩列表实现的列表对象
REDIS_ENCODING_LINKEDLIST
使用双端链表实现的列表对象
REDIS_HASH
使用压缩列表实现的哈希对象
REDIS_ENCODING_HT
使用字典实现的哈希对象
REDIS_SET
REDIS_ENCODING_INTSET
使用整数集合实现的集合对象
使用字典实现的集合对象
REDIS_ZSET
使用压缩列表实现的有序集合对象
REDIS_ENCODING_SKIPLIST
使用跳跃表和字典实现的有序集合
0
value...
pipeline
Main-Thread
redisServer
saveparams
dirty123
lastsave1378270800
RedisClusterNode
L5
L4
L3
L2
L1
BW
3.0
o3
计算节点的排位
添加新元素
8.5
StringObject\"apple\"
v3
len=4
p = c - current_entry.previous_entry_length
hashtable编码的profile哈希对象
dirty0
lastsave1378271106
释放锁unlock
zlbytes
zltail
zllen
new
e1
e2
e3
....
eN
zlend
否
dict
缓存
write
lock
为字典的ht[1]哈希表分配空间
执行rehash之前的字典
long long
1388556000000
flags
redisObject
typeREDIS_STRING
encodingREDIS_ENCODING_RAW
ptr
01111111
k2
zskiplistNode
level[0]
backward
score
obj
repl backlogbuffer
\"set\"
\"get\"
\"rpush\"
sdshdr
free8
len3
buf
parse->resp->command execute
数据变动
时间
服务器进程
子进程
T1
执行命令SET k1 v1
T2
执行命令SET k1 v2
T3
执行命令SET k1 v3
T4
创建子进程,执行AOF文件重写
开始AOF文件重写
T5
执行命令SET k2 10086
执行重写操作
T6
执行命令SET k3 12345
T7
执行命令SET k4 2222
完成AOF文件重写
编码常量
编码所对应的底层数据结构
long类型的整数
embstr编码的简单动态字符串
简单动态字符串
字典
双端链表
压缩列表
整数集合
跳跃表和字典
是
连接应答处理器
listNode
最新添加的键值对
rehash索引1上的键值对
积分服务
2.计算这批Key的slot会分布在哪些节点上,通过JedisClusterCRC16算法,根据这些key分布的node位置,打开分布的node上的pipeline
LLEN命令执行时的类型检查过程
free0
len33
6.0
StringObject\"cherry\"
2.0
o2
Ehcache
rehash索引3上的键值对
线程1
dictEntry*[8]
7
100
服务器客户端套接字产生AE_WRITABLE事件,执行命令回复处理器
1.0
o1
转换成
缓存未命中
dictEntry*[4]
3
ziplist编码
v0
0000001
command execute
缓存更新为1
4.psync(offset)
队列
message(已过期)
xxx
yyy
更新数据库为21
free13
len13
从int16_t类型转换为int32_t类型
prev
010
hashtable编码的fruits集合对象
header
tail
level5
length3
服务器
entry1
entry2
entry3
entry4
web层
2.删除缓存失败
5
4
6
web3
2).设置cmd属性
0 0 1
ht[1]
'M'
'o'
'n'
'g'
'D'
'B'
读写并发不一致
Nginx(分发层)
RDB格式
AOF格式
标识
意义
带有这个标识的命令
w
这是一个写入命令,可能会修改数据库
SET、RPUSH、DEL等等
r
这是一个只读命令,不会修改数据库
GET、STRLEN、EXISTS等等
m
这个命令可能会占用大量内存,执行之前需要先检查服务器的内粗能使用情况,如果内存紧缺的话就禁止执行这个命令
SET、APPEND、RPUSH、LPUSH、SADD、SINTERSTORE等等
a
这是一个管理命令
SAVE、BGSAVE、SHUTDOWN等等
p
这是一个发布与订阅功能方面的命令
PUBLISH、SUBSCRIBE、PUBSUB
s
这个命令不可以再Lua脚本中使用
BRPOP、BLPOP、BRPOPLPUSH、SPOP等等
R
这是一个随机命令,对于相同的数据集和相同的参数,命令返回的结果可能不同
SPOP、SPRANDMMEMBER、SSCAN、RANDOMKEY等等
S
当在Lua脚本中使用这个命令时,对这个命令的输出结果进行一次排序,使得命令的结果有序
SINTER、SUNION、SDIFF、SMEMBERS、KEYS等等
l
这个命令可以在服务器载入数据的过程中使用
INFO、SHUTDOWN、PUBLISH等等
t
这是一个允许从服务器在带有过期数据时使用的命令
SLAVEOF、PING、INFO等等
M
这个命令在监视器(monitor)模式下不会自动被传播(progate)
EXEC
PEXPIREAT
typeREDIS_LIST
encodingREDIS_ENCODING_LINKEDLIST
redisDb
expires
111
值
可以用long类型保存的整数
int
可以用long double类型保存的浮点数
embstr或者raw
字符串值,或者因为长度太大而没办法用long类型表示的整数,又或者因为长度太大而没办法用long double类型表示的浮点数
分值
StringObject5
StringObject\"hello world\"
StringObject\"Josiah L. Carlson\"
请求A
k3
slave
服务器服务器监听套接字产生AE_READABLE事件,执行连接应答处理器
事件处理器
编码长度
content属性保存的值
11000000
1字节
int16_t类型的整数
11010000
int32_t类型的整数
11100000
int64_t类型的整数
11110000
24位有符号整数
11111110
8位有符号整数
1111xxxx
使用这一编码的节点没有相应的content属性,因为编码本身的xxxx四个位已经保存了一个介于0和12之间的值,所以它无须content属性
11111101
类型常量
对象的名称
字符串对象
列表对象
哈希对象
集合对象
有序集合对象
redisClient(客户端c2)
压缩列表节点的各个组成部分
更新缓存
返回一个类型错误
length5
服务器接收客户端发来的命令请求
k0
另一个计算节点的排位
闲置未使用
能否加锁成功
'+'
'O'
'K'
'\'
\
Len
扩展e3并引发对e4的扩展
文件事件分派器
位
0-31位
32-63位
64-95位
96-127位
元素
65535
p4 = p3 - entry2.previous_entry_length
10111111
StringObject\"alphabet\"
StringObject\"book\"
f
time_event
id2
when1385877600000(2013.12.1零时)
timeProchandler_2
Type
type
privdata
ht
rehashidx3
'*'
'3'
'v'
'a'
encodingREDIS_ENCODING_INT
包含五个节点的压缩列表
读取数据库中的值为20
读取数据库的值为20
先更新数据库,再更新缓存
完成AOF文件重写,向父进程发送信号
T8
接收到子进程发来的信号,将命令SET k2 10086、SET k3 12345、SET k4 22222 追加到新的AOF文件的末尾
T9
用新AOF文件覆盖旧AOF文件
一个跳跃表
1.双写不一致情况
成员
更新数据库
对象type属性的值
TYPE命令的输出
\"string\"
\"list\"
\"hash\"
\"zset\"
next
size0
sizemask
time_events
binlog
k4
k5
redisCommand
name\"get\"
proc
arity2
sflags\"r\"
-2675256175807981027
底层实现
返回空回复
11
select
处理已产生的文件事件
10
12
4294967295
AOF重写缓冲区
写数据库stock=10
0-15位
16-31位
(新分配的空间)
服务器检查键key的值对象是否列表对象
void setCommand(redisClient *c)
s2
添加新节点到压缩列表
s3
5.set some-key some-value2
引用数为3的共享对象
客户端2
命令处理器
有BGREWRITEAOF被延迟?
p3 = p2 - entry3.previous_entry_length
PEXPIRE
执行时间轴
zset
zsl
void getCommand(redisClient *c)
分值最大的元素
encodingINTSET_ENC_INT16
'L'
'2'
'1'
键
GET<key>
IO-thread1
redisClient(客户端c3)
已开启AOF持久化功能?
套接字sN
套接字sN-1
套接字s3
套接字s2
rehash执行完毕
服务器程序
EXPIRE
数据类型
1天
1个月
1年
集合类型
80M
2.4G
28G
HyperLogLog
15K
450K
5M
L32
Client2
后台线程
rehashidx-1
客户端向服务器发送命令请求服务器执行命令请求处理器
id3
when1385877600030(2013.12.1零时之后30毫秒)
timeProchandler_3
g
执行sdstrim之前的SDS
RDB数据
p1
rehashidx1
rev(v)
used4
请求B
Client(程序代码)
准备开始rehash
15
键B
s0
商品服务
Nginx(应用层)
client
缓存更新为2
0001
32-47位
48-127位
hash转发
I/O多路复用程序
redisClient(客户端1)
启动服务器
......
带有不同层高的节点
一个空的哈希表
StringObject\"Redis in Action\"
RDB文件
由多个跳跃节点组成的跳跃表
kn=7
k1=3
键A
read->parse->resp
执行sdscat之后的SDS
size8
sizemask7
从服务器
哨兵集群
refcount3
9
used1
rdbLoad
redisClient(客户端3)
name\"set\"
arity-3
sflags\"wm\"
创建和载入RDB文件
完成添加之后的整数集合
typeREDIS_SET
encodingREDIS_ENCODING_HT
对键key执行LLEN命令
将20回写缓存
引用数为2的共享对象
refcount1
ziplist编码的profile哈希对象
键已过期?
EXPIREAT
数据x值更新为2(新值)
StringObject\"age\"
StringObject\"career\"
10086.0
写数据库stock=6
clients
线程3
是否关闭服务器
保存了特殊数据格式的SDS
AOF文件载入过程
包含节点e1至eN的压缩列表
s1
命令请求处理器
redisClient
authenticated0
big
small
Redis集群
previous_entry_length0xFE00002766
encoding...
content...
00000000(0)
'T'
S2
有序集合元素在压缩列表中按分值从小到大排列
StringObject\"Tom\"
socket
StringObject25
GET message
\"banana\"
5.0
\"cherry\"
\"apple\"
len11
int编码的字符串对象
Redis主从
被共享的字符串对象
level[2]
level[1]
v |= ~m0
11111111
00000011(3)
数据x的缓存值为1(旧值)
contents数组的各个元素,以及它们所在的位
\"name\"
\"Tom\"
\"age\"
25
\"career\"
\"Programmar\"
refcount2
key2
free2
len9
执行BGREWRITEAOF
alloc
name
本地缓存
intset编码的numbers集合对象
ListObject
执行sdscat之前的SDS
1).查找\"SET\"对应的redisCommand结构
不做任何动作
IO-thread3
n次伯努利过程
StringObject\"message\"
属性
长度
用途
uint32_t
4字节
记录整个压缩列表占用的内存字节数:在对压缩列表进行内存重分配,或者计算zlend的位置时使用
记录压缩列表表尾节点距离压缩列表的起始地址有多少字节:通过这个偏移量,程序无须遍历整个压缩列表就可以确定表尾节点的地址
uint16_t
2字节
记录压缩列表包含的节点数量:当这个属性小于UINT16_MAX(65535)时,这个属性的值就是压缩列表包含节点的数量;当这个值等于UINT16_MAX时,节点的真实数量需要遍历整个压缩列表才能计算得出
entryX
列表节点
不定
压缩列表包含的各个节点,节点的长度由节点保存的内容决定
uint8_t
特殊值0xFF(十进制255),用于标记压缩列表的末端
encodingREDIS_ENCODING_INTSET
level[4]
level[3]
1byte
每隔10秒检查是否还持有锁,如果持有则演唱锁的时间
free4
len22
服务器启动载入程序
3.send RDB数据
在内存中紧邻的两个C字符串
未被共享的字符串对象
repl buffer
key1
previous_entry_length
encoding
content
c
101
当前节点的前一节点的长度为5字节
redisClient(客户端c1)
kqueue
len=1
previous_entry_length0x05
带有过期字典的数据库例子
完整的字符串对象表示
querybuf
S1的内容溢出到了S2所在的位置上
等待文件事件产生
free
len
used2
使用伪客户端执行写命令
16
载入完毕
对象所使用的底层数据结构
OBJECT ENCODING 命令输出
整数
\"int\"
embstr编码的简单动态字符串(SDS)
\"embstr\"
\"raw\"
\"hashtable\"
\"linkedlist\"
\"ziplist\"
\"intset\"
\"skiplist\"
IO-thread2
Redis
typeREDIS_HASH
encodingREDIS_ENCODING_ZIPLIST
01
argv
argc3
客户端和服务器的通信过程
压缩列表的各个组成部分
P+60
数据更新为1
应用
读取数据库的数据
rdbSave
更新
如果加锁成功
6.master通过socket长连接持续把写命令发送给从节点,保证主从一致性
ziplist编码的numbers列表对象
2.需要删除的缓存值
6.invalidate some-key
cmd
encodingINTSET_ENC_INT32
sentinel
对元素3进行类型转换,并保存在适当的位上
4.清空老数据并加载主节点rdb
' \\0'
1385877600000
对元素2进行类型转换为int32_t类型
命令表
\"sadd\"
\"publish\"
调用ziplistLen函数返回压缩列表的长度
AOF缓冲区
list
head
dup
match
回写缓存
00bbbbbb
长度小于等于63字节的字节数组
01bbbbbb xxxxxxxx
长度小于等于16383字节的字节数组
10______ aaaaaaaa bbbbbbbbcccccccc dddddddd
5字节
长度小于等于4294967295的字节数组
先更新数据库,再删除缓存
查数据库stock=10
分值最少的元素
1.更新数据库
encodingREDIS_ENCODING_EMBSTR
函数
作用
incrRefCount
将对象的引用计数值增一
decrRefCount
将对象的引用计数值减一
resetRefCount
将对象的引用计数值设置为0,但并不释放对象,这个函数通常在需要重新设置对象的引用计数值时使用
当前节点的前一节点的长度为10086字节
StringObject...
载入RDB文件
7.destroy some-key
sizemask0
扩展e2并引发对e3的扩展
C字符串和SDS之间的区别
StringObject\"testName1\"
写数据库
所有读写数据库的命令SET、LRANGE、SADD、HGET、KEYS
free5
len5
分值排第二的元素
P+179
3.master通过socket长连接持续把写命令发送给从节点,保证主从数据一致性
AOF重写的条件已经满足?
linkedlist编码
指向\"set\"键对应的redisCommand结构
appendonly.aof
StringObject\"three\"
Redisson
web2
ziplist编码的有序集合对象
'X'
'Y'
'b'
'c'
更新Redis缓存
01000000
StringObject\"Manning\"
StringObject\"banana\"
数据更新为2
删除small节点将引发连锁更新
文件事件处理器的四个组成部分
整数编码
Lua动态渲染模板
将命令请求转换成协议格式然后发送
previous_entry_length...
encoding11000000
content10086
库存服务
包含三个节点的压缩列表
序号
参数名
含义
默认值
使用建议
maxTotal
资源池中最大连接数
8
见解释
maxIdle
资源池允许最大空闲的连接数
minIdle
资源池确保最少空闲的连接数
blockWhenExhausted
当资源池用尽后,调用者是否要等待,只有当为true时,下面的maxWaitMills才会生效
true
建议使用默认值
maxWaitMills
当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)
-1:表示永不超时
不建议使用默认值
testOnBorrow
向资源池借用连接时是否连接有效性检测(ping),无效连接会被移除
false
业务很大时建议设置为false(多一次ping的开销)
testOnReturn
向资源池归还连接时是否做连接有效性检测(ping),无效连接会被移除
jmxEnable
是否开启jmx监控,可用于监控
建议开启,但应用本身也要开启
服务器向客户端发送命令回复服务器执行命令回复处理器
执行BGSAVE
saveparams[0]
saveparams[1]
saveparams[2]
seconds900
seconds300
seconds60
changes1
changes10
changes10000
追加命令
argv[0]
argv[1]
argv[2]
StringObject\"SET\"
StringObject\"KEY\"
StringObject\"VALUE\"
发送SYNC命令
00000001(1)
used3
载入AOF文件
h
C字符串
SDS
获取字符串长度的复杂度为O(N)
获取字符串长度的复杂度为O(1)
API是不安全的,可能会造成缓冲区溢出
API是安全的,不会造成缓冲区溢出
修改字符串长度N次必然需要执行N次内存重分配
修改字符串长度N次最多需要执行N次内存重分配
只能保存文本数据
可以保存文本数据或者二进制数据
可以使用所有<string.h>库中的函数
可以使用一部分<string.h>库中的函数
3.缓存命中,读取到旧值
客户端向服务器发送连接请求。服务器执行连接应答处理器
2.2 master开始做RDB之后新数据的缓存,其实就是一些写命令
仓储服务
否,while循环,间歇性尝试加锁(自旋)
DEL message
服务器对客户端的连接请求进行应答
进行空间重分配之后的数组
sN
发送缓冲区保存的所有写命令
更新缓存stock=10
缓存的服务
返回message键的值
发送命令请求
键不存在?
添加65535到数组
-6370
-5
18
233
14632
调用listLength函数返回双端链表的长度
StringObject\"a\"
查缓存(空)
Kmax
v++
执行实际的命令流程
自动保存的条件已经满足?
'h'
S1
命令回复处理器
bufpos
修改对象引用计数的API
IO多路复用程序
属性名
char *
命令的名字,比如\"set\"
redisCommandProc*
函数指针,指向命令的实现函数,比如setCommand。redisCommandProc类型的定义为typedef void redisCommandProc(redisClient *c);
arity
sflags
字符串形式的标识值,这个值记录了命令的属性,比如这个命令是写命令还是读命令,这个命令是否允许在载入数据时使用,这个命令是否允许在Lua脚本中使用等等
对sflags标识进行分析得出的二进制标识,由程序自动生成。服务器对命令标识进行检查时使用的都是flags属性而不是sflags属性,因为二进制标识的检查可以方便地通过&、^、~等操作来完成
calls
服务器总共执行了多少次这个命令
millseconds
服务器执行这个命令所耗费的总时长
rehash索引0上的键值对
P
11111100
6.执行buffer里的写命令到内存
00000000
会员服务
一直扩展下去
00000010(2)
键入命令请求
Cannal中间件
数组编码为INTSET_ENC_INT64的整数集合
保存字节数组\"hello world\"的节点
skiplist编码的有序集合对象
遍历整个跳跃表
p2 = p1 - entry4.previous_entry_length
压缩列表各个组成部分的详细说明
redisClient(客户端2)
使用空字符来分割单词的特殊数据格式
typeREDIS_ZSET
写策略
000
从表尾向表头方向遍历
10000000
链表
一个包含四个int64_t类型整数值的整数集合
输入键已经过期
客户端3
len65
MQ
读取服务
第二个添加的键值对
ht[0]的所有键值对都已经被迁移到ht[1]
再次执行sdscat之后SDS
第一个添加的键值对
发现空字符,停止计数,字符串的长度为5字节
服务器客户端套接字产生AE_READABLE事件,执行命令请求处理器
rehash索引2上的键值对
1.pysnc命令同步数据,发送命令
read
14
001
服务器没有在执行任何持久化操作
服务器载入文件时的判断流程
字节数组编码
canal
n = 2 ^ Kmax
4.再次删除缓存值,成功
传送套接字s1
一个包含五个int16_t类型整数值的整数集合
删除4294967295的整数集合
对象的编码
LVS是Linux virtual server的缩写,为linux虚拟服务器,是一个虚拟的服务器集群系统。LVS简单工作原理为用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接收到请求,返回给用户。对于用户来说,看不到Web后端具体的应用。
开始时间
结束时间
动作
创建一个在100毫秒到达的时间事件
30
等待文件事件
31
50
处理文件事件
51
85
130
131
150
执行时间事件
5.slave的offset如果在repl backlog buffer中,则master会将缓存中从slave的offset之后的数据一次性同步给slave节点,否则会全量同步
\"three\"
RedisClusterConnection
StringObject\"b\"
StringObject\"c\"
entryN
StringObject\"Programmer\"
previous_entry
current_entry
连接在一起的键K1和K0
zlbytes0x55
zltail0x3c
zllen0x3
zlend0xFF
RDB和AOF比较
reply
执行sdscat之后SDS
删除键
为eN-1扩展eN的previous_entry_length属性连锁更新到此结束
Client1
4.$ some-key some-value
1.get some-key
id1
when1385877600010(2013.12.1零时之后10毫秒)
timeProchandler_1
1.获取当前的集群连接
对元素1进行类型转换,并保存在适当的位上
对象的编码是ziplist还是linkedlist
save
bgsave
IO类型
同步
异步
是否阻塞redis其他命令
否(在生成子进程执行调用fork函数时会有短暂阻塞)
复杂度
O(n)
优点
不会消耗额外内存
不阻塞客户端命令
缺点
阻塞客户端命令
需要fork子进程,消耗内存
先删除缓存,再更新数据库
创建伪客户端
linkedlist编码的numbers列表对象
rehashidx0
处理已到达的时间事件
发送命令回复
bufpos5
先更新缓存,再更新数据库
调用expireIfNeeded函数
profile哈希对象的压缩列表底层实现
T0
服务器启动
执行SET k1 v1
执行SET k2 v2
执行SET k3 v3
向主服务器发送SYNC命令
接收到从服务器发来的SYNC命令,执行BGSAVE命令,创建包含键k1/k2/k3的RDB文件,并使用缓冲区记录接下来所有的写命令
执行SET k4 v4,并将这个命令记录到缓冲区里面
BGSAVE命令执行完毕,向从服务器发送RDB文件
接收并载入主服务器发来的RDB文件,获得k1/k2/k3三个键
T10
向从服务器发送缓冲区中保存的写命令SET k4 v4和SET k5 v5
T11
接收并执行主服务器发来的两个SET命令,得到k4 k5两个键
T12
同步完成,现在主从服务器两者的数据库都包含了键k1/k2/k3/k4/k5
save与bgsave对比
10086
00111111
'h
扩展e1并引发对e2的扩展
三个带有相同分值的跳跃表节点
Html模板
len=5
发送RDB文件
'V'
'A'
'U'
'E'
epoll
len=2
48-63位
(新分配空间)
3.get some-key
发送命令
使用链表解决K2和K1的冲突
JedisCluster
回复处理器将协议格式的命令回复返回给客户端
交易服务
主从服务器删除过期键
监听
rehashidx2
客户端1
复制
110
Redis(Slave)
len=3
zlbytes0xd2
zltail0xb3
zllen0x5
entry5
encoding00001011
content\"hello world\"
聚合结果
发送命令DEL k3
StringObject\"key\"
StringObject\"value\"
将回复格式化成人类可读格式然后打印显示
2.1收到psync命令执行bgsave生成最新rdb快照数据
执行sdstrim之后的SDS
缓存更新为20
客户端发送LLEN<key>命令
从AOF文件中分析并读取出一条写命令
StringObject1
3.删除缓存失败
encodingREDIS_ENCODING_SKIPLIST
连接监听套接字
保存着整数值10086的节点
Redis(Master)
k2=2
添加键值对K0和V0之后的字典
00
Server
2.master最近数据的缓存,其实就是一些写命令
4.读取需要删除的缓存值
完成rehash之后的字典
(nil)
一个保存着文本数据的SDS
2. $ client - some-key
添加新节点
Cache Aside策略(旁路缓存策略)
authenticated1
数据库状态
LVS+Keepalived
微服务
执行载入程序
5.send buffer
关闭服务器
13
AOF文件中的所有写命令都已经被执行完毕?
一个包含三个int16_t类型的元素的整数集合
消息队列
0 条评论
下一页