Redis quick tour

3,213 views
3,014 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,213
On SlideShare
0
From Embeds
0
Number of Embeds
1,245
Actions
Shares
0
Downloads
40
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Redis quick tour

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

×