redis思维导图
2016-11-29 21:49:03 0 举报
AI智能生成
Redis思维导图是一种图形化的工具,用于展示和理解Redis数据库的结构和功能。它以树状图的形式展示了Redis的各个组件和它们之间的关系。在思维导图中,我们可以看到Redis的主要数据结构,如字符串、哈希、列表、集合和有序集合,以及它们的操作方法和特点。此外,思维导图还展示了Redis的持久化机制、事务处理、发布订阅等功能。通过使用Redis思维导图,我们可以更直观地了解Redis的设计理念和应用场景,从而更好地利用这个高性能的键值存储系统。
作者其他创作
大纲/内容
独立功能的实现
发布与订阅
频道的订阅和退订
dict(pubsub_channels)
key=news.it 频道
value=链表保存订阅的client
subscirbe news.book订阅频道news.book
unsubscribe news.book退订频道
模式的订阅和退订
dict(pubsub_patterns)
链表结构pubsubPattern
client:client-1
pattern:news.*
psubscribe news.*订阅模式
punsubscribe news.*退订模式
消息发送
publish channel message
发送给频道订阅者
发送给模式订阅者
pubsub channel[pattern]查看订阅消息
PUBSUB CHANNELS "news.[is]*"
pubsub numsub channel1 channel2
查看频道订阅数量
pubsub numpat 查看模式订阅数量
publish、subscribe、psubscribe
事务
事务的实现
MULTI---CMD---EXEC
事务队列-redisclient
包含multiCmd的对象的数组
argv
argc
cmd
事务计数器-队列长度
watch命令
乐观锁(optimistic locking)
watch_keys字典
key=被监视的键
value=监视的client
所有修改数据库键都会触发watch_keys
如果修改,client的REDIS_DITRY_CAS会打开
标志打开拒绝执行当前事务
redis的ACID
Atomicity
Consistency
Isolation
Durability
lua脚本
排序
二进制位数组
慢查询日志
保存
记录超过指定时间的命令
redisServer下面showlog链表保存
entry_id
exec_time
duration
argv
argc--count
showlog-log-slower_than
showlog-max-len(指定条数)
阅览、删除
遍历showlogEntry链表
添加新日志
符合条件的条件到表头
链表长度查过showlog-max-len删除日志
删除按照队列先进先出
监视器
monitor客户端变为监视器
redisServer的monitors链表保存监视器
server处理命令前,会把信息发给监视器
monitor打开客户端redis_monitor标识
多机数据库实现
复制
sentinel
集群
数据结构和对象
简单动态字符串
SDS(simple dinymic string)
保存字符串,做缓冲区AOF
链表
用于列表键值、发布和订阅、慢查询、监控器
链表节点ListNode
prev
next
value
双端链表
链表list
head
tail
len
func(dup,free,match)
无环链表,head和tail节点指向null
字典
键值对用于数据库和哈希键
哈希表实现
ht[0]平时存储键值对用
ht[1]用作rehash用
单向链表解决索引冲突问题
收缩和扩展的rehash是渐进式的
跳跃表
zskipList
表头节点
表尾节点
表长度
zskipNode
跳跃表节点信息
整数集合
有序、无重复的数组
升级16、32、64位,节省内存空间
不支持降级
压缩列表
用作列表键和哈希键的底层实现
保存一个整数或者字节数组
增加和删除引发连锁更新操作
对象
字符串对象
编码:int,raw,embstr
列表对象
编码:ziplist,linkedlist
哈希对象
编码:ziplist,hashtable
集合对象
编码:intset,hashtable
有序集合对象
编码:ziplist,skiplist
内存回收
refcount计数器
创建对象为1
对象被调用+1
不再被使用-1
值为0,回收内存
共享对象
0-9999的字符串对象
空转时长IDLETIME
当前时间-键值对lru时间
maxmemory
volatile-lru
allkeys-lru
内存消耗>=maxmemory
空转时长较长的键会被释放,内存回收
单机数据库实现
数据库
redisServer.db
dbnum属性保存数据库个数,默认16个
select 0、1...切换对应的数据库
dict字典
保存键值对
键是字符串对象
值对应5种对象
字符串、列表、哈希、集合、有序集合
expires字典
保存键值对过期时间
EXPIRE/PEXPIRE
已秒/毫秒设置过期时间
这两个命令底层会调用PEXPIREAT
EXPIREAT/PEXPIREAT
timestamp指定的秒/毫秒
EXPIREAT底层会调用PEXPIREAT
TTL(Time To Live)
键值对生存时间
ttl obj
expires中的键是指针,指向dict中的键
PERSIST命令移除过期时间
删除策略
定时删除
设置定时器,过期立即删除
惰性删除
获取键判断是否过期,过期就删除
定期删除
定期删除过期键
RDB持久化
RDB文件的创建
SAVE
阻塞REDIS服务器进程
保存期间不能处理其他命令
BGSAVE
子进程完成工作,不阻塞服务器进程
服务器进程可以继续处理其他命令
载入
redis启动时自动载入
如果开启AOF持久化,优先载入AOF文件
RDB文件的间歇性保存
SAVEPARAMS
redisServer的属性
一个数组,每个元素是一个saveParam结构
包含times、changes
save 900 1
save 300 10
save 60 1000
dirty计数器
上一次SAVE/BGSAVE后操作次数
lastsave属性
记录上一次成功执行SAVE/BGSAVE时的时间
serverCron
redis服务器的周期性操作函数
默认100ms检查一次saveparams是否满足条件
RDB文件的结构
REDIS
标识RDB文件
version
RDB文件版本
databases
0个or任意多个DB键值对
selectdb
读入数据库号码标志
db_number
对应数据库号码
key_value_pairs
EXPIRESTIME_MS
ms
TYPE
KEY
VALUE
EOF
文件结束标志
CHECKSUM
校验和,由前4部分计算所得
校验文件是否修改或者损坏
RDB文件分析
AOF持久化
保存数据库的写命令实现持久化
写入AOF缓冲区
BGTEWRITEEOF
定期写入同步到AOF
always
everysec(default)
no
通过伪client载入AOF恢复DB
EOF重写
产生一个新EOF文件,体积比原来EOF小
读取数据库中的键值对来实现
事件
时间事件
定时事件
周期性事件
ID
WHEN
TIMEPROC
文件事件
对套接字操作的抽象
accept,read,write,close
Reactor模式,I/O多路复用demultiplex
文件分派器
连接应答处理器
命令请求处理器
命令回复处理器
保存到无序链表,定期轮询
事件调度与执行
服务器启动等待事件
时间时间和文件事件合作关系,不会抢占
事件执行是同步、原子、有序的执行
客户端
客户端属性
server通过链表保存客户端info
flag属性表示client性质
-1 表示伪client,执行AOF、lua脚本
大于-1,表示普通client
输入缓冲区
保存客户端的请求命令
可变缓冲区<=1GB
argv保存请求命令参数
argc保存请求参数个数
cmd保存命令实现函数
固定缓冲区16KB
输出缓冲区
硬性限制,超过容量关闭client
软性限制,一段时间持续超过容量关闭client
客户端的创建和关闭
调用connect函数建立连接,保存到链表末尾
关闭客户端
成为client kill的目标
空转时间超过timeout的值
请求命令长度超过1GB
输出缓冲区值超过了设置容量
网络连接关闭
不符合协议格式的命令
伪客户端
服务器初始化时创建
执行lua脚本
知道服务器关闭结束
伪客户端2
载入AOF文件是创建
载入AOF文件结束后关闭
服务器
处理client的请求命令
接收client请求CMD,存入输入缓冲区
参数存入argv,argc属性中
redisCommond
name命令名称
proc实现函数
arity参数个数
-3,可接收3个机器以上的参数
2,可接受2个参数
sflags(读写)
执行预备操作
CMD是否指向NULL
参数个数是否和命令一致
开启了maxmemory功能,检查内存是否够用,回收内存
client是否通过了身份验证
调用CMD实现函数
回写到输出缓冲区
client接收信息打印
serverCron函数
更新服务器缓存时间
更新locklru时钟
更新server每秒执行cmd次数
内存峰值记录
处理SIGTERM信号
管理客户端资源
管理数据库资源
删除过期键
字典收缩操作
执行被延时的BGREWRITEAOF命令
检查持久化操作的运动状态
AOF缓冲区内容写入AOF
关闭异步client
增加cronloops计数器的值
记录serverCron执行次数
服务器初始化
初始化server结构状态(redisServer)
载入配置项
init服务器数据结构
还原数据库状态
执行循环事件
文件事件
时间事件
0 条评论
下一页