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

Slides:



Advertisements
Similar presentations
本章重点内容  SMB 协议和 Samba 简介  安装和启动 Samba  配置 Samba 文件共享  配置 Samba 打印共享  在 Linux 环境下访问 Samba 共享.
Advertisements

动态网站开发 【HTTP与网络基础】 李博杰
电子工业出版社《云计算(第二版)》配套课件
分布式系统 Distributed Systems 第 12 讲 “大型”网站架构设计 Lecture 12 Large Scale Website Architecture 王晓阳、张 奇 复旦大学 计算机科学技术学院.
DATE: 14/10/2009 陳威宇 格網技術組 雲端運算相關應用 (Based on Hadoop)
存储基础知识 V1.1.
毛峰教授 北京师范大学教授,博士生导师 国家社科基金项目专家 北京华文教育顾问
厦门大学数据库实验室 刘颖杰 2014年11月15日 实习总结报告 厦门大学数据库实验室 刘颖杰 2014年11月15日.
"與心理助人專業技巧對話"---- 助人技巧的學習與反思1
应用性能管理提升客户体验 龙珠客户案例分享 肖澍 云智慧公司.
大型、高负载网站架构和应用初探.
——支持千万级DAU的Social Game技术构架
MongoDB技术交流 主讲:刘天斯.

基于CloudFoundry的私有云平台
穆公(朱金清 微博:淘穆公 阿里HBase业务设计实践 穆公(朱金清 微博:淘穆公
云智慧助力在线医疗服务性能优化 —让IT运营更简单 2015年4月 云智慧科技(北京)有限公司.
集群作业管理系统简介 报告人:罗正平 导 师:肖炳甲研究员.
2013华东数据库技术大会 MySQL5.6版InnoDB引擎深入剖析 演讲嘉宾:何登成
MHA(Master High Availability) 作者
系統安全期末報告 網管實務經驗探討-十人以下中小企業為例
MySQL主从同步
伺服器網路檢測與管理 資訊中心網路管理組 王裕仁 2006/06/29.
天涯运维的那些事 网络系统部.天涯.
Canal开源产品介绍 taobao.
58同城从MongoDB到MySQL迁移之路
校园水果店 ——中山大学南方学院的第一间水果店.
课程名称 黄杉 讲师的CSDN博客地址:
Google App Engine Google 應用服務引擎.
Ch07 PHP程式基礎 網頁程式設計.
Linux.
指導教授:黃 燕 忠 教授 研究生 :李欣衛 謝士傑
主讲教师:唐大仕 第5讲 计算机硬件 主讲教师:唐大仕
Alibaba 数据库高可用架构 Alibaba
第 13 章 DNS 著作權所有 © 旗標出版股份有限公司.
主講人:葉致偉 交大校園網路策進會 臺灣學術網路竹苗區域網路中心 89年網路教育推廣訓練課程 Proxy Server 規劃管理 主講人:葉致偉 交大校園網路策進會
數位邏輯的基礎.
課程名稱:資料庫系統 授課老師:李春雄 博士
第五讲 数据的分组、合并与转换.
精通redis数据库开发、管理与优化 第1讲 什么是redis 讲师:黄锡峰.
高并发之Redis初级 讲师:杨振平 博客地址:blog.csdn.net/yangzhenping
第二天 计算机基础技能培训 (一)linux基础知识
浅谈MySql索引及锁的应用 厦门大学数据库实验室 刘颖杰 2014年3月8日.
Windows與Linux資源共享 SAMBA
NS2 – TCP/IP Simulation How-Wei Wu.
An Introduction to Cloud RDBMS
Redis 客户端和工具集 潘海龙 平安健康互联网
雲端計算.
架站實做—AppServ
利用ICE通信中间件构建分布式应用程序开发框架
性能的秘诀 chrome插件支持推送.
Confidential Property
贈與契約.
作業系統 Operating System 第四單元 檔案系統
2011 邀请中国姐妹学校韩国语研修团项目 申请时间: ~5月 27日 / 项目地点: 汉阳大学 安山校区 / 项目时间: (星期日) ~ 7.22(星期五) 费用: 100万元(韩币/人 (包含项目 - 学费, 教材费, 宿舍费, 接机费用及所有文化体验活动项目费用)
计算机系统结构(2012年春) ----存储层次: Cache基本概念
第7章 進階的同步 觀念與實務.
講員:游文志 排程系統教育訓練 後台管理系統 講員:游文志
第六章 記憶體.
教育部特殊教育通報網 學生異動、接收操作說明.
指導老師:詹進科、陳育毅 開發團隊 : 呂峻豪、謝佳峻、黃傳強 中興大學資訊科學與工程學系 2015/12/11
課程名稱:資料庫系統 授課老師:李春雄 博士
高级大数据人才培养丛书之一,大数据挖掘技术与应用
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
大数据应用人才培养系列教材 Python语言 刘 鹏 张 燕 总主编 李肖俊 主编 刘 河 钟 涛 副主编.
第十二章 Java网络编程 1.URL编程 2.Socket网络编程 3.Datagram网络编程.
雲端計算.
银川社保网上申报 宁夏人力资源和社会保障 网上服务大厅操作
Redis
数据库应用技术 天津电大 翟迎建.
Presentation transcript:

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

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

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

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

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

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

性能对比 ( 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

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

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

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

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

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

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,可以降低内存的使用。 。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。

string:一个key对应一个value Redis 2.2.4 ( 数据类型 ) 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赋值

List:链表结构,主要功能是push/pop,实现队列、栈等数据结构 Redis 2.2.4 ( 数据类型 ) 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

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

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 小兰, ,小铁 小王

Redis 2.2.4 ( 数据类型 ) 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 0 -1 1. "Mon" 2. "Tue" 3. "Wed"

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

Transactions: MULTI之后的命令都会放到一个队列中,直到使用 EXEC 命令或者使用 Redis 2.2.4 ( 数据类型 ) 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命令可实现简单事务

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

6. API - C, C#, Java, python, Node.js, ruby,PHP Redis 2.2.4 ( API ) 6. API - C, C#, Java, python, Node.js, ruby,PHP phpredis: # 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’); ?>

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

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

8. 虚拟内存 VM 目的: 解决内存合理利用,冷热数据分离 配置: 实现: Redis 2.2.4 ( 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对象换入换出的工作线程数量 实现: 超出最大使用内存时,通过LRU算法,将一部分数据swap到磁盘 为了控制交换的粒度,Redis自己实现了一条VM机制

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

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

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

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

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

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

使用 hset 代替set 适用场景:key比较少的同一对象中 对象:video id : 1 name : funny game time : 100 created_time : 129014998 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

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

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

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

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

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

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

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

参考 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/

Q / A Thanks 常优 www.auu.name weibo.com/changyou52