Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Redis quick tour

3,309 views

Published on

Published in: Technology
  • Dating direct: ♥♥♥ http://bit.ly/39mQKz3 ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/39mQKz3 ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

×