Your SlideShare is downloading. ×
Redis介绍
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Redis介绍

1,193

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,193
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
52
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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的类型为sdsValue的类型为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 1024hash-max-zipmap-value 100
  • 9. 新浪微博的Redis部署
  • 10. 新浪微博的Redis部署
  • 11. 新浪微博的Redis部署
  • 12. 新浪微博的Redis部署
  • 13. 集合sets操作• redis> sadd students danchen redis> srem students hi (integer) 1 (integer) 1 redis> srem students hi• redis> sadd students baby (integer) 0 (integer) 1 redis> spop students• redis> sadd students hello "danchen" (integer) 1 redis> spop students• redis> sadd students hi "wwww" redis> scard students (integer) 1 (integer) 4• redis> sadd students wwww redis> sort students (integer) 1 1) "hello"• redis> sadd students 2) "supu" wwww.taobao.com 3) "wwww.taobao.com" (integer) 1 4) "baby"• redis> sadd students supu (integer) 1• redis> sadd students supu (integer) 0
  • 14. Pipeline模式• 发送多个命令,一次性接受多个命令 减少网络IO次数• 服务器端将命令结果放进queue,再返回给 客户端
  • 15. Redis server的主流程
  • 16. 连接及处理命令流程 acceptTcpHandler readQueryFromClient processInputBuffer acceptCommonHandler processCommand createClientaeCreateFileEvent(server.el,fd,AE_READABLE, call readQueryFromClient, c)
  • 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 replication相当于mysql statement模式的SQL复制,以及ORACLE的逻辑standby.s log master slave 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<String,ShardInfo>存 储redis节点,murmur哈希函数计算key和 server的值。默认虚拟160个节点,支持权 重配置。• 连接池管理。JedisPool。
  • 32. Q/A• thanks

×