Redis介绍<br />丹臣<br />2011-3-31<br />
Redis是什么?<br />Redis is an open source, advanced key-value store. It is often referred to as a data structure server since...
Redis主体结构就是实现一个hash table<br />Key的类型为sds<br />Value的类型为redisobject<br />
Redis在value上的不同设计之处<br />
Redis的应用场景<br />对复杂数据结构的良好支持<br />像SNS中的关系,以及一些计数类的需求<br />
Redis的常用操作<br />get/set/mset/mget<br />lpush/lpop,lpush/rpop<br />hget/hset/hgetall<br />sadd/srem/spop/scard/sort<br />de...
关系与分页<br />lpush,rpop,lpop实现队列与栈<br />与操作相关的两个配置参数:<br />list-max-ziplist-entries  512 个数<br />list-max-ziplist-value   15...
结构化数据存取需求<br />redis> hsetdanchenguanzhu 195<br />(integer) 1<br />redis> hsetdanchen fans 3769<br />(integer) 1<br />redi...
新浪微博的Redis部署<br />
新浪微博的Redis部署<br />
新浪微博的Redis部署<br />
新浪微博的Redis部署<br />
集合sets操作<br />redis> srem students hi<br />(integer) 1<br />redis> srem students hi<br />(integer) 0<br />redis> spop stud...
Pipeline模式<br />发送多个命令,一次性接受多个命令<br />减少网络IO次数<br />服务器端将命令结果放进queue,再返回给客户端<br />
Redis server的主流程<br />
连接及处理命令流程<br />acceptTcpHandler<br />readQueryFromClient<br />processInputBuffer<br />acceptCommonHandler<br />processComm...
自增长的hashtable<br />每个db对应两条hash table,大多数情况下只用第一条hash table,第二条在增量hash时会使用,增量hash采用阶段性完成,单次拷贝不能超过1ms,以免影响前台应用过多响应时间。<br />...
Hash_table的扩展条件<br />_dictKeyIndex(dict *d, const void *key)<br />调用_dictExpandIfNeeded(d)<br />     判断条件:<br />当前已处于增量reh...
数据结构管理成本<br />每个redisObject会有16 bytes的管理开销<br />typedefstructredisObject {<br />    unsigned type:4;<br />    unsigned sto...
数据结构管理成本<br />每个structdictEntry会有24 bytes的管理开销<br />typedefstructdictEntry {<br />    void *key;<br />    void *val;<br />...
Rdb持久化<br />Fork一个进程,利用copy on write原理,遍历所有db的hash table,进行整库的dump<br />Save命令,shutdown命令,slave启动都会触发<br />利用LZF进行压缩<br />...
Aof持久化<br />Aof:把写操作指令连续的写到一个文件里面<br />当redis server异常crash掉的时候,重启时将会进行如下的操作:<br />假如只配置了aof,起动时加载aof文件<br />假如同时配置了rdb,ao...
Redis replication<br />相当于mysql statement模式的SQL复制,以及ORACLE的逻辑standby.s<br />master<br />slave<br /> log<br />Slave也可以进行读写操...
复制对TPS的影响(-30%)<br />我自己写了一个jkc命令<br />
复制时的jkc指令响应时间<br />
Slave shutdown或者重启<br />
Slave shutdown或者重启<br />
不同的value_length(r:w=4:1)<br />
不同的value_length(r:w=4:1)<br />
Redis客户端<br />各种语言客户端支持<br />Java的Jedis,Jredis<br />Php的Predis,phpredis<br />Python的redis-py<br />C的hiredis<br />….<br />
Jedis客户端<br />Jedis,ShardJedis,ShardJedisPipeline<br />支持客户端分布式,ShardJedis。一致性哈希算法,采用TreepMap<String,ShardInfo>存储redis节点,m...
Q/A<br />thanks<br />
Upcoming SlideShare
Loading in …5
×

Redis介绍

58,561
-1

Published on

Redis是什么?
Redis常用操作及使用场景介绍
Redis server的主流程,自增长的hash table实现,以及相关数据结构的管理成本
Redis的持久化,以及Replication
Redis的性能测试数据

Published in: Education, Technology
5 Comments
143 Likes
Statistics
Notes
No Downloads
Views
Total Views
58,561
On Slideshare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
1,659
Comments
5
Likes
143
Embeds 0
No embeds

No notes for slide

Redis介绍

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

    Clipping is a handy way to collect important slides you want to go back to later.

×