SlideShare a Scribd company logo
1 of 26
大话Redis设计实现
“峰云就她了”
- xiaorui.cc
v 2016.6.5
redis协议
set name fengyun
*3rn
$3rn
SETrn
$4rn
namern
$7rn
fengyunrn
if OK:
+OKrn
else:
-1rn
get name
*2rn
$3rn
GETrn
$4rn
namern
if OK:
$7rn
fengyunrn
else:
$-1rn
消息体数
字节数
数据结构
string (sds)
list (deque)
hash (hash table)
set (intset + dict)
zset (skip list + hash table)
String (sds)
struct sdshdr {
int len;
int free;
char buf[];
};
获取字符串长度, 常数复杂度
增长时空间预分配
惰性回收
shshdr
free
0
len
5
buf R E D I S O
Hash table
通过渐进式rehash解决kv过多造成服务阻塞
流程:
给ht[1]分配至少2倍于ht[0]的空间
将ht[0]数据分批迁移到ht[1]
清空ht[0], 将ht[0]指针指向ht[1],ht[1]指针指向ht[0]
每次rehash 100个桶
渐进式rehash
del  find  update in ht[0] and ht[1]
insert in ht[1]
dictht
table
size
4
sizemask
3
userd
2
dict
type
…
ht
rehashidx
-1
dictht
table
size
8
sizemask
7
userd
dictEntry*[4]
0
1
2
3
dictEntry*[8]
…
4
5
…
dictEntry
k6 v6
dictEntry
k2 v2
dictEntry
kx vx
dictEntry
k3 v3
null
null
null
null
ht[O]
ht[1]
null
null
redisDB
dict
expires
watch
…
dict
“string”
“list”
“hash”
“set”
…
server
…
db
…
string object
List object
Hash object
Set object
“this is string”
“t1” “t2” “null”
name xiaorui
age 18
a b c d …
0 1 2 3 …
RedisDB 内部结构
Redis event
事件类型
时间类型 (serverCron  aof  rdb  expires)
文件类型 (client reuqest  repl)
串行
epoll_create , epoll_ctl , epoll_wait
先文件类型, 再时间类型 (100ms cs)
io事件 io事件 io事件 io事件
定时器
IO事件表
定时事件表 定时器 定时器
event loop
Redis Rdb
RDB是Redis物化数据,保证宕机恢复的一个
手段(会丢一部分最新数据)
每个Redis实例只会存一份rdb文件
可以通过Save以及BGSAVE 来调用
二进制文件, lzf
“redis rdb” “version” “Data” “Data”
“Data” … EOF CHECKSUM
“expireTime” “value type” “key” “value”
RDB Format
rdbSave
遍历每个db, 遍历每个db的dict, 获取每一个dictEntry
获取Key之后查询expire, 如过期, 就舍弃
将数据key, value, type, expiretime 等写入文件
计算checksum, 通过rename交换旧的RDB文件
rdbLoad
遍历RDB文件的每一条数据
读取key, value, expiretime等信息,插入dict字典以及expire字典
校验checksum
Redis Aof
类似于BINLOG机制, 可以做到不丢数据
how ?
每次数据操作都会调用flushAppendOnlyFile来刷新aof
每次操作都需要fsync, 前台线程阻塞
aof的内容就是redis标准协议
*3rn$5rnHMGETrn$5rnHENRYrn$10rnxiaorui.ccrn
Aof
意义 ?
将同一个key的反复操作,全部转为最后的值或multi集合 ( < 64)
no-appendfsync-on-rewrite yes
正导出rdb快照的过程中,要不要停止同步fsync
auto-aof-rewrite-min-size 3000mb
aof文件,至少超过3000M时, 再执行aof重写
auto-aof-rewrite-percentage 80
aof文件大小比起上次重写时的大小,增长率80%时,执行aof重写
AOF ReWrite的实现:
Fork一个子进程进行重写
打开一个tmp aof文件准备写入
遍历每个DB 及DICT中的每对key value, 同时忽略过期键
以协议命令的方式写入tmp aof文件中
主进程中新的操作内容写到aof rewrite buffer中
子进程重写完后, 向主进程发送信号, 主进程serverCron中将buffer的内容刷到新的
aof文件中
最后以rename的方式替换旧的aof文件
brpop/blpop
redisDB
dict
blocking_keys
expires_keys
watch_keys
…
client
blocking_keys
xiaorui
hello
…
client fd
client fd
client fd
interpreter
brpop/blpop
pubsub
pubsub_channels
channel_1
hello
worker
…
“client_fd” “client_fd”
“client_fd”
producer
pub
consumer
sub
redisServer
pubsub_channels
pubsub_patterns
pubsub_patterns
hello_*
worker_*
expire realize
懒惰清理
当发生读写的时候, 会检查是否过期
主动清理
定期轮询expire dict中的键是否过期
slave屏蔽懒惰和主动清理, 只等待psync .
Expires Dict
0
1
2
D
key value next
blog time
RedisDB
expires_keys
…
expire realize
watch multi
watch 乐观锁
multi 原子性
流程
事务标记开始
命令入队
事务执行
无rallback 、 无Lock
command
事务状态?
exec,discard,watch,multi
push cmd queue
return queued
run command
返回执行结果
否
否
是
是
if watch:
do cas
客户端
主从同步
fork bgsave ?
fork child block ? bgsave block ?
psync vs fullsync 区别 ?
run_id标识slave, 为毛不适用fd ?
offset
replication backlog vs replication buffer
两个slave同时fullsync , 共用一个RDB及buffer
连接主机 psync runid offset
backlog runid offset
返回 event + runid + offset
等待接收事件
bgsave
Transfer RDB
no yes
返回 event
等待接收事件
传输backlog repl buffer
transfer
改进
transfer rdb, copy效率| 断连 | 落地
sendfile | 断点 | 内存
expires keyes, random check
二叉堆 ?
“Q & A”
– 2016. 06. 08

