Redis Key/Value DB

35
www.NetQin.com Redis Key/Value DB 云云云云云 / 云云云云云云——云云

description

Redis Key/Value DB. 云端事业部 / 云安全工程部 —— 周波. 目录. Redis 简介 Nosql DB 简介 和 Memcached 的比较 数据结构 存储结构及存储格式 Redis 的安装、操作和应用举例 常用命令 参考资料. Redis 简介. redis 是一个 key-value 存储系统 。 和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string( 字符串 ) 、 list( 链表 ) 、 set( 集合 ) 和 zset( 有序集 合 ) 。 - PowerPoint PPT Presentation

Transcript of Redis Key/Value DB

Page 1: Redis Key/Value DB

www.NetQin.com

Redis Key/Value DB

云端事业部 / 云安全工程部——周波

Page 2: Redis Key/Value DB

www.NetQin.com

目录

1. Redis简介2. Nosql DB 简介3. 和Memcached的比较4. 数据结构5. 存储结构及存储格式6. Redis 的安装、操作和应用举例7. 常用命令8. 参考资料

Page 3: Redis Key/Value DB

www.NetQin.com

Redis 简介

redis 是一个 key-value 存储系统。 和Memcached 类似,它支持存储的 value 类型相对更多,包括 string( 字符串 ) 、 list( 链表 ) 、 set( 集合 ) 和 zset( 有序集 合 ) 。

这些数据类型支持 push/pop 、 add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,支持各种不同方式的排序。

redis 与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了 master-slave( 主从 ) 同步。

Page 4: Redis Key/Value DB

www.NetQin.com

Nosql DB简介

什么是 Nosql DB?NoSQL ,意即反 SQL 运动,是一种非关系型的数据存储, key/value 键值对存储。

现有 Nosql DB 产品Redis/MongoDB/Memcached/Hbase/Cassandra/Tokyo Cabinet/Voldemort/Dynomite/Riak/CouchDB/Hypertable/Flare/Tin/Lightcloud/KiokuDB/Scalaris/Kai/ThruDB,  ......

Page 5: Redis Key/Value DB

www.NetQin.com

Nosql DB简介

为什么要使用 NOSQL 非关系数据库 ?1.High performance - 对数据库高并发读写的需求2.Huge Storage - 对海量数据的高效率存储和访问

的需求3.High Scalability && High Availability- 对数据

库的高可扩展性和高可用性的需求

Page 6: Redis Key/Value DB

www.NetQin.com

Redis 与 Memcached 比较

相同点1.Redis 和 Memcached 都是开源项目,都提供很

多的 client 库可供选择。2.两者都是 Nosql DB ,且都在内存存储数据,处理

数据速度快。

Page 7: Redis Key/Value DB

www.NetQin.com

Redis 与 Memcached 比较

功能上差异1.从协议上看, Redis 提供更多的数据结构和操作,

如 set, stack, range 操作等2.Redis 不仅仅是个 cache ,提供 persistent 和

chain replication ,加上 #1 ,可以近似替代Memcached+MySQL

3.Redis 支持不同的 db 空间,通过 selectdb 来切换到不同的 db 空间。从而实现数据的隔离。

4.Memcached 提供 binary protocol 和 sasl 协议,ms Redis 还没有支持

Page 8: Redis Key/Value DB

www.NetQin.com

Redis 与 Memcached 比较

实现上差异1.内存管理方式差别很大, Redis 使用独立的 VM 管

理内存,将大部分 value 进行压缩后放到磁盘上,类似 swap out 的概念

2.Memcached 使用 libevent 库,而 Redis 则原生的使用了 epoll , kqueue 等多个异步通信模型

Page 9: Redis Key/Value DB

www.NetQin.com

Redis 与 Memcached 比较

性能上差异网络上众说纷纭,有的说 redis 快,有的说Memcached 快。以下是网络上提供的一组性能比较数据。

Page 10: Redis Key/Value DB

www.NetQin.com

Redis 与 Memcached 比较

Page 11: Redis Key/Value DB

www.NetQin.com

Redis 与 Memcached 比较

Page 12: Redis Key/Value DB

www.NetQin.com

Redis 与 Memcached 比较

Page 13: Redis Key/Value DB

www.NetQin.com

Redis 数据结构

redis 目前提供四种数据类型: string,list,set 及zset(sorted set) 。

Page 14: Redis Key/Value DB

www.NetQin.com

Redis数据存储结构

redis 使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘, 便于下

次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请

求,用于读取文件进行 replay 得到数据,序列化的操作包括 SET 、 RPUSH 、 SADD 、 ZADD 。

Page 15: Redis Key/Value DB

www.NetQin.com

Redis数据存储格式

Redis 的存储分为内存存储、磁盘存储和 log 文件三部分,配置文件中有三个参数对其进行配置。

