nosqlredis

advertisement
高性能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
Download