-
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
