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