370 likes | 842 Views
Redis Key/Value DB. 云端事业部 / 云安全工程部 —— 周波. 目录. Redis 简介 Nosql DB 简介 和 Memcached 的比较 数据结构 存储结构及存储格式 Redis 的安装、操作和应用举例 常用命令 参考资料. Redis 简介. redis 是一个 key-value 存储系统 。 和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string( 字符串 ) 、 list( 链表 ) 、 set( 集合 ) 和 zset( 有序集 合 ) 。
E N D
Redis Key/Value DB 云端事业部/云安全工程部——周波
目录 Redis简介 Nosql DB简介 和Memcached的比较 数据结构 存储结构及存储格式 Redis的安装、操作和应用举例 常用命令 参考资料
Redis 简介 redis是一个key-value存储系统。 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集 合)。 这些数据类型支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,支持各种不同方式的排序。 redis 与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
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, ......
Nosql DB简介 为什么要使用NOSQL非关系数据库? High performance - 对数据库高并发读写的需求 Huge Storage - 对海量数据的高效率存储和访问的需求 High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
Redis与Memcached 比较 相同点 Redis和Memcached都是开源项目,都提供很多的client库可供选择。 两者都是Nosql DB,且都在内存存储数据,处理数据速度快。
Redis与Memcached 比较 功能上差异 从协议上看,Redis提供更多的数据结构和操作,如set, stack, range操作等 Redis不仅仅是个cache,提供persistent和chain replication,加上#1,可以近似替代Memcached+MySQL Redis支持不同的db空间,通过selectdb来切换到不同的db空间。从而实现数据的隔离。 Memcached提供binary protocol和sasl协议,ms Redis还没有支持
Redis与Memcached 比较 实现上差异 内存管理方式差别很大,Redis使用独立的VM管理内存,将大部分value进行压缩后放到磁盘上,类似swap out的概念 Memcached使用libevent库,而Redis则原生的使用了epoll,kqueue等多个异步通信模型
Redis与Memcached 比较 性能上差异 网络上众说纷纭,有的说redis快,有的说Memcached快。以下是网络上提供的一组性能比较数据。
Redis 数据结构 redis目前提供四种数据类型:string,list,set及zset(sorted set)。
Redis数据存储结构 redis使用了两种文件格式:全量数据和增量请求。 全量数据格式是把内存中的数据写入磁盘, 便于下次读取文件进行加载; 增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
Redis数据存储格式 Redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。 save seconds updates :指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。 appendonly yes/no :是否在每次更新操作后进行日志记录。 appendfsync no/always/everysec :数据缓存同步至磁盘的方式。
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
Redis工具 redis-server:Redis服务器的daemon启动程序 redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作 redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能 redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。
Redis的配置 daemonize:是否以后台daemon方式运行 pidfile:pid文件位置 port:监听的端口号 timeout:请求超时时间 loglevel:log信息级别 logfile:log文件位置 databases:开启数据库的数量 save * *:保存快照的频率,可设置多个条件。 rdbcompression:是否使用压缩 dbfilename:数据快照文件名
Redis的配置 dir:数据快照的保存目录(这个是目录) appendonly:每次写操作会记一条log appendfsync:如何同步到磁盘 slaveof <masterip> <masterport>:配置主从服务器
Redis操作 启动Redis Server >./redis-server 这样会加载默认配置redis.conf,也可配置多个redis端口,启动时指定配置文件: >./redis-server redis_6380.conf
Redis操作 内置client访问Redis Server >./redis-cli redis> set foo bar OK redis> get foo "bar" >./redis-cli -p 6380 info
Redis新特性 Sub/Pub(发布/订阅) Pub/Sub功能(即Publish,Subscribe)意思是发布及订阅功能。简单的理解就像我们订阅blog一样,不同的是,这里的客户端与server端采用长连接建立推送机制,一个客户端发布消息,可以在多个客户端收到通知。
Redis新特性应用 SCMQ(云安全消息队列)
Redis 备份机制 Redis支持master-slave的主从配置,配置方法是在从机的配置文件中指定slaveof参数为主机的ip和port即可, 其数据复制方式可以是一主一从或者是一主多从的方式,Redis在master是非阻塞模式,也就是说在slave执行数据同步的时候,master是可以接受客户端的请求的,并不影响同步数据的一致性,然而在slave端是阻塞模式的,slave在同步master数据时,并不能够响应客户端的查询, Redis的master/slave模式下,master提供数据读写服务,而slave只提供读服务
Redis命令总结 连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsave:返回上次成功将数据保存到磁盘的Unix时戳 shundown:将数据同步保存到磁盘,然后关闭服务 远程服务控制 info:提供服务器的信息和统计 monitor:实时转储收到的请求 slaveof:改变复制策略设置 config:在运行时配置Redis服务器
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
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的子串
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的头部
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的一个元素
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
参考资料 http://www.javaeye.com/topic/524977 http://liuxinglanyue.javaeye.com/blog/829202 http://192.168.0.5/cwiki/display/WEB/SCMQ http://baike.baidu.com/view/4595959.htm http://blog.haohtml.com/index.php/archives/6306 http://code.google.com/p/redis/wiki/PublishSubscribe http://jeffxie.blog.51cto.com/blog/1365360/292106