【原】Redis基本操作

  • Redis基本操作

    • 遍历操作

    • Pub-Sub server

    • Lua脚本


Redis中的这些操作都是不分大小写的。
除了针对于具体类型的具体操作。还有一些其他操作。

遍历操作 SCAN cursor [MATCH pattern] [COUNT count]

  • SCAN、SSCAN、HSCAN、ZSCAN是遍历集合元素的命令。
  • SCAN:遍历选中的Redis数据库的集合,相当于全库扫描。
  • SSCAN:遍历Sets类型的元素。
  • HSCAN:遍历Hash类型及对应的value。
  • ZSCAN:遍历Sorted Set类型和对应的scores。

SCAN基本用法:SCAN cursor

SCAN是通过游标cursor来遍历集合的,遍历开始时设置为0,如果终止server 返回0,否则,返回cusor遍历的值,该值呈上升趋势且大于0。

redis 127.0.0.1:6379> scan 0
1) "17"
2)  1) "key:12"
    2) "key:8"
    3) "key:4"
    4) "key:14"
    5) "key:16"
    6) "key:17"
    7) "key:15"
    8) "key:10"
    9) "key:3"
   10) "key:7"
   11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
   2) "key:18"
   3) "key:0"
   4) "key:2"
   5) "key:19"
   6) "key:13"
   7) "key:6"
   8) "key:9"
   9) "key:11"

SSCAN、HSCAN、ZSCAN和SCAN的不同的是需要指定遍历的集合,基本用法为SSCAN/HSCAN/ZSCAN 集合名字 cusor
例如:

redis 127.0.0.1:6379> hmset hash name Jack age 33
OK
redis 127.0.0.1:6379> hscan hash 0
1) "0"
2) 1) "name"
   2) "Jack"
   3) "age"
   4) "33"

COUNT选项

该选项指定了每一次调用COUNT命令返回的元素的个数,默认值是10.
scan 0 count 12

MATCH选项

用正则表达式匹配符合条件的元素,可以过滤数据,尤其适合于数据量大的情况下。

redis 127.0.0.1:6379> sadd myset 1 2 3 foo foobar feelsgood
(integer) 6
redis 127.0.0.1:6379> sscan myset 0 match f*
1) "0"
2) 1) "foo"
   2) "feelsgood"
   3) "foobar"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> scan 0 MATCH *11*
1) "288"
2) 1) "key:911"
redis 127.0.0.1:6379> scan 288 MATCH *11*
1) "224"
2) (empty list or set)
redis 127.0.0.1:6379> scan 224 MATCH *11*
1) "80"
2) (empty list or set)
redis 127.0.0.1:6379> scan 80 MATCH *11*
1) "176"
2) (empty list or set)
redis 127.0.0.1:6379> scan 176 MATCH *11* COUNT 1000
1) "0"
2)  1) "key:611"
    2) "key:711"
    3) "key:118"
    4) "key:117"
    5) "key:311"
    6) "key:112"
    7) "key:111"
    8) "key:110"
    9) "key:113"
   10) "key:211"
   11) "key:411"
   12) "key:115"
   13) "key:116"
   14) "key:114"
   15) "key:119"
   16) "key:811"
   17) "key:511"
   18) "key:11"
redis 127.0.0.1:6379>

SCAN家族返回值

SCAN、SSCAN、HSCAN、ZSCAN的返回值格式一样,第一个值是64bit的无符号数,即cursor,第二个值是元素的数组,具体如下:

  • SCAN:返回keys的数组。
  • SSCAN:返回Set元素的数组。
  • HSCAN:返回K-V键值对数组。
  • ZSCAN:返回元素及对应的score组成的数组。

Pub-Sub server

Pub/Sub

SUBSCRIBE, UNSUBSCRIBE and PUBLISH等命令用于实现消息发布/订阅(Publish/Subsribe)。发送者将消息发送到指定的Channels,不需要关心是否有订阅者存在。订阅者可以订阅一个或多个channel。可以理解成发布者和订阅者是通过channel来实现解耦的。

例如:一个Client订阅“first”“second”两个channel

127.0.0.1:6379> subscribe first second
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "first"
3) (integer) 1
1) "subscribe"
2) "second"
3) (integer) 2

另启动一个Client 发布message:

127.0.0.1:6379> publish second Hello
(integer) 1

Client接受到message:

1) "message"
2) "second"
3) "Hello"

由上面例子可知,消息的返回值是一个三元组。

  • subscribe:订阅channel,返回值元组第二个元素是channel名称,第三个元素是channel数目。
  • unsubscribe:取消订阅channel,返回值元组最后一个元素表示当前订阅的channel数目。
  • message:消息内容,返回值元组第二个元素是channel名称,第三个元素是消息内容。

Lua脚本

EVAL
EVAL和EVALSHA用Redis内置的Lua编译器执行脚本。
EVAL脚本第一个参数是eval代表Lua程序的运行环境上下文;第二个参数是具体命令;第三个开始代表Redis的key names。参数能通过Lua的关键字全局变量KEYS、ARGV得到。例如:

> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

Lua函数redis.call()和redis.pcall()
两个函数基本一样,唯一不同的是如果Redis命令调用出错的话,redis.call()将返回具体的错误信息,redis.pcall()将返回Lua table的包装错误。

例如:给foo赋值为“bar”。

> eval "return redis.call('set','foo','bar')" 0
OK

> eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK

更多命令操作详见网址:http://redis.io/commands

posted @ 2016-10-22 13:38  一路向前走  阅读(10976)  评论(0编辑  收藏  举报