大白话说redis
2021-05-17 09:24:44 52 举报
登录查看完整内容
通过白话+脑图的模式梳理记录redis的核心知识及原理(持续补充中)
作者其他创作
大纲/内容
object encoding {key}
object refcount {key}
ttl {key}
slaveof 127.0.0.1 6379
cluster meet {ip} {port}
常用命令
查看key对应值的存储类型
查看key值对象的引用次数
以秒为单位查看key过期时间
做我的主人吧
大家抱团取暖吧
save
bgsave
手动
自动
如何知道上次save后修改了多少次
创建
加载
RDB
服务器启动的时候自己干,与我无关
追加 - append
写入 - write
同步 - sync
原理及步骤
追加是写到redis的内存buffer中,还没到文件呢
1. always
2. erverysec
3. no
啥时候写?
写入也只是到文件,还没到磁盘呢
还说啥,刷磁盘呗,淦!
加载aof文件
AOF重写
AOF
哥,咱真不说这个了,aof里面不全是命令嘛,全部执行一遍不就得了
fork子进程
aof_rewrite_buf
问题:随着命令越来越多,aof文件会越来越大吗?
如果已经fork了一个进程在bgsave,还会rewrite吗?
持久化
啥时候
怎么搞
同步 - sync - 全量
当我向你发送slaveof,你就要向master发送sync
master执行bgsave搞一个rdb给你
传播 - propagate - 增量
旧版
有没有看出啥问题?
psync - partial 部分同步
请先看怎么搞
offset
新版
心跳检测
检测
主从复制
CMD-1: 10s一次 -> INFO
CMD2: 2s一次 -> PUBLISH __sentinel__:hello
CMD-3: 1s一次 -> PING
哨兵Sentinel
获取到信息干啥呢
来了老哥:干啥呢?
CMD-4: sentinel is-master-down-by-addr
CMD-5: sentinel is-master-down-by-addr
hi~老哥,不用我说了吧
老哥,看着你~
CMD-5: slaveof no one
没病的老哥出来一个,你来当master
其他没病的老哥,你们跟一下新的master老哥吧
有病的老哥好了?你走了后地位尽失,跟这新的老哥吧
老哥,就是这样的
故障转移
启动
握手
slot 槽
上线
重分槽
复制
CMD: ping
这里有一个很有意思的处理
选一个小弟出来
小弟自己成为大哥
小弟开始接替大哥的工作
新的大哥通知其他地盘的大哥
转移
slaveof no one
pong
故障
集群
false: 普通的redis节点
true: 一个集群节点
cluster-enabled
如何记录
如何传播
CMD: cluster addslots
16384
moved
如何工作?
CMD:moved {slot} {ip}:{port}
ask
客户端如何处理呢
高可用
subscribe 订阅
uncubscribe 退订
频道 channel
无情
殷切
模式 pattern
订阅通知
类型
与c的区别
sds组合了字符数组,说白了就是一个装饰器模式
避免了缓冲区溢出,覆盖其他内存区域
长度不用遍历字符数组,张手就来
修改字符串可以减少内存重分配次数
好处
1. 空间提前分配
2. 空间惰性释放
方式
思想
sds
典型的空间换时间
扩容
收缩
1. 如何处理查询
2. 如何处理新增
问题
先查旧的,查不到再查新的
不会在旧的新增,只会加到新表中
rehash
负载比为1或者5
负载比降到0.1
dict
int16
int32
int64
升级
降级
intset
灵活呀
节约内存(主要是这个)
对不起,不支持降级
数据结构
整数值
int
字符串len<40
embstr
字符串len>=40
raw
string 字符串类型
redisobject的内存和存储字符串的内存连续
ziplist
linkedlist
quicklist
外框
list 列表类型
1. 不能超过512个元素
2. 所有元素长度小于64字节
条件
hashtable
hash 哈希类型
就是一个普通的dict字典
1. 所有的键值对数量不超过512个
2. 键和值的长度都不能超过64字节
和list的区别
set 集合类型
思考
1. 所有元素都是整数值
2. 一共不能超过512个元素
skiplist
zset 有序集合类型
有点浮躁,这个又有点复杂就不看了
1. 所有元素长度小于64字节
2. 一共不超过128个元素
type 类型
encoding 编码
*ptr
结构
即上述五种类型对应的实际实现
一个指针,指向底层的实现结构体
创建对象 +1
被一个程序使用 +1
不被使用 -1
引用计数-refcount
内存回收
对象共享
对象
共享0-9999之间的整数字符串对象
redis是如何优化内存的?
判断相同的成本有点高!
为啥不共享字符串对象?
数据存储 - dict
存储
定期删除
惰性删除
删除策略
1. 在规定的时间(10ms)
2. 分多次遍历所有数据库(16个)
3. 每次随机抽一个过期键来处理
定时和定期的区别
如果一个键很幸运,每次都没有被抽查到?
load
RDB处理
过期了就不保存了呗
过期了就不加载进去呗
append
rewrite
AOF处理
过期的时候追加delete命令呗
都重写了,反正会覆盖,过期了就别写进去呗
主从复制处理
过期键存储 - expires
思考?
数据库
开始
入队
执行
监听
实现
multi
cmd 数组
exec
不禁发问
watch
ACID
事务
redis
0 条评论
回复 删除
下一页