- 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