save seconds updates : 指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。

appendonly yes/no : 是否在每次更新操作后进行日志记录。

appendfsync no/always/everysec :数据缓存同步至磁盘的方式。

Page 16: Redis Key/Value DB

www.NetQin.com

Redis的安装

下载安装源码包>wget‘http://code.google.com/p/redis/

downloads/detail?name=redis-2.0.4.tar.gz’>tar xzf redis-2.0.4.tar.gz >cd redis-2.0.4 >make

Page 17: Redis Key/Value DB

www.NetQin.com

Redis工具

redis-server : Redis服务器的 daemon启动程序

redis-cli : Redis 命令行操作工具。当然,你也可以用 telnet根据其纯文本协议来操作

redis-benchmark : Redis 性能测试工具,测试Redis 在你的系统及你的配置下的读写性能

redis-stat : Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。

Page 18: Redis Key/Value DB

www.NetQin.com

Redis的配置

daemonize :是否以后台 daemon 方式运行 pidfile : pid 文件位置 port :监听的端口号 timeout :请求超时时间 loglevel : log 信息级别 logfile : log 文件位置 databases :开启数据库的数量 save * * :保存快照的频率,可设置多个条件。 rdbcompression :是否使用压缩 dbfilename :数据快照文件名

Page 19: Redis Key/Value DB

www.NetQin.com

Redis的配置

dir :数据快照的保存目录(这个是目录) appendonly :每次写操作会记一条 logappendfsync :如何同步到磁盘slaveof <masterip> <masterport> :配置主

从服务器

Page 20: Redis Key/Value DB

www.NetQin.com

Redis操作

启动 Redis Server>./redis-server

这样会加载默认配置 redis.conf,也可配置多个redis 端口,启动时指定配置文件:

>./redis-server redis_6380.conf

Page 21: Redis Key/Value DB

www.NetQin.com

Redis操作

内置 client 访问 Redis Server>./redis-cliredis> set foo barOK redis> get foo "bar" >./redis-cli -p 6380 info

Page 22: Redis Key/Value DB

www.NetQin.com

Redis操作

Page 23: Redis Key/Value DB

www.NetQin.com

Redis新特性

Sub/Pub( 发布 /订阅 )Pub/Sub功能(即 Publish,Subscribe)意思是发布及订阅功能。简单的理解就像我们订阅 blog一样,不同的是,这里的客户端与 server 端采用长连接建立推送机制,一个客户端发布消息,可以在多个客户端收到通知。

Page 24: Redis Key/Value DB

www.NetQin.com

Redis新特性应用

SCMQ( 云安全消息队列 )

Page 25: Redis Key/Value DB

www.NetQin.com

Redis 备份机制

Redis 支持 master-slave 的主从配置,配置方法是在从机的配置文件中指定 slaveof 参数为主机的ip 和 port 即可,

其数据复制方式可以是一主一从或者是一主多从的方式, Redis 在 master 是非阻塞模式,也就是说在 slave执行数据同步的时候, master 是可以接受客户端的请求的,并不影响同步数据的一致性,然而在 slave 端是阻塞模式的, slave 在同步master 数据时,并不能够响应客户端的查询,

Redis 的 master/slave 模式下, master 提供数据读写服务,而 slave只提供读服务

Page 26: Redis Key/Value DB

www.NetQin.com

Redis 备份应用

Page 27: Redis Key/Value DB

www.NetQin.com

Redis 备份应用

Page 28: Redis Key/Value DB

www.NetQin.com

Redis命令总结

连接操作相关的命令 quit :关闭连接( connection ) auth :简单密码认证 持久化 save :将数据同步保存到磁盘 bgsave :将数据异步保存到磁盘 lastsave :返回上次成功将数据保存到磁盘的 Unix时戳 shundown :将数据同步保存到磁盘,然后关闭服务 远程服务控制 info :提供服务器的信息和统计 monitor :实时转储收到的请求 slaveof :改变复制策略设置 config :在运行时配置 Redis服务器

Page 29: Redis Key/Value DB

www.NetQin.com

Redis命令总结

对 value操作的命令 exists(key) :确认一个 key 是否存在 del(key) :删除一个 key type(key) :返回值的类型 keys(pattern) :返回满足给定 pattern 的所有 key randomkey :随机返回 key 空间的一个 keyrename(oldname, newname) :重命名 key dbsize :返回当前数据库中 key 的数目 expire :设定一个 key 的活动时间( s ) ttl :获得一个 key 的活动时间 select(index) :按索引查询 move(key, dbindex) :移动当前数据库中的 key 到 dbindex 数据库 flushdb :删除当前选择数据库中的所有 key flushall :删除所有数据库中的所有 key

Page 30: Redis Key/Value DB

