Redis - idning

Download Report

Transcript Redis - idning

Redis介绍
丹臣
2011-3-31
Redis是什么?
• 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.
• Redis author : antirez , from Italy
http://antirez.com/
Redis主体结构就是实现一个hash table
Key的类型为sds
Value的类型为redisobject
Redis在value上的不同设计之处
Redis的应用场景
• 对复杂数据结构的良好支持
• 像SNS中的关系,以及一些计数类的需求
Redis的常用操作
•
•
•
•
•
•
•
•
get/set/mset/mget
lpush/lpop,lpush/rpop
hget/hset/hgetall
sadd/srem/spop/scard/sort
del key/move key index
infor
save/bgsave/bgrewriteaof/lastsave
flushall
关系与分页
lpush,rpop,lpop实现队列与栈
与操作相关的两个配置参数:
list-max-ziplist-entries 512 个数
list-max-ziplist-value 15 长度
如果任何一个条件不满足,进入
listTypeConvert函数,转化成双链
表
与lrange,mget组合,可以实现列
表类的一些业务场景
与lrange,多次hgetall组合
结构化数据存取需求
redis> hset danchen guanzhu 195
(integer) 1
redis> hset danchen fans 3769
(integer) 1
redis> hset danchen microblogs 418
(integer) 1
redis>
redis>
redis> hgetall danchen
1) "guanzhu"
2) "195"
3) "fans"
4) "3769"
5) "microblogs"
6) "418"
两个控制参数:
hash-max-zipmap-entries 1024
hash-max-zipmap-value 100
新浪微博的Redis部署
新浪微博的Redis部署
新浪微博的Redis部署
新浪微博的Redis部署
集合sets操作
•
•
•
•
•
•
•
•
redis> sadd students danchen
(integer) 1
redis> sadd students baby
(integer) 1
redis> sadd students hello
(integer) 1
redis> sadd students hi
(integer) 1
redis> sadd students wwww
(integer) 1
redis> sadd students
wwww.taobao.com
(integer) 1
redis> sadd students supu
(integer) 1
redis> sadd students supu
(integer) 0
redis> srem students hi
(integer) 1
redis> srem students hi
(integer) 0
redis> spop students
"danchen"
redis> spop students
"wwww"
redis> scard students
(integer) 4
redis> sort students
1) "hello"
2) "supu"
3) "wwww.taobao.com"
4) "baby"
Pipeline模式
• 发送多个命令,一次性接受多个命令
减少网络IO次数
• 服务器端将命令结果放进queue,再返回给
客户端
Redis server的主流程
连接及处理命令流程
acceptTcpHandler
acceptCommonHandler
readQueryFromClient
processInputBuffer
processCommand
createClient
aeCreateFileEvent(server.el,fd,AE_READABLE,
readQueryFromClient, c)
call
自增长的hashtable
• 每个db对应两条hash table,大多数情况下只
用第一条hash table,第二条在增量hash时会
使用,增量hash采用阶段性完成,单次拷贝
不能超过1ms,以免影响前台应用过多响应
时间。
• bucket初始大小为4,以2的倍数进行动态扩
展。
• 作增量rehash的过程中,新的值将会写到第
二条hash table里。
Hash_table的扩展条件
• _dictKeyIndex(dict *d, const void *key)
调用_dictExpandIfNeeded(d)
判断条件:
–
–
–
当前已处于增量rehash过程中 return
当前hash table size =0 ? 初始化为4
elements/buckets >= 1:1
数据结构管理成本
每个redisObject会有16 bytes的管理开销
typedef struct redisObject {
unsigned type:4;
unsigned storage:2; /* REDIS_VM_MEMORY or
REDIS_VM_SWAPPING */
unsigned encoding:4;
unsigned lru:22;
/* lru time (relative to
server.lruclock) */
int refcount;
void *ptr; /* 数据真正存放的地方*/
} robj;
数据结构管理成本
每个struct dictEntry会有24 bytes的管理开销
typedef struct dictEntry {
void *key;
void *val;
struct dictEntry *next;
} dictEntry;
Rdb持久化
• Fork一个进程,利用copy on write原理,遍
历所有db的hash table,进行整库的dump
• Save命令,shutdown命令,slave启动都会触
发
• 利用LZF进行压缩
• 持久化触发条件:
#save 900 1
#save 300 10
#save 60 10000
Aof持久化
• Aof:把写操作指令连续的写到一个文件里面
• 当redis server异常crash掉的时候,重启时将
会进行如下的操作:
–
–
–
假如只配置了aof,起动时加载aof文件
假如同时配置了rdb,aof,起动时只加载aof文件
假如只配置了rdb,起动时将加载dump文件
Redis replication
相当于mysql statement模式的SQL复制,以及ORACLE的逻辑standby.s
master
Slave也可以进行读写操作
log
slave
复制对TPS的影响(-30%)
我自己写了一
个jkc命令
复制时的jkc指令响应时间
Slave shutdown或者重启
Slave shutdown或者重启
不同的value_length(r:w=4:1)
不同的value_length(r:w=4:1)
Redis客户端
•
•
•
•
•
•
各种语言客户端支持
Java的Jedis,Jredis
Php的Predis,phpredis
Python的redis-py
C的hiredis
….
Jedis客户端
• Jedis,ShardJedis,ShardJedisPipeline
• 支持客户端分布式,ShardJedis。一致性哈
希算法,采用TreepMap<String,ShardInfo>存
储redis节点,murmur哈希函数计算key和
server的值。默认虚拟160个节点,支持权
重配置。
• 连接池管理。JedisPool。
Q/A
• thanks