29
(新浪微博@) 2011/9/19

Redis quick tour

  • Upload
    imminh

  • View
    2.921

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Redis quick tour

舒铭(新浪微博@思门)

2011/9/19

Page 2: Redis quick tour

CAP理论

CAP理论

C:一致性

A:可用性

P:分区容忍性

RDBMS满足CA

NoSQL满足AP

实现最终一致性

Page 3: Redis quick tour

NoSQL百花齐放

Wide Column Store/Column Families:

Hadoop/Hbase

Cassandra

Document Store:

MongoDB

CouchDB

Key Value/Tuple Store:

Redis

Tokyo Cabinet/Tyrant

MemcacheDB

Page 4: Redis quick tour

认识Redis

Redis 是一款完全开源,支持多种数据结构(string,hashes,list,set,sorted set)的高级Key Value数据库。

Who’s using Redis?

版本更新频繁,社区用户活跃

官方网站:http://redis.io/

作者博客:http://antirez.com/

Page 5: Redis quick tour

安装使用

安装$ 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/

Page 6: Redis quick tour

客户端丰富

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

Page 7: Redis quick tour

Benchmark

官方宣称测试结果:

SET操作 110000/rps

GET操作 81000/rps

redis-benchmark –q

Page 8: Redis quick tour

K-V缓存(VS memcached)

单Key容量

Memcache 1MB ~ Redis 1GB

数据持久化

Redis默认开启持久化,数据定期交换到磁盘中,断电数据不会丢失。

丰富的数据结构

String,Hashes,List,Set,Sorted Set

树状主从结构

Redis支持一主多从,从服务器也可作为其他从服务器的主节点。

Page 9: Redis quick tour

消息队列(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已停止更新

Page 10: Redis quick tour

数据结构:String

常用命令:

SET,GET,DEL,DECR,INCR,MGET等

应用场景:

默认Key/Value存储

原子操作计数器

Page 11: Redis quick tour

数据结构:List

常用命令:

LPUSH,RPUSH,LPOP,RPOP,LRANGE,LLEN等。

应用场景:

双向链表消息队列

列表格式数据存储

Page 12: Redis quick tour

数据结构:Set

常用命令:

SADD,SPOP,SMEMBERS,SCARD等。

应用场景:

数据不重复,执行排重操作

实现好友关注列表交集,并集,差集(共同关注,共有粉

丝,可能认识的人)

Page 13: Redis quick tour

数据结构:Sorted Set

常用命令:

ZADD,ZRANGE, ZREM,ZCARD等。

应用场景:

有序集合,可以设置数据权重值

积分排行榜

Page 14: Redis quick tour

数据结构:Hash

常用命令:

HSET,HGET,HGETALL,HEXISTS等。

应用场景:

类似PHP关联数组

避免序列化保存时,数据并发修改写入冲突

Page 15: Redis quick tour

Pub/Sub

常用命令:

SUBSCRIBE/UNSUBSCRIBE,PUBLISH

应用场景:

观察者模式

实时消息队列,即时IM,聊天室

Page 16: Redis quick tour

应用场景

取最新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分之间的学生。

Page 17: Redis quick tour

应用场景

需要精准设定过期时间的应用

同样使用Sorted Set的score值记录数据过期时间时间戳,通

过定时任务取出这些数据,并在数据库中删除。

计数器应用

Uniq操作,获取某段时间所有数据排重值

利用Set的天然排重特性,把数据往Set中存放,同值内容将

不会被保存。

Page 18: Redis quick tour

应用场景

实时系统,反垃圾系统

Pub/Sub构建实时消息系统

构建队列系统

缓存

Page 19: Redis quick tour

持久化

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

优点

读写性能最佳

缺点

数据可靠性差,重启会丢失内存中未同步数据

Page 20: Redis quick tour

持久化

快照工作原理 Redis fork进程。此时会有一个父进程和一个子进程。

父进程继续处理来自client的请求,子进程负责将内存中的

数据写入至一个临时生成的RDB文件中。

当子进程写入操作完毕后,用该临时文件替换掉原先使用

的RDB文件。

Page 21: Redis quick tour

持久化

Append Only File(AOF)增量文件appendonly yes

#appendfsync always

appendfsync everysec #性能和可靠性折中选择

# appendfsync no

优点

数据可靠性高

缺点写入aof文件需占用一定资源开销

aof文件过大,重启服务载入时间过长

需定期执行bgrewriteaof操作,合并优化aof文件

Page 22: Redis quick tour

持久化

AOF工作原理 Redis fork进程,产生一个父进程和一个子进程。

子进程将会往一个临时文件中写入新的增量数据。

父进程继续处理来自Client的请求,在内存缓冲区中记录所

有新的变化(但是与此同时,父进程会把这些变更写入到

旧的AOF文件中,这样即使重新失败,数据依旧安全)。

当子进程完成文件重写操作时,父进程会接收到一个信号,

并把内存缓冲区的数据追加到由子进程生成的临时文件中

去。

Redis父进程将临时文件重命名为一个新的文件,并在之后

往新文件中进行数据追加。

Page 23: Redis quick tour

持久化

VM

Slow!Slow!Slow!(重启,复制,保存)

该功能在2.4版本将彻底废弃。

DiskStore

RDBMS + Memory Cache?

Page 24: Redis quick tour

Action in Redis(1)—— 计数器

SET/GET,INCR/DECR,INCRBY/DECRBY

Page 25: Redis quick tour

Action in Redis(2)—— 消息队列

LPUSH/RPOP,LLEN,LRANGE

Page 26: Redis quick tour

Action in Redis(2)—— 消息队列

思考:如何实现一个安全的队列?

用RPOPLPUSH进行队列备份

Page 27: Redis quick tour

Tips

最佳性能

All data in-memory,关闭持久化

容量规划

提前预估数据容量分配节点,制定Key命名规范,数据管

理和迁移成本很高

Page 29: Redis quick tour

Q&A

Thank you!