• 1. Redis介绍丹臣 2011-3-31
  • 2. 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/
  • 3. Redis主体结构就是实现一个hash tableKey的类型为sds Value的类型为redisobject
  • 4. Redis在value上的不同设计之处
  • 5. Redis的应用场景对复杂数据结构的良好支持 像SNS中的关系,以及一些计数类的需求
  • 6. 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
  • 7. 关系与分页lpush,rpop,lpop实现队列与栈 与操作相关的两个配置参数: list-max-ziplist-entries 512 个数 list-max-ziplist-value 15 长度 如果任何一个条件不满足,进入listTypeConvert函数,转化成双链表 与lrange,mget组合,可以实现列表类的一些业务场景 与lrange,多次hgetall组合
  • 8. 结构化数据存取需求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
  • 9. 新浪微博的Redis部署
  • 10. 新浪微博的Redis部署
  • 11. 新浪微博的Redis部署
  • 12. 新浪微博的Redis部署
  • 13. 集合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"
  • 14. Pipeline模式发送多个命令,一次性接受多个命令 减少网络IO次数 服务器端将命令结果放进queue,再返回给客户端
  • 15. Redis server的主流程
  • 16. 连接及处理命令流程acceptTcpHandleracceptCommonHandlercreateClientaeCreateFileEvent(server.el,fd,AE_READABLE, readQueryFromClient, c)readQueryFromClientprocessInputBufferprocessCommandcall
  • 17. 自增长的hashtable每个db对应两条hash table,大多数情况下只用第一条hash table,第二条在增量hash时会使用,增量hash采用阶段性完成,单次拷贝不能超过1ms,以免影响前台应用过多响应时间。 bucket初始大小为4,以2的倍数进行动态扩展。 作增量rehash的过程中,新的值将会写到第二条hash table里。
  • 18. Hash_table的扩展条件 _dictKeyIndex(dict *d, const void *key) 调用_dictExpandIfNeeded(d) 判断条件: 当前已处于增量rehash过程中 return 当前hash table size =0 ? 初始化为4 elements/buckets >= 1:1
  • 19. 数据结构管理成本每个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;
  • 20. 数据结构管理成本每个struct dictEntry会有24 bytes的管理开销 typedef struct dictEntry { void *key; void *val; struct dictEntry *next; } dictEntry;
  • 21. Rdb持久化Fork一个进程,利用copy on write原理,遍历所有db的hash table,进行整库的dump Save命令,shutdown命令,slave启动都会触发 利用LZF进行压缩 持久化触发条件: #save 900 1 #save 300 10 #save 60 10000
  • 22. Aof持久化Aof:把写操作指令连续的写到一个文件里面 当redis server异常crash掉的时候,重启时将会进行如下的操作: 假如只配置了aof,起动时加载aof文件 假如同时配置了rdb,aof,起动时只加载aof文件 假如只配置了rdb,起动时将加载dump文件
  • 23. Redis replicationmasterslave log相当于mysql statement模式的SQL复制,以及ORACLE的逻辑standby.s Slave也可以进行读写操作
  • 24. 复制对TPS的影响(-30%)我自己写了一个jkc命令
  • 25. 复制时的jkc指令响应时间
  • 26. Slave shutdown或者重启
  • 27. Slave shutdown或者重启
  • 28. 不同的value_length(r:w=4:1)
  • 29. 不同的value_length(r:w=4:1)
  • 30. Redis客户端各种语言客户端支持 Java的Jedis,Jredis Php的Predis,phpredis Python的redis-py C的hiredis ….
  • 31. Jedis客户端Jedis,ShardJedis,ShardJedisPipeline 支持客户端分布式,ShardJedis。一致性哈希算法,采用TreepMap存储redis节点,murmur哈希函数计算key和server的值。默认虚拟160个节点,支持权重配置。 连接池管理。JedisPool。
  • 32. Q/Athanks