Redis介绍 2. 主题
● Redis 主要内存结构及主体执流程
● Redis rehash 介绍
● Redis 持久化
● Redis 协议
● Redis 应用实例
3. Redis 是什么
● Redis 是 REmote DIctionary Server 的缩写 .
● Redis is an open source, advanced key-
value store. It is often referred to as a
data structure server since keys can
contain strings, hashes, lists, sets and
sorted sets.
8. Redis key-vale
Key 字符串 通过 sds 实现 struct sdshdr {int len;
int free;char buf[];
};
Value typedef struct redisObject {
unsigned type:4;unsigned notused:2;
unsigned encoding:4; unsigned lru:22;
int refcount;
void *ptr;
} //redis.h
10. Redis db
● Redis 默认 db 数量是 16 个
● Client 可以用 select 命令选择 db, 之后的操
作都在这个 db 上
● 默认第 1 个 db, 即索引为 0 的 db
13. Redis 两个重要的函数
● ServerCron 定时函数
每 100ms 执行
● ServerCron 工作
如果当前没有后台运行 dump 数据保存到文的
进程,则可以根据内存使用情况重新调整
hashTables 大小
记录些日志
判断是否有正在进行 dump 数据到文件的后台
进程
完成主从复制
15. Redis rehash
● Dict 结构里 ht[2] 属性
● 默认情况下 ht[0],reash 时使用 ht[1]
● Rehash 时使用分批 rehash , 每次只 rehash
部分
● bucket 初始为 4, 根据需要以 2 的 n 次方增加
和 java hashmap 扩容大小一样。
16. Redis rehash 扩容条件
● _dictExpandIfNeeded 函数判断是否扩容
初始化时
(Size/bucket >=1&&(dict_can_resize||
size/bucked>5))
20. Redis dump
● 主进程 fork 出一个子进程,利于 copy on
write ,子进程 dump 整个库
● 触发条件
save 主进程 dump
bgsave fork 出子进程来 dump
slave 连接了
● 配置文件里设置
save 900 1
24. Redis 主从复制
● Slave 在命令行执行 slaveof ip port
或在配置文件里配置
● Slave 时 master 要执行 dump
● 同步完成后,以后每次按需复制
● 没有增量复制的方式,每次 slave down 后,要
重新从 master 复制整个库
26. Redis 通信 协议
● *<number of arguments> CR LF
● $<number of bytes of argument 1> CR LF
● <argument data> CR LF
● ...
● $<number of bytes of argument N> CR
LF
● <argument data> CR LF
27. Redis pipelining 模式
● 一次发送多个命令,减少网络传输
● 服务器将命令放到 queue, 结果按请求顺序返回
给 client
● 内部 api 数据统计就采用了 pipelining
32. 参考资料
● Redis 官网
● Redis 源代码
● 网上分析 redis 的文章