Presentation is loading. Please wait.

Presentation is loading. Please wait.

Www.redis.io 常优 www.auu.name weibo.com/changyou52 @网络电视事业部.

Similar presentations


Presentation on theme: "Www.redis.io 常优 www.auu.name weibo.com/changyou52 @网络电视事业部."— Presentation transcript:

1 常优 weibo.com/changyou52 @网络电视事业部

2 关于 Redis 关于 Redis Redis vs Memcached Redis 搭建 一些经验 TODOs

3 Redis: 定义 : 高性能的 key-value 内存数据库 官方性能测试: 50个并发环境下 SET: 110000次 / S
GET: 81000次 / S

4 Redis feature: 快,非常快 易部署 多语言API 支持数据类型:string、list、sets、Sorted Set
具有原子性操作 pop/push 持久化 支持的master/slave复制 支持虚拟内存

5 关于 Redis Redis vs Memcached Redis 搭建 一些经验 TODOs Redis vs Memcached

6 Memcached Redis 存储类型 原子性操作 虚拟内存 主从 内存达到临界 持久化 Strings Lists Sets
Sorted Sets Hashes 原子性操作 不支持 pop/push 虚拟内存 支持 主从 (MemcachedDB ) 内存达到临界 LUR算法踢出冷数据 配置expire 无法接收新的写请求 或启用VM,将冷数据写入swap 持久化 快照 AOF