www.NetQin.com

Redis命令总结 对 String操作的命令 set(key, value) :给数据库中名称为 key 的 string赋予值 value get(key) :返回数据库中名称为 key 的 string 的 value getset(key, value) :给名称为 key 的 string赋予上一次的 value mget(key1, key2,…, key N) :返回库中多个 string 的 value setnx(key, value) :添加 string ,名称为 key ,值为 value setex(key, time, value) :向库中添加 string ,设定过期时间 time mset(key N, value N) :批量设置多个 string 的值 msetnx(key N, value N) :如果所有名称为 key i 的 string 都不存在, incr(key) :名称为 key 的 string 增 1 操作 incrby(key, integer) :名称为 key 的 string 增加 integer decr(key) :名称为 key 的 string 减 1 操作 decrby(key, integer) :名称为 key 的 string减少 integer append(key, value) :名称为 key 的 string 的值附加 value substr(key, start, end) :返回名称为 key 的 string 的 value 的子串

Page 31: Redis Key/Value DB

www.NetQin.com

Redis命令总结 对 List操作的命令 rpush(key, value) :在名称为 key 的 list尾添加一个值为 value 的元素 lpush(key, value) :在名称为 key 的 list头添加一个值为 value 的 元素 llen(key) :返回名称为 key 的 list 的长度 lrange(key, start, end) :返回名称为 key 的 list 中 start 至 end之间的元素

ltrim(key, start, end) :截取名称为 key 的 list lindex(key, index) :返回名称为 key 的 list 中 index位置的元素 lset(key, index, value) :给名称为 key 的 list 中 index位置的元素赋值 lrem(key, count, value) :删除 count 个 key 的 list 中值为 value 的元素。 lpop(key) :返回并删除名称为 key 的 list 中的首元素 rpop(key) :返回并删除名称为 key 的 list 中的尾元素 blpop(key1, key2,… key N, timeout) : lpop 命令的 block版本。 brpop(key1, key2,… key N, timeout) : rpop 的 block版本。 rpoplpush(srckey, dstkey) :返回并删除名称为 srckey 的 list 的尾元素,

并将该元素添加到名称为 dstkey 的 list 的头部

Page 32: Redis Key/Value DB

www.NetQin.com

Redis命令总结 对 Set操作的命令 sadd(key, member) :向名称为 key 的 set 中添加元素member srem(key, member)  :删除名称为 key 的 set 中的元素member spop(key)  :随机返回并删除名称为 key 的 set 中一个元素 smove(srckey, dstkey, member)  :移到集合元素 scard(key)  :返回名称为 key 的 set 的基数 sismember(key, member)  : member 是否是名称为 key 的 set 的元素

sinter(key1, key2,…key N)  :求交集 sinterstore(dstkey, (keys))  :求交集并将交集保存到 dstkey 的集合 sunion(key1, (keys))  :求并集 sunionstore(dstkey, (keys))  :求并集并将并集保存到 dstkey 的集合 sdiff(key1, (keys))  :求差集 sdiffstore(dstkey, (keys))  :求差集并将差集保存到 dstkey 的集合 smembers(key)  :返回名称为 key 的 set 的所有元素 srandmember(key)  :随机返回名称为 key 的 set 的一个元素

Page 33: Redis Key/Value DB

www.NetQin.com

Redis命令总结 对 Hash操作的命令 hset(key, field, value) :向名称为 key 的 hash 中添加元素 field hget(key, field) :返回名称为 key 的 hash 中 field 对应的 value hmget(key, (fields)) :返回名称为 key 的 hash 中 field i 对应的

value hmset(key, (fields)) :向名称为 key 的 hash 中添加元素 field  hincrby(key, field, integer) :将名称为 key 的 hash 中 field 的

value 增加 integer hexists(key, field) :名称为 key 的 hash 中是否存在键为 field 的域 hdel(key, field) :删除名称为 key 的 hash 中键为 field 的域 hlen(key) :返回名称为 key 的 hash 中元素个数 hkeys(key) :返回名称为 key 的 hash 中所有键 hvals(key) :返回名称为 key 的 hash 中所有键对应的 value hgetall(key) :返回名称为 key 的 hash 中所有的键( field)及其对

应的 value

Page 34: Redis Key/Value DB

www.NetQin.com

参考资料

http://www.javaeye.com/topic/524977http://liuxinglanyue.javaeye.com/blog/

829202http://192.168.0.5/cwiki/display/WEB/SCMQhttp://baike.baidu.com/view/4595959.htmhttp://blog.haohtml.com/index.php/

archives/6306http://code.google.com/p/redis/wiki/

PublishSubscribehttp://jeffxie.blog.51cto.com/blog/

1365360/292106

Page 35: Redis Key/Value DB

www.NetQin.com

谢谢~~