More Related Content

What's hot

海量数据迁移方案
海量数据迁移方案海量数据迁移方案
海量数据迁移方案orczhou
 
SSDB 入门基础
SSDB 入门基础SSDB 入门基础
SSDB 入门基础ideawu
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享晓锋 陈
 
SSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs RedisSSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs Redisideawu
 
几种Nosql介绍
几种Nosql介绍几种Nosql介绍
几种Nosql介绍taotao1240
 
淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林Shaoning Pan
 
R統計軟體 -安裝與使用
R統計軟體 -安裝與使用R統計軟體 -安裝與使用
R統計軟體 -安裝與使用Person Lin
 
Hadoop与数据分析
Hadoop与数据分析Hadoop与数据分析
Hadoop与数据分析George Ang
 
[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務台灣資料科學年會
 
微博实时搜索
微博实时搜索微博实时搜索
微博实时搜索亚军 汪
 
智能Dns工作流程及配置
智能Dns工作流程及配置智能Dns工作流程及配置
智能Dns工作流程及配置Yiwei Ma
 
Vim+神技 (1)
Vim+神技 (1)Vim+神技 (1)
Vim+神技 (1)Ailsa126
 
Vim 神技
Vim 神技Vim 神技
Vim 神技hotoo
 
Pytables
PytablesPytables
Pytablesgowell
 
Redis 介绍 -田琪
Redis 介绍 -田琪Redis 介绍 -田琪
Redis 介绍 -田琪Shaoning Pan
 
資料庫入門 Part2
資料庫入門 Part2資料庫入門 Part2
資料庫入門 Part2Allen Chou
 
Mongo快速入门
Mongo快速入门Mongo快速入门
Mongo快速入门Lucien Li
 
Introduction to FreeBSD commands
Introduction to FreeBSD commandsIntroduction to FreeBSD commands
Introduction to FreeBSD commands郁凱 黃
 
20161017 R語言資料分析實務 (2)
20161017 R語言資料分析實務 (2)20161017 R語言資料分析實務 (2)
20161017 R語言資料分析實務 (2)羅左欣
 

What's hot (20)

海量数据迁移方案
海量数据迁移方案海量数据迁移方案
海量数据迁移方案
 
SSDB 入门基础
SSDB 入门基础SSDB 入门基础
SSDB 入门基础
 
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
 
SSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs RedisSSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs Redis
 
几种Nosql介绍
几种Nosql介绍几种Nosql介绍
几种Nosql介绍
 
R intro 20140716-basic
R intro 20140716-basicR intro 20140716-basic
R intro 20140716-basic
 
淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林淘宝数据魔方的系统架构 -长林
淘宝数据魔方的系统架构 -长林
 
R統計軟體 -安裝與使用
R統計軟體 -安裝與使用R統計軟體 -安裝與使用
R統計軟體 -安裝與使用
 
Hadoop与数据分析
Hadoop与数据分析Hadoop与数据分析
Hadoop与数据分析
 
[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務
 
微博实时搜索
微博实时搜索微博实时搜索
微博实时搜索
 
智能Dns工作流程及配置
智能Dns工作流程及配置智能Dns工作流程及配置
智能Dns工作流程及配置
 
Vim+神技 (1)
Vim+神技 (1)Vim+神技 (1)
Vim+神技 (1)
 
Vim 神技
Vim 神技Vim 神技
Vim 神技
 
Pytables
PytablesPytables
Pytables
 
Redis 介绍 -田琪
Redis 介绍 -田琪Redis 介绍 -田琪
Redis 介绍 -田琪
 
資料庫入門 Part2
資料庫入門 Part2資料庫入門 Part2
資料庫入門 Part2
 
Mongo快速入门
Mongo快速入门Mongo快速入门
Mongo快速入门
 
Introduction to FreeBSD commands
Introduction to FreeBSD commandsIntroduction to FreeBSD commands
Introduction to FreeBSD commands
 
20161017 R語言資料分析實務 (2)
20161017 R語言資料分析實務 (2)20161017 R語言資料分析實務 (2)
20161017 R語言資料分析實務 (2)
 

Viewers also liked

异步io框架的实现
异步io框架的实现异步io框架的实现
异步io框架的实现rfyiamcool
 
聊聊我接触的集群管理
聊聊我接触的集群管理聊聊我接触的集群管理
聊聊我接触的集群管理rfyiamcool
 
async io frame
async io frameasync io frame
async io framerfyiamcool
 
美妙的多进程管理
美妙的多进程管理美妙的多进程管理
美妙的多进程管理rfyiamcool
 
cdn的那些事儿
cdn的那些事儿cdn的那些事儿
cdn的那些事儿rfyiamcool
 
MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)frogd
 
Redis as a Main Database, Scaling and HA
Redis as a Main Database, Scaling and HARedis as a Main Database, Scaling and HA
Redis as a Main Database, Scaling and HADave Nielsen
 
Redis & Redis HA design with Keepalived
Redis & Redis HA design with KeepalivedRedis & Redis HA design with Keepalived
Redis & Redis HA design with KeepalivedToshiki Inami
 
Redis persistence in practice
Redis persistence in practiceRedis persistence in practice
Redis persistence in practiceEugene Fidelin
 
Redis trouble shooting
Redis trouble shootingRedis trouble shooting
Redis trouble shootingDaeMyung Kang
 
Redis to the Rescue?
Redis to the Rescue?Redis to the Rescue?
Redis to the Rescue?Wooga
 
High-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using RedisHigh-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using Rediscacois
 
Internet scaleservice
Internet scaleserviceInternet scaleservice
Internet scaleserviceDaeMyung Kang
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday DeveloperRoss Tuck
 
Redis in Practice
Redis in PracticeRedis in Practice
Redis in PracticeNoah Davis
 

Viewers also liked (20)

异步io框架的实现
异步io框架的实现异步io框架的实现
异步io框架的实现
 
聊聊我接触的集群管理
聊聊我接触的集群管理聊聊我接触的集群管理
聊聊我接触的集群管理
 
Raft
Raft Raft
Raft
 
python gil
python gilpython gil
python gil
 
async io frame
async io frameasync io frame
async io frame
 
美妙的多进程管理
美妙的多进程管理美妙的多进程管理
美妙的多进程管理
 
cdn的那些事儿
cdn的那些事儿cdn的那些事儿
cdn的那些事儿
 
MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)
 
