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