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 tableKey的类型为sdsValue的类型为redisobject
Redis在value上的不同设计之处
Redis的应用场景对复杂数据结构的良好支持像SNS中的关系,以及一些计数类的需求
Redis的常用操作get/set/mset/mgetlpush/lpop,lpush/rpophget/hset/hgetallsadd/srem/spop/scard/sortdel  key/move key indexinforsave/bgsave/bgrewriteaof/lastsaveflushall
关系与分页lpush,rpop,lpop实现队列与栈与操作相关的两个配置参数:list-max-ziplist-entries  512 个数list-max-ziplist-value   15     长度如果任何一个条件不满足,进入listTypeConvert函数,转化成双链表与lrange,mget组合,可以实现列表类的一些业务场景与lrange,多次hgetall组合
结构化数据存取需求redis> hsetdanchenguanzhu 195(integer) 1redis> hsetdanchen fans 3769(integer) 1redis> hsetdanchenmicroblogs 418(integer) 1redis> redis> redis> hgetalldanchen1) "guanzhu"2) "195"3) "fans"4) "3769"5) "microblogs"6) "418"两个控制参数:hash-max-zipmap-entries 1024 hash-max-zipmap-value 100
新浪微博的Redis部署
新浪微博的Redis部署
新浪微博的Redis部署
新浪微博的Redis部署
集合sets操作redis> srem students hi(integer) 1redis> srem students hi(integer) 0redis> spop students"danchen"redis> spop students"wwww"redis> scard students(integer) 4redis> sort students1) "hello"2) "supu"3) "wwww.taobao.com"4) "baby"redis> sadd students danchen      (integer) 1redis> sadd students baby      (integer) 1redis> sadd students hello      (integer) 1redis> sadd students hi      (integer) 1redis> sadd students wwww       (integer) 1redis> sadd students wwww.taobao.com      (integer) 1redis> sadd students supu      (integer) 1redis> sadd students supu      (integer) 0
Pipeline模式发送多个命令,一次性接受多个命令减少网络IO次数服务器端将命令结果放进queue,再返回给客户端
Redis server的主流程
连接及处理命令流程acceptTcpHandlerreadQueryFromClientprocessInputBufferacceptCommonHandlerprocessCommandcreateClientcallaeCreateFileEvent(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,进行整库的dumpSave命令,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.smasterslave logSlave也可以进行读写操作
复制对TPS的影响(-30%)我自己写了一个jkc命令
复制时的jkc指令响应时间
Slave shutdown或者重启
Slave shutdown或者重启
不同的value_length(r:w=4:1)
不同的value_length(r:w=4:1)
Redis客户端各种语言客户端支持Java的Jedis,JredisPhp的Predis,phpredisPython的redis-pyC的hiredis….
Jedis客户端Jedis,ShardJedis,ShardJedisPipeline支持客户端分布式,ShardJedis。一致性哈希算法,采用TreepMap<String,ShardInfo>存储redis节点,murmur哈希函数计算key和server的值。默认虚拟160个节点,支持权重配置。连接池管理。JedisPool。
Q/Athanks

Redis介绍