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