Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Redis介绍

61,966 views

Published on

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

Published in: Education, Technology
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Hi there! Essay Help For Students | Discount 10% for your first order! - Check our website! https://vk.cc/80SakO
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • thanks!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 很好的NoSQL(redis)学习资料
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • excellent!!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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 />

×