redis quick tour
TRANSCRIPT
舒铭(新浪微博@思门)
2011/9/19
CAP理论
CAP理论
C:一致性
A:可用性
P:分区容忍性
RDBMS满足CA
NoSQL满足AP
实现最终一致性
NoSQL百花齐放
Wide Column Store/Column Families:
Hadoop/Hbase
Cassandra
Document Store:
MongoDB
CouchDB
Key Value/Tuple Store:
Redis
Tokyo Cabinet/Tyrant
MemcacheDB
认识Redis
Redis 是一款完全开源,支持多种数据结构(string,hashes,list,set,sorted set)的高级Key Value数据库。
Who’s using Redis?
版本更新频繁,社区用户活跃
官方网站:http://redis.io/
作者博客:http://antirez.com/
安装使用
安装$ cd src/redis
$ ./configure
$ make
$ make install
使用$ /path/to/redis-server /path/to/redis.conf
$ /path/to/redis-cli
redis 127.0.0.1:6379> …
尝试
http://try.redis-db.com/
客户端丰富
ActionScript,C,C#,C++,Clojoure,Common Lisp,Erlang,Go,Haskell,haXe,Io,Java,Lua,Node.js,Objective-C,Perl,PHP,Pure Data,Python,Ruby,Scala,Smalltalk,Tcl……
Predis* https://github.com/nrk/predis
phpredis* https://github.com/nicolasff/phpredis
redisent https://github.com/jdp/redisent
Benchmark
官方宣称测试结果:
SET操作 110000/rps
GET操作 81000/rps
redis-benchmark –q
K-V缓存(VS memcached)
单Key容量
Memcache 1MB ~ Redis 1GB
数据持久化
Redis默认开启持久化,数据定期交换到磁盘中,断电数据不会丢失。
丰富的数据结构
String,Hashes,List,Set,Sorted Set
树状主从结构
Redis支持一主多从,从服务器也可作为其他从服务器的主节点。
消息队列(VS HTTPSQS)
传输协议
HTTPSQS基于HTTP协议
Redis基于TCP协议
实测性能
10w条数据,每条512字节,10个并发连接,Keep Alive
HTTPSQS: post: 23018/rps
get : 25982/rps
Redis:lpush: 65530/rps
lpop: 66622/rps
HTTPSQS底层数据库TT/TC已停止更新
数据结构:String
常用命令:
SET,GET,DEL,DECR,INCR,MGET等
应用场景:
默认Key/Value存储
原子操作计数器
数据结构:List
常用命令:
LPUSH,RPUSH,LPOP,RPOP,LRANGE,LLEN等。
应用场景:
双向链表消息队列
列表格式数据存储
数据结构:Set
常用命令:
SADD,SPOP,SMEMBERS,SCARD等。
应用场景:
数据不重复,执行排重操作
实现好友关注列表交集,并集,差集(共同关注,共有粉
丝,可能认识的人)
数据结构:Sorted Set
常用命令:
ZADD,ZRANGE, ZREM,ZCARD等。
应用场景:
有序集合,可以设置数据权重值
积分排行榜
数据结构:Hash
常用命令:
HSET,HGET,HGETALL,HEXISTS等。
应用场景:
类似PHP关联数组
避免序列化保存时,数据并发修改写入冲突
Pub/Sub
常用命令:
SUBSCRIBE/UNSUBSCRIBE,PUBLISH
应用场景:
观察者模式
实时消息队列,即时IM,聊天室
应用场景
取最新N个数据的操作实现文章评论列表,将最新5000条评论的ID放在Redis的List集合中,5000条之后的数据存放在数据库中。
• LPUSH latest.comments <ID>,向List中插入ID
• 插入完成后通过LTRIM latest.comments 0 5000使其永远只保存最近5000个ID
• LRANGE lastest.comments 0 9,获取前10条数据
排行榜应用,取TOP N操作在Sorted Set中以某个条件作为权重,以此进行排序。 ZADD student.english 80 LiLei,向有序集合中插入成绩。 ZREVRANGEBYSCORE student.english 100 60,找出成绩在
60-100分之间的学生。
应用场景
需要精准设定过期时间的应用
同样使用Sorted Set的score值记录数据过期时间时间戳,通
过定时任务取出这些数据,并在数据库中删除。
计数器应用
Uniq操作,获取某段时间所有数据排重值
利用Set的天然排重特性,把数据往Set中存放,同值内容将
不会被保存。
应用场景
实时系统,反垃圾系统
Pub/Sub构建实时消息系统
构建队列系统
缓存
持久化
Snapshotting快照
save 900 1 #after 900s if at least 1 key changed
save 300 10 #after 300s if at least 10 key changed
save 60 10000 #after 60s if at least 10000 key changed
优点
读写性能最佳
缺点
数据可靠性差,重启会丢失内存中未同步数据
持久化
快照工作原理 Redis fork进程。此时会有一个父进程和一个子进程。
父进程继续处理来自client的请求,子进程负责将内存中的
数据写入至一个临时生成的RDB文件中。
当子进程写入操作完毕后,用该临时文件替换掉原先使用
的RDB文件。
持久化
Append Only File(AOF)增量文件appendonly yes
#appendfsync always
appendfsync everysec #性能和可靠性折中选择
# appendfsync no
优点
数据可靠性高
缺点写入aof文件需占用一定资源开销
aof文件过大,重启服务载入时间过长
需定期执行bgrewriteaof操作,合并优化aof文件
持久化
AOF工作原理 Redis fork进程,产生一个父进程和一个子进程。
子进程将会往一个临时文件中写入新的增量数据。
父进程继续处理来自Client的请求,在内存缓冲区中记录所
有新的变化(但是与此同时,父进程会把这些变更写入到
旧的AOF文件中,这样即使重新失败,数据依旧安全)。
当子进程完成文件重写操作时,父进程会接收到一个信号,
并把内存缓冲区的数据追加到由子进程生成的临时文件中
去。
Redis父进程将临时文件重命名为一个新的文件,并在之后
往新文件中进行数据追加。
持久化
VM
Slow!Slow!Slow!(重启,复制,保存)
该功能在2.4版本将彻底废弃。
DiskStore
RDBMS + Memory Cache?
Action in Redis(1)—— 计数器
SET/GET,INCR/DECR,INCRBY/DECRBY
Action in Redis(2)—— 消息队列
LPUSH/RPOP,LLEN,LRANGE
Action in Redis(2)—— 消息队列
思考:如何实现一个安全的队列?
用RPOPLPUSH进行队列备份
Tips
最佳性能
All data in-memory,关闭持久化
容量规划
提前预估数据容量分配节点,制定Key命名规范,数据管
理和迁移成本很高
学习资源
http://nosql-database.org/
http://sebug.net/paper/databases/nosql/Nosql.html
http://redis.readthedocs.org/en/latest/
http://rediscookbook.org/index.html
http://pauladamsmith.com/articles/redis-under-the-
hood.html
http://redis.io/topics/twitter-clone
Q&A
Thank you!