1 / 32

Redis 介绍

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

damara
Download Presentation

Redis 介绍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation 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 table Key的类型为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> hsetdanchenguanzhu 195 (integer) 1 redis> hsetdanchen fans 3769 (integer) 1 redis> hsetdanchenmicroblogs 418 (integer) 1 redis> redis> redis> hgetalldanchen 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> 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" • 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

  14. Pipeline模式 • 发送多个命令,一次性接受多个命令 减少网络IO次数 • 服务器端将命令结果放进queue,再返回给客户端

  15. Redis server的主流程

  16. 连接及处理命令流程 acceptTcpHandler readQueryFromClient processInputBuffer acceptCommonHandler processCommand createClient call aeCreateFileEvent(server.el,fd,AE_READABLE, 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的管理开销 typedefstructredisObject { 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) */ intrefcount; void *ptr; /* 数据真正存放的地方*/ } robj;

  20. 数据结构管理成本 每个structdictEntry会有24 bytes的管理开销 typedefstructdictEntry { void *key; void *val; structdictEntry *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 master slave log 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

More Related