Redis quick tour
Upcoming SlideShare
Loading in...5
×
 

Redis quick tour

on

  • 2,997 views

 

Statistics

Views

Total Views
2,997
Views on SlideShare
1,795
Embed Views
1,202

Actions

Likes
2
Downloads
36
Comments
0

8 Embeds 1,202

http://www.imminh.com 972
http://blog.imminh.com 187
http://www.cnblogs.com 38
http://tuicool.com 1
http://cache.baidu.com 1
http://webcache.googleusercontent.com 1
http://imminh.com 1
http://translate.googleusercontent.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Redis quick tour Redis quick tour Presentation Transcript

  • RedisQuick Tour
    舒铭(新浪微博@思门)
    11-9-20
  • 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
    View slide
  • 认识Redis
    Redis 是一款完全开源,支持多种数据结构(string,hashes,list,set,sorted set)的高级Key Value数据库。
    Who’s using Redis?
    版本更新频繁,社区用户活跃
    官方网站:http://redis.io/
    作者博客:http://antirez.com/
    View slide
  • 安装使用
    安装
    $ 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
    redisenthttps://github.com/jdp/redisent
  • Benchmark
    官方宣称测试结果:
    SET操作 110000/rps
    GET操作 81000/rps
    redis-benchmark –q
  • K-V缓存(VSmemcached)
    单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
    • 插入完成后通过LTRIMlatest.comments 0 5000使其永远只保存最近5000个ID
    • LRANGE lastest.comments 0 9,获取前10条数据
    排行榜应用,取TOPN操作
    在SortedSet中以某个条件作为权重,以此进行排序。
    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
    优点
    读写性能最佳
    缺点
    数据可靠性差,重启会丢失内存中未同步数据
  • 持久化
    快照工作原理
    Redisfork进程。此时会有一个父进程和一个子进程。
    父进程继续处理来自client的请求,子进程负责将内存中的数据写入至一个临时生成的RDB文件中。
    当子进程写入操作完毕后,用该临时文件替换掉原先使用的RDB文件。
  • 持久化
    Append Only File(AOF)增量文件
    appendonly yes
    #appendfsync always
    appendfsynceverysec#性能和可靠性折中选择
    # appendfsyncno
    优点
    数据可靠性高
    缺点
    写入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!