高性能No sql数据库redis

13,059 views
12,862 views

Published on

redis

Published in: Education, Technology
2 Comments
56 Likes
Statistics
Notes
  • Very Good! 盛大V5
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • simple and good
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
13,059
On SlideShare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
578
Comments
2
Likes
56
Embeds 0
No embeds

No notes for slide
  • OK,我们开始今天的分享主题:高性能NoSQL数据库Redis,在分享这个主题之前呢?我简单的介绍一下我自己,我是来自盛大在线基础研发中心的徐江涛,平时主要做一些web方面的开发,对数据库的其实没有多少深入的研究,主要是涉及应用层的一些高性能的缓存,像memcached,redis,还有一个tt+tc的组合,对于海量文件存储方面几乎是没有打过交道.今天我们马上要讲的这个东西,很有意思,不管是在性能方面,还是在操作数据的灵活性方面,我觉得是NoSQL界的一个里程碑,Redis版本更新的非常快,09年诞生至今,发展的非常快,国外很多的NoSQL大会上,很多人拿出来分享,由于信息的滞后,在国内呢,并没有看到很多关于Redis的东西,我今天呢主要是拿出来和大家分享一下,希望起到一个抛砖引玉的作用,希望在座的各位呢,能够以后更加深入的研究Redis,因此今天的内容呢,可能不会非常的深入技术内核方面的东西,而是使用性方面的东西.
  • 在讲Redis之前,我们来看看一个数据库方面的一个发展趋势.我把它叫做NoSQL大行其道,为什么NoSQL会大行其道呢,主要是由2个业务方面的需求决定的。
    第一个方面呢,在互联网快速发展的背景下,特别是we2.0,网络上的数据内容呈几何级的增长,面临一个还量化的数据,特别像facebook,提供大量用户UGC的海量存储系统.
    数据实时化 数据碎片化 互动性增强、并发压力大Twitter 微博等一个高交互性的一个要求.

    第2个是我们硬件的一个更新趋势,在早期呢,由于内存非常的昂贵,像MYSQL这样的一些关系数据系统呢,也正是在这样一种情况下诞生的,对内存的要求呢并不高,使用和管理起来的也非常的方便,这事早期的一个环境环境决定的,那么现在呢,内存变便宜了。

    综合诞生了很多高性能的、非常优秀的NoSQL数据库.
    NoSQL这个词呢,非常新的,也非常的火.但NoSQL不会像早起的关系数据库一样,完全通吃的情况出现,什么叫做完全通知吃呢?早期基本上一个应用,可能使用mysql就能搞解决所有的存储问题,今天嗯,可能在存储小文件、mp3、图片呢服务的时候,你会选择使用亚马逊的云服务,在用户session方面呢,你可能会使用memcached、或是redis,每一种数据库呢,都有自己所擅长的东西,这也Nosql的百家争鸣、百花齐放的场景.
  • Redis是一个key-value存储系统。和Memcached类似,但支持持久化存储及更高的读写性能,同时支持多元化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型。这个我们在后面会详细的来讲
  • Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。
    Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
  • SETNX SETNX与SET的区别是SET可以创建与更新key的value,而SETNX是如果key不存在,则创建key与value数据
    SETEX SETEX = SET + EXPIRE,貌似我的这个版本没有办法测试
    MSET 一次性设置多个参数的值(MSET uid:1:name shjuto uid:1:email shjuto@gmail.com uid:1:city 8 回车 nanchang)最后一个值需要回车输入,和SET一样,不知为啥。
    MSETNX 如果设置的key不存在的话,或是叫做新key的话;一次性设置多个参数的值(MSET uid:1:name shjuto uid:1:email shjuto@gmail.com uid:1:city 8 回车 nanchang)最后一个值需要回车输入,和SET一样,不知为啥。
  • 找到相关LRU的相关测率,及REDIS的对比
    TTL返回某个参数还剩多长时间
  • # RPUSH 追加数据到系列的尾部 (RPUSH listtest 10 \n 1111111122) # LPUSH 追加数据到序列的头部 (LPUSH listtest 10 \n 2222222222) # LLEN 一个序列的长度;(LLEN listtest) # LRANGE 从自定的范围内返回序列的元素 (LRANGE testlist 0 2;返回序列testlist前0 1 2元素) # LTRIM 修剪某个范围之外的数据 (LTRIM testlist 0 2;保留0 1 2元素,其余的删除) # LINDEX 返回某个位置的序列值(LINDEX testlist 0;返回序列testlist位置为零的元素) # LSET 更新某个位置元素的值 (LSET testlist 0 5 \n 55555;) # LPOP key Return and remove (atomically) the first element of the List at key # RPOP key Return and remove (atomically) the last element of the List at key # LREM 根据值删除序列元素 (LREM testlist 0 5 \n 33333;删除序列中所有的等于33333的元素,为何不是REMOVE BY KEY?不知道何故,可能对删除重复数据有用吧) # BLPOP key1 key2 … keyN timeout Blocking LPOP >1.31,后续更新 # BRPOP key1 key2 … keyN timeout Blocking RPOP >1.31 # RPOPLPUSH srckey dstkey Return and remove (atomically) the last element of the source List stored at _srckey_ and push the same element to the destination List stored at _dstkey_
  • 这是利用redis来做一个简单队列服务的一个示意图
  • 我相信还有有越来越多的语言支持使用redis,它是如此的精悍.
  • 前几天Redis作者antirez同学在twitter上说将在下一篇博文中向大家解释为什么他选择6379作为默认端口号。而现在这篇博文出炉,在解释了Redis的LRU机制之后,如期向大家解释了采用6379作为默认端口的原因。
    MERZ长期以来被antirez及其朋友当作愚蠢的代名词。
  • 高性能No sql数据库redis

    1. 1. 高性能NoSQL数据库Redis 盛大在线:徐江涛 博客:http://www.paitoubing.cn
    2. 2. NoSQL 大行其道 APP 高并发请求 海量化数据 Disk 内存 图灵奖得主Jim Gray :“内存是新的硬盘,硬盘是新的磁带” memcached
    3. 3. Redis分享大纲 Redis是什么 Redis的特性 Redis的API及适用场景 Redis的使用经验,运维参数
    4. 4. Redis是什么 sponsored by: What is Redis is... an “advanced key-value store” b y S A LVATO R E S A N F I L I P P O ( @ a n t i r e z )
    5. 5. Redis vs Memcached Memcached 操作实例 键(keys) 值(values) page:index.html <html><head>[...] user:101:session xDrSdEwd4dSlZkEkj+ login_count “100001” user:100:last_login_time “102736485756” 所有的操作都是基于字符串、或者是2进制的数据格式、 操作起来大部分是GET、SET这2个命令操作,易于使用
    6. 6. Redis vs Memcached 和Memcached 一样、使用简单、性能高效(1G 1M) 异步持久化存储 支持多种数据类型; Strings(字符)、 Lists(链表)、 Sets(集合)、ZSets(有序集合)、Hashes(哈希) 更多、更方便API接口 管理数据; More commands and More…. Is Redis
    7. 7. Redis vs Memcached Redis 数据类型实例 键(keys) 值(values) page:index.html <html><head>[...] users_logged_in_today { 1, 2, 3, 4, 5 } latest_post_ids [201, 204, 209,..] users_and_scores joe ~ 1.3483 bert ~ 93.4 fred ~ 283.22 chris ~ 23774.17 String Sets List ZSets
    8. 8. Redis的API及适用场景 Strings 字符 ./redis-cli SET mystring “ hello world ” C client key value ./redis-cli GET mystring hello world return
    9. 9. GETSET MGET SETNX SETEX MSET MSETNX Redis的API及适用场景 Strings 字符 INCR INCRBY DECR DECRBY APPEND SUBSTR
    10. 10. Redis的API及适用场景 Expiration 当把Redis当作缓存服务使用时,你可以设置数据的过 期时间,不管是数据类型(string,list,zsets,sets,hash)是 什么, 此系列命令都有效 EXPIRE paitoubing 1234 TTL paitoubing == 1234 秒 秒
    11. 11. Redis的API及适用场景 Deleting Keys DEL paitoubing EXISTS paitoubing == 0 (false)
    12. 12. Redis的API及适用场景 Lists a b c d e f LPUSH RPUSH LPOP RPOP LPUSH paitoubing a
    13. 13. Redis的API及适用场景 Lists a b c d e f LLEN == 6 x LREM 1 b LRANGE 2 3 LINDEX 5
    14. 14. Redis的API及适用场景 队列服务Queues a b c d e f RPUSH LPOP RPUSH paitoubing abc RPUSH paitoubing def LPOP paitoubing == “abc” LPOP paitoubing == “def” LPOP paitoubing == (nil)
    15. 15. Redis的API及适用场景 集合Sets uid:1:followers bruce tom zhangsan lisi wangermazi xiaoyueyue fengjie uid:2:followers xiaoyueyue fengjie liyuchun furongjiejie SREM uid:1:followers wangermazi x SMOVE uid:1:followers uid:2:followers lisi SADD uid:2:followers tom
    16. 16. Redis的API及适用场景 集合Sets uid:1:followers bruce tom zhangsan lisi wangermazi xiaoyueyue fengjie uid:2:followers xiaoyueyue fengjie liyuchun furongjiejie SCARD uid:1:followers == 7 SISMEMBER uid:1:followers xinxin == 0 (meaning false) SRANDMEMBER uid:1:followers == “xiaoyueyue” SMEMBERS uid:2:followers == xiaoyueyue fengjie liyuchun furongjiejie
    17. 17. Redis的API及适用场景 集合Sets(交集、并集、差集) uid:1:followers bruce tom zhangsan lisi wangermazi xiaoyueyue fengjie uid:2:followers xiaoyueyue fengjie liyuchun furongjiejie xiaoyueyue fengjie SINTER uid:1:followers uid:2:followers == xiaoyueyue fengjie SINTERSTORE SUNION SUNIONSTORE SDIFF SDIFFSTORE
    18. 18. Redis的API及适用场景 有序集合ZSets Like Sets 每个元素,增加了rank,或是score no time!
    19. 19. Redis的API及适用场景 Hashes(哈希) 产品:Product 1 created_at : 1290149988 product_id : 1 name : 盛大点券 available : 100 HSET product:1 created_at 1290149988 HSET product:1 name “盛大点券” HSET product:1 available 100 HGET product:1 name == 盛大点券 HLEN product:1 == 3 HKEYS product:1 == created_at, name,available HGETALL product:1 == created_at => 102374657 name=> 盛大点券 available=> 100 HVALS HEXISTS HINCRBY HMGET HMSET
    20. 20. Redis的API及适用场景 Redis Social Network (社会化网络) UGC 好友:双向关系 粉丝:单向关系 text photo more….. blog、Message、photo、
    21. 21. Redis的API及适用场景 新增用户 username userid INCR next_user_id Return s [uid] SET user:[uid]:name [username] SET username:[username] [id] Int 整形 变量值 新增日记 content author I NCR next_post_id Return s [pid] SET post:[pid]:content [content] SET post:[pid]:author [uid] LPUSH user:[uid]:posts [pid] LPUSH posts:global [pid] Redis Social Network (社会化网络) Unique IDs
    22. 22. SORT ZCARD MONITOR SLAVEOF RENAME SELECT SAVE SUBSCRIBE PUBLISH Redis的API及适用场景 Enough commands! (版本更新快)
    23. 23. Redis的安装 下载:http://code.google.com/p/redis/ Redis的安装 tar zxvf redis-version.tar.gz cd redis-version make 由于没有make install,所以得把源代码目录里的关键文件手动复制到适当的位置: cp redis.conf /etc/ cp redis-benchmark redis-cli redis-server /usr/bin/ 修改/etc/redis.conf daemonize yes 启动redis服务 # /usr/bin/redis-server /etc/redis.conf
    24. 24. Redis的安装 Redis.conf (配置文件) daemonize yes => 以守护进程的方式运行 maxmemory => Redis在启动时会把所有数据加载到内存中 ,设置使用内存限制 , 新的vm机制,key存放内存,value会存放在swap区,不建议 可通过consistent hashing把数据分布到多个服务器上 save 900 1 save 300 10 save 60 10000 => 900秒内有1个改变, 300秒内有10个改变, 60秒内有10000个改变, redis就会内存中的key保存到数据库文件中去 dbfilename dump.rdb 保存数据的路径 slaveof 192.168.1.2 6379 => 在启动时,REDIS会自动从MASTER上把数据 先同步过来,而无需我们手动进行 MASTER上每有一次落地保存,会自动向SLAVE进行同步。 当然这里的问题是,如果MASTER不保存, SLAVE也就无法得到这些数据,这和REDIS本身的内存写磁盘逻辑是一样
    25. 25. Redis的安装 requirepass => 连接密码(注释) rdbcompression => 存储至本地数据库时是否压缩数据,默认为yes masterauth <master-password> => 当本机为从服务时, 设置主服务的连接密码(注释) maxclients => 最大客户端连接数,默认不限制(注释) appendonly => 是否在每次更新操作后进行日志记录,如果不开启, 可能会在断电时导致一段时间内的数据丢失。 因为redis本身同步数据文件是按上面save条件来同步的, 所以有的数据会在一段时间内只存在于内存中。默认值为no appendfsync => 更新日志条件,共有3个可选值。 no表示等操作系统进行数据缓存同步到磁盘, always表示每次更新操作后手动调用fsync()将数据写到磁盘, everysec表示每秒同步一次(默认值)。 vm-enabled 是否使用虚拟内存
    26. 26. Redis的主从-集群 client client client master master master slave slave slave CONSISTENT HASH / 定容 read write 同步数据 https://github.com/antirez/redis/raw/master/design-documents/REDIS-CLUSTER 风险! SESSION slave
    27. 27. Redis的开发语言支持 Language Support Ruby, Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure, C#, C/C++, JavaScript/Node.js, Haskell, IO, Go
    28. 28. 6379在是手机按键上MERZ对应的号码 MERZ取自意大利歌女Alessia Merz的名字 6379 Redis端口的故事 Why?
    29. 29. Redis的扩展阅读 1、http://code.google.com/p/redis/ 我怎么获得更多,更全的Redis信息? 2、http://redis.io 3、http://antirez.com/ 4、http://www.google.com
    30. 30. END & QA

    ×