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
来源:https://www.cnblogs.com/yourarebest/p/5987438.html