Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,457
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
133
Comments
0
Likes
13

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 常优 www.auu.name weibo.com/changyou52 @ 网络电视事业部 www.redis.io
  • 2.
    • 关于 Redis
    • Redis vs Memcached
    • Redis 搭建
    • 一些经验
    • TODOs
    • 关于 Redis
  • 3. 定义 : 高性能的 key-value 内存数据库
        • 官方性能测试 :
        • 50 个并发环境下 SET : 110000 次 / S
        • GET : 81000 次 / S
    Redis :
  • 4.
    • 快,非常快
    • 易部署
    • 多语言 API
    • 支持数据类型: string 、 list 、 sets 、 Sorted Set
    • 具有原子性操作 pop/push
    • 持久化
    • 支持的 master/slave 复制
    • 支持虚拟内存
    Redis feature :
  • 5.
    • 关于 Redis
    • Redis vs Memcached
    • Redis 搭建
    • 一些经验
    • TODOs
    • Redis vs Memcached
  • 6. Memcached Redis 存储类型 Strings
    • Strings
    • Lists
    • Sets
    • Sorted Sets
    • Hashes
    原子性操作 不支持 pop/push 虚拟内存 不支持 支持 主从 不支持 ( MemcachedDB ) 支持 内存达到临界
    • LUR 算法踢出冷数据
    • 配置 expire
    • 无法接收新的写请求
    • 或启用 VM ,将冷数据写入 swap
    持久化 不支持 ( MemcachedDB )
    • 快照
    • AOF
  • 7. 性能对比 ( http://timyang.net/data/mcdb-tt-redis/ ) 小数据 : 500w 的条记录;每个 value : 100 bytes Linux Centos 5.2 64bit Intel(R) Xeon(R) CPU E5410  8G memory SCSI disk
  • 8. 大数据: 500w 的条记录;每个 value : 20KB 性能对比 ( http://timyang.net/data/mcdb-tt-redis/ )
  • 9. 并发量 : 1~300 ;每个 value : 32 bytes 并发对比 ( http://antirez.com/post/redis-memcached-benchmark.html )
  • 10. Redis 更好 ! 。。。为什么?
    • Redis 基于事件机制的网络模型,使用小巧的事件处理框架 aeEvent ,而
    • memcached 使用了相对庞大的开源事件库: libevent
    • Redis 是单线程,而 memcached 是单进程多线程,所以,为防止资源争夺,
    • memcached 使用 了 CAS 协议,带来 cpu 内存消耗
  • 11.
    • 关于 Redis
    • Redis vs Memcached
    • Redis 搭建
    • 一些经验
    • TODOs
    • Redis 搭建
  • 12. # 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 性能测试工具 1. 安装 # ./src/redis-server /etc/redis.conf 2. 启动 Redis 2.2.4 (安装,启动)
  • 13. 3. 配置 redis.conf ( http://www.auu.name/634/index.html ) Redis 2.2.4 ( 配置 ) 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. 4. 数据类型
    • string : 一个 key 对应一个 value
    Redis 2.2.4 ( 数据类型 ) redis> SET foo 1 OK redis> INCR foo (integer) 2 redis> INCR foo (integer) 3 redis> GET foo "3" redis> SET foo terry OK redis> INCR foo (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 2.2.4 ( 数据类型 ) A B C D E LPUSH mylist -> [ A, B, C, D, E ] LPOP RPOP RPUSH LREM mylist 0 C LINDEX mylist 4 LRANGE mylist 1 2
  • 16.
    • List 适用场景:
    Redis 2.2.4 ( 数据类型 )
    • 论坛中的主题列表、回复列表
    • 微博中的用户关注列表、用户 feed 列表、用户关注 feed 列表
    • 好友推荐,排行榜
    • 消息队列
  • 17.
    • set :
    集合,对集合的操作有添加删除元素,有对多个集合求交并差等操作 Redis 2.2.4 ( 数据类型 ) redis> SADD newset a (integer) 1 redis> SADD newset b (integer) 1 redis> SADD newset c (integer) 1 redis> SADD myset b (integer) 1 redis> SINTER newset myset # 求交集 1. "b" redis> SUNION newset myset # 求并集 1. "a" 2. "b" 3. "c“ redis> SMOVE newset myset a (integer) 1 redis> SCARD newset (integer) 2 小红, ,小刚 小兰, ,小铁 小王 小王 SINTER Afollowers Bfollowers
  • 18.
    • zset :
    他在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后, zset 会自动重新按新的值调整顺序 Redis 2.2.4 ( 数据类型 ) redis> ZADD days 1 Mon (integer) 0 redis> ZADD days 3 Wed (integer) 1 redis> ZADD days 2 Tue (integer) 1 redis> ZRANGE days 0 -1 1. "Mon" 2. "Tue" 3. "Wed"
  • 19.
    • Hash : 几个 key-value 放入一个 key 中, value 再作为一个 set 存入
    Redis 2.2.4 ( 数据类型 ) redis> HSET user name changyou (integer) 1 redis> HSET user work www.cntv.cn (integer) 1 redis> HGET user name "changyou" redis> HGETALL user 1. "name" 2. "changyou" 3. "work" 4. "www.cntv.cn " 当你存储的数据对象只有很少几个 key 值时,内存消耗会很小 特点:
  • 20.
    • Transactions : MULTI 之后的命令都会放到一个队列中,直到使用 EXEC 命令或者使用
    • DISCARD 丢弃所有的命令。
    Redis 2.2.4 ( 数据类型 ) redis> MULTI OK redis> SET foo 0 QUEUED redis> INCR foo QUEUED redis> INCR foo QUEUED redis> EXEC 1. OK 2. (integer) 1 3. (integer) 2 redis> GET foo "2" redis> MULTI OK redis> SET bar 0 QUEUED redis> INCR bar QUEUED redis> INCR bar QUEUED redis> DISCARD OK redis> GET bar "0" 可使用 MULTI 命令可实现简单事务
  • 21. 5. Redis 命令 ( http://www.auu.name/1154/index.html ) Redis 2.2.4
  • 22. 6. API - C, C#, Java, python, Node.js, ruby,PHP # wget https://github.com/owlient/phpredis/zipball/2.1.1 # 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 (‘127.0.0.1′,6379 ); $redis -> set (‘test_key’,'hello world!’); echo $redis -> get (‘test_key’); ?> phpredis : Redis 2.2.4 ( API )
  • 23. 7. 持久化
    • Redis 通过 fork 产生子进程
    • 父进程继续处理 client 请求,子进程负责将快照写入文件
    • 父进程为新增数据创建副本
    • 子进程 dump 完成后,父进程用副本代替原来的快照
    • 子进程退出
    save 900 1 #900 秒超过 1 个 key 被修改 save 300 10 #300 秒超过 10 个 key 被修改 save 60 10000 #60 秒超过一万条被修改 频率控制 ( redis.conf ) : 过程: 缺点:
      • 磁盘 I/O 大, CPU 使用率高
    Redis 2.2.4 ( 持久化 )
    • SnapShot (快照方式)
  • 24.
    • AOF (Append-Only File)
    将每次修改数据的命令,追加到文件中 appendfsync always appendfsync everysec // 默认配置 appendfsync no 日志写入频率控制 : 缺点:
      • 开启 AOF 后,影响 Redis 性能,但不大
      • 日志随数据增加而越来越庞大
    AOF : Redis 2.2.4 ( 持久化 )
  • 25. 8. 虚拟内存 Redis 2.2.4 ( VM ) VM 目的:
      • 解决内存合理利用,冷热数据分离
    配置: 实现: vm-enabled yes                  # 开启 vm 功能 vm-swap-file /tmp/redis.swap      # 交换出来的 value 保存的文件路径 vm-max-memory 1000000      #redis 使用的最大内存上限,超过开始交换 vm-page-size 32                     # 每个页面的大小 32 个字节 vm-pages 134217728             # 交换文件的大小 = vm-page-size * vm-pages vm-max-threads 4             # 用于执行 value 对象换入换出的工作线程数量 为了控制交换的粒度, Redis 自己实现了一条 VM 机制 超出最大使用内存时,通过 LRU 算法,将一部分数据 swap 到磁盘
  • 26. 9. 主从 port 6379 # 从库的端口 dbfilename dump_slave.rdb # 从库数据 slaveof 127.0.0.1 6380 # 主库的端口 配置从库 redis_slave.conf redis-server  /etc/redis_slave.conf 启动从库 Redis 2.2.4 ( replication )
    • 工作原理
      • 建立连接,从库向主库发送同步请求
      • 主库开启新线程保存当前数据为文件,主线程继续处理 client 写请求并缓存
      • 主库向从库传文件,从库保存文件并加载到内存中
      • 主库把刚才 client 请求的缓存命令转发给从库
      • 后续主库收到的写命令都会发送给从库
  • 27.
    • 关于 Redis
    • Redis vs Memcached
    • Redis 搭建
    • 一些经验
    • TODOs
    • 一些经验
  • 28. 到底要不要 持久化?
    • 内存大量消耗引起系统瓶颈
    • 通过 copy-on-write 把内存里的数据写入磁盘,所以,一旦
    • dump 时,有写操作,则需要额外内存
    copy-on-write ? 父进程 fork 子进程,子进程指向父进程的地址空间,而当子进程真正执行写操作时,才会真正复制子进程空间 原因: 症状: 内存占用翻番,子进程独享一个 cpu 核心,占用 100% ,如内存不够,时间久了宕机
    • 开启了数据压缩
    • Redis 作者强调:最佳使用方式是 in-memory
  • 29. Snapshot :
    • 使用 AOF 代替 snapshot
    AOF : 持久化的粒度较小:对性能有较大影响,磁盘大量 io 操作 持久化的粒度较大:宕机会丢失最后一次快照后的所有修改 记录每次修改语句, 类似 MySQL binlog ,而且日志可读
    • 将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件
    • 之前可能用了 10w 次操作共改变了 100 条数据,那这时 AOF 中的 10w 条写操作记录
    • 就变成了 100 条记录
    • 使用 AOF 持久,需人肉调用 bgrewriteaof 命令整理日志
    • 必须预留一半内存
    如果选择 持久化 !
  • 30.
    • Redis VM 不靠谱,作者说新版本将放弃 VM
      • 关闭虚拟内存,加大物理内存或者做数据 sharding
    方案: 不要使用 VM ! 使用虚拟内存后,内存使用量明显下降;但是在插入数据后 (sadd) ,虚拟内存里的数据基本上都跑到内存中,也没有回去的意思;最后在数据 dump 的时候内存彻底耗光, CPU100% 症状:
  • 31.
    • 配置:
    • 1K 的数据量
    • 物理内存 24G
    • 开启 VM ,最大内存 8G
    • 开启压缩
    • VM 性能测试
  • 32. 使用 hset 代替 set 对象: video id : 1 name : funny game time : 100 created_time : 129014998
    • 适用场景: key 比较少的同一对象中
    HSET video:1 name “funny game” HSET video:1 time 100 HSET video:1 created_time 129014998 --------------------------------------------------- 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 => 129014998
  • 33. Master Slave Replcation 纯内存 备份 , 持久化 主从 架构
    • Redis 缺少同步机制常见的 check point 和校验机制
    • 如果同步请求转发丢失 , 一致性无法保证,只有 slave 重启时全量加载才能修复
    方案: 主库在内存中运行,从库不提供线上服务只做持久化 备份
  • 34.
    • 分布式缓存 ( 一致性哈希 )
    分布式 架构 预留 6G
    • 单机多节点 ( 节点数 =CPU - 1 )
    Redis1 : 6380 Redis2 : 6381 Redis3 : 6382 每天 3 点 每天 4 点 每天 2 点 6G 6G 6G redis redis redis redis
    • 分时间段 bgrewriteaof
    • 充分提高内存使用率
  • 35. 分布式 架构 应用层 sharding master1 slave1 master2 slave2 slave3 master3 备份 备份 备份 R/W R/W R/W
    • sharding 数据分片
  • 36.
    • Redis 需仔细规划
    • 内存限制?
    • 存什么数据?
    • 数据增多,如何扩展?
    • 读写瓶颈,如何扩展?
    • 不仅要规划,还要严密监控
    规划 / 监控
  • 37. 驾驭能力是关键!!
    • 是否适合当前应用场景
    • 团队能不能驾驭
    • 如何解读 Redis
  • 38.
    • 关于 Redis
    • Redis vs Memcached
    • Redis 搭建
    • 一些经验
    • TODOs
    • TODOs
  • 39.
    • Cluster
    • Auto sharding
    • Fault tolerance
    • Persistence
    • Diskstore
    LRU Cache-Flush-Delay
  • 40. 参考 http://www.redis.io/ http://blog.mjrusso.com/2010/10/17/redis-from-the-ground-up.html http://pauladamsmith.com/articles/redis-under-the-hood.html http://pauladamsmith.com/blog/2011/03/redis_get_set.html http://timyang.net/tag/redis/ http://searchwiki.taobao.ali.com/index.php/Redis-2.0.4_RTFSC http://simonwillison.net/static/2010/redis-tutorial/ http://www.rediscookbook.org/
  • 41. Thanks 常优 www.auu.name weibo.com/changyou52 Q / A