注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zjcjack的博客

 
 
 

日志

 
 

Redis使用系列:功能示例篇  

2012-03-29 17:21:54|  分类: redis |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Redis内置支持120多个命令(截止Redis 2.0.4版本),这些命令包括对各种数据结构的操作,以及服务器管理,事务支持,发布/订阅支持等。本文将对Redis的基本功能做一些示例,详细的命令和协议规范后面单独写一篇文章介绍。

字符串

对字符串的操作,本质上就是Key/Value操作,只不过Redis支持的命令更丰富,除了基本的SET/GET之外,还有批量操作命令MSET/MGET。

redis> SET  foo bar
OK
redis> GET foo
"bar"
redis> GET key1
(nil)

Redis还支持INCR命令(Memcached也提供了类似的命令incr/decr),可以使用一个字符串做原子计数,使用字符串作为Key,而Value必须是数字

redis> SET  foo 1
OK
redis> INCR foo
(integer) 2
redis> INCR foo
(integer) 3
redis> GET foo
"3"
redis> SET foo terry
OK
redis> INCR foo
(error) ERR value is not an integer

设置过期

Redis支持对其中某一项指定过期时间,结合前面所说的GET/SET命令,Redis完全可以作为一个高效的分布式缓存系统

redis> EXPIRE  foo 2
(integer) 1
redis> GET foo
(nil)

List操作

Redis支持list数据结构的操作,所有集合中的元素都是顺序存储的,可以使用LPOP/LPUSH/RPOP/RPUSH等命令实现队列、栈 等数据结构。LRANGE用于列出集合中所有的元素,-1为最后一个元素,RPOPLPUSH用于移除一个list中的最后一个元素,并加入到另外一个 list。

redis> LPUSH  newlist a
(integer) 1
redis> LRANGE newlist 0 -1
1. "a"
redis> LPUSH newlist b
(integer) 2
redis> LPUSH newlist c
(integer) 3
redis> LRANGE newlist 0 -1
1. "c"
2. "b"
3. "a"
redis> LPUSH mylist x
(integer) 1
redis> RPOPLPUSH newlist mylist
"a"
redis> LRANGE newlist 0 -1
1. "c"
2. "b"
redis> LRANGE mylist 0 -1
1. "a"
2. "x"
redis> LPOP mylist
"a"
redis> RPOP newlist
"b"

Set操作

与list不同的是set集合中的元素是无序的,并且唯一,Redis针对Set的比较、联合和交集等操作,使用SMOVE可以把元素从一个set移动到另外一个set,SCARD命令用于统计set中集合的数量。

redis> SADD  newset a
(integer) 1
redis> SADD newset b
(integer) 1
redis> SADD newset c
(integer) 1
redis> SADD myset d
(integer) 1
redis> SADD myset e
(integer) 1
redis> SADD myset f
(integer) 1
redis> SADD myset b
(integer) 1
redis> SINTER newset myset
1. "b"
redis> SUNION newset myset
1. "a"
2. "b"
3. "c"
4. "d"
5. "e"
6. "f"
redis> SMOVE newset myset a
(integer) 1
redis> SCARD newset
(integer) 2
redis> SCARD myset
(integer) 5

Sorted Set操作

Sorted Set与前面提到的set基本类似,不过加入的set中的每个元素都会关联一个浮点型的权值,保存在集合中的元素都是依据该权值排序的。

redis> ZADD  days 1 MON
(integer) 0
redis> ZADD days 3 Wed
(integer) 1
redis> ZADD days 2 Tue
(integer) 1
redis> ZRANGE days 0 -1
1. "MON"
2. "Tue"
3. "Wed"

Hash操作

Redis提供了对HashTable(相当于Java中的HashMap、C#中的Dictionary等)的支持,在有些情况下,为了节约内存也可以使用Hash操作代替前面说的GET/SET命令,具体效率能够提高多少还需要进一步测试。

redis> HSET  user name terrylee
(integer) 1
redis> HSET user blog http://terrylee.me/blog
(integer) 1
redis> HGET user name
"terrylee"
redis> HGETALL user
1. "name"
2. "terrylee"
3. "blog"
4. http://terrylee.me/blog

Pub/Sub操作

从Redis 1.3.8版本开始就支持Pub/Sub命令,通过Pub/Sub命令可以把Redis当做一个轻量级的消息队列使用,如有一个后台文章审核进程,订阅了 new.article.*通道(PSUBSCRIBE是通过模式匹配订阅,如果要订阅单个通道,可以使用SUBSCRIBE命令):

redis> PSUBSCRIBE  new.article.*
Reading messages... (press Ctrl-c to quit)
1. "psubscribe"
2. "new.article.*"
3. (integer) 1

前端文章发布进程发布了一篇新的文章(此处的MULTI和EXEC用于事务支持,后面会看到),并发布到new.article.technology通道:

redis> MULTI
OK
redis> SET article.technology.1001 "Redis使用系列:功能篇"
QUEUED
redis> PUBLISH new.article.technology 1001
QUEUED
redis> EXEC
1. OK
2. (integer) 1

后台文章审核进程会接收到相应的消息:

redis> PSUBSCRIBE  new.article.*
Reading messages... (press Ctrl-c to quit)
1. "psubscribe"
2. "new.article.*"
3. (integer) 1

1. "pmessage"
2. "new.article.*"
3. "new.article.technology"
4. "1001"

Transactions

Redis支持事务功能,使用MULTI命令开启一个事务,然后之后的命令都会放到队列中,直到使用EXEC执行命令(提交事务)或者使用DISCARD丢弃(回滚事务)所有的命令。

redis> MULTI
OK
redis> SET foo 0
QUEUED
redis> INCR foo
QUEUED
redis> INCR foo
QUEUED
redis> EXEC
1. OK
2. (integer) 1
3. (integer) 2
redis> GET foo
"2"
redis> MULTI
OK
redis> SET bar 0
QUEUED
redis> INCR bar
QUEUED
redis> INCR bar
QUEUED
redis> DISCARD
OK
redis> GET bar
"0"

本文通过一些简单的示例介绍了Redis支持的几种数据结构和Pub/Sub、事务功能,在后面的文章会详细介绍Redis的命令,在Redis下 一个版本里,会增加一些更加高效的命令如GETBIT/ SETBIT/ SETRANGE/ GETRANGE/ STRLEN等。

  评论这张
 
阅读(545)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018