7 性能对比 ( http://timyang.net/data/mcdb-tt-redis/ )
小数据:500w的条记录;每个 value:100 bytes Linux Centos bit Intel(R) Xeon(R) CPU E5410  8G memory SCSI disk

8 性能对比 ( http://timyang.net/data/mcdb-tt-redis/ )
大数据:500w的条记录;每个 value:20KB

9 并发对比 (http://antirez.com/post/redis-memcached-benchmark.html)
并发量:1~300;每个 value:32 bytes

10 Redis 更好 ! 。。。为什么? Redis基于事件机制的网络模型,使用小巧的事件处理框架 aeEvent,而
memcached使用了相对庞大的开源事件库: libevent Redis是单线程,而memcached是单进程多线程,所以,为防止资源争夺, memcached使用 了CAS协议,带来cpu内存消耗

11 关于 Redis Redis vs Memcached Redis 搭建 一些经验 TODOs Redis 搭建

12 1. 安装 2. 启动 Redis 2.2.4 (安装,启动) # tar xzf redis-2.2.4.tar.gz
# cd redis-2.2.4 # make [ Redis命令说明 ] redis-server :Redis服务器的daemon启动程序 redis-cli :Redis命令行操作工具 redis-benchmark : Redis性能测试工具 2. 启动 # ./src/redis-server /etc/redis.conf

13 3. 配置 redis.conf ( http://www.auu.name/634/index.html )
Daemonize: 是否以后台daemon方式运行 Maxmemory: 分配多少内存 Port: 监听的端口号 Loglevel: log信息级别 databases: 开启数据库的数量 rdbcompression: 是否使用压缩 save * *: 保存快照的频率 dir: 数据快照的保存目录 appendonly: 是否开启appendonlylog appendfilename: 指定更新日志文件名 appendfsync: appendonlylog如何同步到磁盘 vm-swap-file: tmp/redis.swap 设置虚拟内存的交换文件路径 Activerehashing: 开启之后,redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。 。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。

14 string:一个key对应一个value
Redis ( 数据类型 ) 4. 数据类型 string:一个key对应一个value redis> SET foo 1 OK redis> INCR foo (integer) 2 (integer) 3 redis> GET foo "3" redis> SET foo terry (error) ERR value redis> EXPIRE foo 10 (integer) 1 redis> TTL foo 10 incr(key) :名称为key的string增1操作 decr(key):名称为key的string减1操作 mget(key1, key2,…,):返回库中多个string的value mset(key1, value1, key2, value2….):同时给多个string赋值

15 List:链表结构,主要功能是push/pop,实现队列、栈等数据结构
Redis ( 数据类型 ) List:链表结构,主要功能是push/pop,实现队列、栈等数据结构 mylist -> [ A, B, C, D, E ] LPUSH LRANGE mylist 1 2 LINDEX mylist 4 RPUSH A B C D E LPOP LREM mylist 0 C RPOP

16 List 适用场景: Redis 2.2.4 ( 数据类型 ) 论坛中的主题列表、回复列表
微博中的用户关注列表、用户feed列表、用户关注feed列表 好友推荐,排行榜 消息队列

17 set: 小红, ,小刚 小兰, ,小铁 Redis 2.2.4 ( 数据类型 )
集合,对集合的操作有添加删除元素,有对多个集合求交并差等操作 redis> SADD newset a (integer) 1 redis> SADD newset b redis> SADD newset c redis> SADD myset b redis> SINTER newset myset # 求交集 1. "b" redis> SUNION newset myset # 求并集 1. "a" 2. "b" 3. "c“ redis> SMOVE newset myset a redis> SCARD newset (integer) 2 Afollowers 小红, ,小刚 小王 SINTER Bfollowers 小兰, ,小铁 小王

18 Redis ( 数据类型 ) zset: 他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序 redis> ZADD days 1 Mon (integer) 0 redis> ZADD days 3 Wed (integer) 1 redis> ZADD days 2 Tue redis> ZRANGE days 1. "Mon" 2. "Tue" 3. "Wed"

19 Hash: 几个key-value放入一个key中,value再作为一个set存入
Redis ( 数据类型 ) Hash: 几个key-value放入一个key中,value再作为一个set存入 redis> HSET user name changyou (integer) 1 redis> HSET user work redis> HGET user name "changyou" redis> HGETALL user 1. "name" 2. "changyou" 3. "work" 4. " " 特点: 当你存储的数据对象只有很少几个key值时,内存消耗会很小

20 Transactions: MULTI之后的命令都会放到一个队列中,直到使用 EXEC 命令或者使用
Redis ( 数据类型 ) Transactions: MULTI之后的命令都会放到一个队列中,直到使用 EXEC 命令或者使用 DISCARD丢弃所有的命令。 redis> MULTI OK redis> SET foo 0 QUEUED redis> INCR foo redis> EXEC 1. OK 2. (integer) 1 3. (integer) 2 redis> GET foo "2" redis> SET bar 0 redis> INCR bar redis> DISCARD redis> GET bar "0" 可使用MULTI命令可实现简单事务

21 5. Redis 命令 ( http://www.auu.name/1154/index.html )

22 6. API - C, C#, Java, python, Node.js, ruby,PHP
Redis ( API ) 6. API - C, C#, Java, python, Node.js, ruby,PHP phpredis: # wget # unzip owlient-phpredis-5a07edc.zip # cd owlient-phpredis-5a07edc /usr/local/web/php/bin/phpize # ./configure -with-php-config=/usr/local/web/php/bin/php-config # make # make install <?PHP $redis = new redis(); $redis->connect(‘ ′,6379 ); $redis->set(‘test_key’,'hello world!’); echo $redis->get(‘test_key’); ?>

23 7. 持久化 SnapShot(快照方式) Redis 2.2.4 ( 持久化 ) 频率控制 ( redis.conf ): 过程:
save #900秒超过1个key被修改 save #300秒超过10个key被修改 save #60 秒超过一万条被修改 过程: Redis通过fork产生子进程 父进程继续处理client请求,子进程负责将快照写入文件 父进程为新增数据创建副本 子进程dump完成后,父进程用副本代替原来的快照 子进程退出 缺点: 磁盘 I/O 大, CPU使用率高

24 AOF (Append-Only File)
Redis ( 持久化 ) AOF (Append-Only File) AOF: 将每次修改数据的命令,追加到文件中 日志写入频率控制: appendfsync always appendfsync everysec //默认配置 appendfsync no 缺点: 开启AOF后,影响Redis性能,但不大 日志随数据增加而越来越庞大

25 8. 虚拟内存 VM 目的: 解决内存合理利用,冷热数据分离 配置: 实现: Redis 2.2.4 ( VM )
vm-enabled yes                #开启vm功能 vm-swap-file /tmp/redis.swap    #交换出来的value保存的文件路径 vm-max-memory      #redis使用的最大内存上限,超过开始交换 vm-page-size 32                   #每个页面的大小32个字节 vm-pages            #交换文件的大小 = vm-page-size * vm-pages vm-max-threads 4           #用于执行value对象换入换出的工作线程数量 实现: 超出最大使用内存时,通过LRU算法,将一部分数据swap到磁盘 为了控制交换的粒度,Redis自己实现了一条VM机制

26 9. 主从 Redis 2.2.4 ( replication ) 配置从库 redis_slave.conf 启动从库 工作原理
port #从库的端口 dbfilename dump_slave.rdb #从库数据 slaveof #主库的端口 启动从库 redis-server  /etc/redis_slave.conf 工作原理 建立连接,从库向主库发送同步请求 主库开启新线程保存当前数据为文件,主线程继续处理client写请求并缓存 主库向从库传文件,从库保存文件并加载到内存中 主库把刚才client请求的缓存命令转发给从库 后续主库收到的写命令都会发送给从库

27 关于 Redis Redis vs Memcached Redis 搭建 一些经验 TODOs 一些经验

28 到底要不要 持久化? 内存大量消耗引起系统瓶颈 Redis作者强调:最佳使用方式是 in-memory 症状: 原因:
内存占用翻番,子进程独享一个cpu核心,占用100%,如内存不够,时间久了宕机 原因: 开启了数据压缩 通过 copy-on-write 把内存里的数据写入磁盘,所以,一旦 dump时,有写操作,则需要额外内存 copy-on-write ? 父进程 fork 子进程,子进程指向父进程的地址空间,而当子进程真正执行写操作时,才会真正复制子进程空间 Redis作者强调:最佳使用方式是 in-memory

29 如果选择 持久化 ! 必须预留一半内存 使用 AOF 代替 snapshot
持久化的粒度较小:对性能有较大影响,磁盘大量io操作 持久化的粒度较大:宕机会丢失最后一次快照后的所有修改 AOF: 记录每次修改语句, 类似MySQL binlog,而且日志可读 使用AOF持久,需人肉调用 bgrewriteaof 命令整理日志 将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件 之前可能用了10w次操作共改变了100条数据,那这时AOF中的10w条写操作记录 就变成了100条记录

30 不要使用 VM! Redis VM 不靠谱,作者说新版本将放弃VM 症状: 方案: 关闭虚拟内存,加大物理内存或者做数据sharding
使用虚拟内存后,内存使用量明显下降;但是在插入数据后(sadd),虚拟内存里的数据基本上都跑到内存中,也没有回去的意思;最后在数据dump的时候内存彻底耗光,CPU100% 方案: 关闭虚拟内存,加大物理内存或者做数据sharding

31 VM 性能测试 配置: 1K的数据量 物理内存24G 开启VM,最大内存8G 开启压缩

32 使用 hset 代替set 适用场景:key比较少的同一对象中 对象:video id : 1 name : funny game
time : created_time : HSET video:1 name “funny game” HSET video:1 time 100 HSET video:1 created_time HLEN video:1 == 3 HGET video:1 name == “funny game” HKEYS video:1 == name , time, created_time HGETALL video:1 == name => funny game time => 100 created_time =>

33 主从 架构 方案: 主库在内存中运行,从库不提供线上服务只做持久化备份 Redis 缺少同步机制常见的check point和校验机制
如果同步请求转发丢失, 一致性无法保证,只有slave重启时全量加载才能修复 方案: 主库在内存中运行,从库不提供线上服务只做持久化备份 Master Slave Replcation 纯内存 备份,持久化

34 分布式 架构 单机多节点 ( 节点数=CPU - 1 ) 分布式缓存 (一致性哈希) 6G 6G 6G 预留6G
Redis1:6380 每天2点 6G redis redis Redis2:6381 每天3点 6G Redis3:6382 每天4点 6G 预留6G redis redis 分时间段 bgrewriteaof 充分提高内存使用率

35 分布式 架构 应用层 sharding 数据分片 sharding R/W R/W R/W master1 master2 master3
slave1 slave2 slave3 备份 备份 备份

36 规划 / 监控 Redis 需仔细规划 内存限制? 存什么数据? 数据增多,如何扩展? 读写瓶颈,如何扩展? 不仅要规划,还要严密监控

37 驾驭能力是关键!! 是否适合当前应用场景 团队能不能驾驭 如何解读Redis

38 关于 Redis Redis vs Memcached Redis 搭建 一些经验 TODOs TODOs

39 Cluster Persistence Auto sharding Fault tolerance Diskstore LRU
Cache-Flush-Delay

40 参考 http://www.redis.io/

41 Q / A Thanks 常优 weibo.com/changyou52


Download ppt "Www.redis.io 常优 www.auu.name weibo.com/changyou52 @网络电视事业部."

Similar presentations


Ads by Google