Redis as a Main Database, Scaling and HA
Redis as a Main Database, Scaling and HARedis as a Main Database, Scaling and HA
Redis as a Main Database, Scaling and HA
 
Redis & Redis HA design with Keepalived
Redis & Redis HA design with KeepalivedRedis & Redis HA design with Keepalived
Redis & Redis HA design with Keepalived
 
Redis on AWS
Redis on AWSRedis on AWS
Redis on AWS
 
Redis persistence in practice
Redis persistence in practiceRedis persistence in practice
Redis persistence in practice
 
Redis trouble shooting
Redis trouble shootingRedis trouble shooting
Redis trouble shooting
 
Redis acc 2015_eng
Redis acc 2015_engRedis acc 2015_eng
Redis acc 2015_eng
 
Redis to the Rescue?
Redis to the Rescue?Redis to the Rescue?
Redis to the Rescue?
 
High-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using RedisHigh-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using Redis
 
Internet scaleservice
Internet scaleserviceInternet scaleservice
Internet scaleservice
 
Redis acc
Redis accRedis acc
Redis acc
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday Developer
 
Redis in Practice
Redis in PracticeRedis in Practice
Redis in Practice
 

More from rfyiamcool

Redis cluster那些事儿
Redis cluster那些事儿Redis cluster那些事儿
Redis cluster那些事儿rfyiamcool
 
Golang advance
Golang advanceGolang advance
Golang advancerfyiamcool
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast sharerfyiamcool
 
python高级内存管理
python高级内存管理python高级内存管理
python高级内存管理rfyiamcool
 
分析mysql acid 设计实现
分析mysql acid 设计实现分析mysql acid 设计实现
分析mysql acid 设计实现rfyiamcool
 

More from rfyiamcool (7)

Redis cluster那些事儿
Redis cluster那些事儿Redis cluster那些事儿
Redis cluster那些事儿
 
Golang advance
Golang advanceGolang advance
Golang advance
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast share
 
python高级内存管理
python高级内存管理python高级内存管理
python高级内存管理
 
Micro service
Micro serviceMicro service
Micro service
 
分析mysql acid 设计实现
分析mysql acid 设计实现分析mysql acid 设计实现
分析mysql acid 设计实现
 

大话redis设计实现