redis Key命令
1 keys
返回满足给定 pattern 的所有 key
*代表所有
127.0.0.1:6379> keys *
1) "zet"
2) "set"
3) "appToken"
4) "email"
5) "name"
6) "list"
7) "hash"
127.0.0.1:6379> keys list*
1) "list"
2 exists
确认一个 key 是否存在
127.0.0.1:6379> exists email
(integer) 1
3 del
删除一个 key
127.0.0.1:6379> del email
(integer) 1
4 expire
设置一个 key 的过期时间(单位:秒)
127.0.0.1:6379> expire name 10
(integer) 1
ttl获取key有效时间负数说明已过期(取消expire时,ttl也为负)
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name
(integer) 4
127.0.0.1:6379> ttl name
(integer) -2
5 move
将当前数据库中的 key 转移到其它数据库中
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> set name wxc
OK
127.0.0.1:6379> get name
"wxc"
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
"wxc"
6 persist
移除给定 key 的过期时间
127.0.0.1:6379[1]> expire name 20
(integer) 1
127.0.0.1:6379[1]> ttl name
(integer) 15
127.0.0.1:6379[1]> persist name
(integer) 1
127.0.0.1:6379[1]> ttl name
(integer) -1
127.0.0.1:6379[1]> get name
"wxc"
7 randomkey
随机返回 key 空间的一个 key
127.0.0.1:6379> randomkey
"appToken"
127.0.0.1:6379> randomkey
"hash"
8 rename
127.0.0.1:6379[1]> set name wxc
OK
127.0.0.1:6379[1]> rename name myname
OK
127.0.0.1:6379[1]> keys *
1) "myname"
9 type
127.0.0.1:6379> keys *
1) "zet"
2) "set"
3) "appToken"
4) "list"
5) "hash"
127.0.0.1:6379> type zet
zset
127.0.0.1:6379> type set
set
127.0.0.1:6379> type hash
hash
10 dump
序列化给定key,并返回被序列化的值,使用RESTORE命令可以将这个值反序列化为 Redis 键。
127.0.0.1:6379> set email wxc@126.com
OK
127.0.0.1:6379> dump email
"\x00\x0bwxc@126.com\x06\x00\xd7\xf1hU\x0b,\x8cB"
11 expireat
expireat的作用和expire类似,都用于为key设置生存时间。不同在于expireat命令接受的时间参数是 UNIX 时间戳。
12 migrate
MIGRATE host port key destination-db timeout [COPY] [REPLACE]
将key原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功,key保证会出现在目标实例上,而当前实例上的key会被删除。
命令的内部实现是这样的:它在当前实例对给定key执行DUMP命令 ,将它序列化,然后传送到目标实例,目标实例再使用RESTORE对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到RESTORE命令返回OK,它就会调用DEL删除自己数据库上的key。当IOERR出现时,有以下两种可能:key可能存在于两个实例;key可能只存在于当前实例.唯一不可能发生的情况就是丢失key,因此,如果一个客户端执行MIGRATE命令,并且不幸遇上。OERR错误,那么这个客户端唯一要做的就是检查自己数据库上的key是否已经被正确地删除。
两个客户端 127.0.0.1:6379;127.0.0.1 7777
127.0.0.1:6379> migrate 127.0.0.1 7777 name 0 1000
OK
13 object
允许从内部察看给定key的 Redis 对象。
它通常用在除错(debugging)或者了解为了节省空间而对key使用特殊编码的情况。
当将Redis用作缓存程序时,你也可以通过object命令中的信息,决定key的驱逐策略(eviction policies)。
object 命令有多个子命令:
object refcount <key>: 返回给定key引用所储存的值的次数。此命令主要用于除错。
object encoding <key>:返回给定key所储存的值所使用的内部表示(representation)。
object idletime <key>:返回给定key自储存以来的空闲时间(idle, 没有被读取也没有被写入),以秒为单位。
对象可以以多种方式编码:
字符串可以被编码为raw(一般字符串)或int(为了节约内存,Redis 会将字符串表示的 64 位有符号整数编码为整数来进行储存)。对于3.0及以上版本,字符串小于39字节编码格式为embstr,
列表可以被编码为ziplist或linkedlist。ziplist是为节约大小较小的列表空间而作的特殊表示。
集合可以被编码为intset或者hashtable。intset是只储存数字的小集合的特殊表示。
哈希表可以编码为zipmap或者hashtable。zipmap是小哈希表的特殊表示。
有序集合可以被编码为ziplist或者skiplist格式。ziplist用于表示小的有序集合,而skiplist则用于表示任何大小的有序集合。
127.0.0.1:6379> set name wxc
OK
127.0.0.1:6379> object refcount name
(integer) 1
127.0.0.1:6379> object idletime name
(integer) 34
127.0.0.1:6379> get name
"wxc"
127.0.0.1:6379> object idletime name
(integer) 2
127.0.0.1:6379> object encoding name
"embstr"
14 pexpire
这个命令和expire命令的作用类似,但是它以毫秒为单位设置key的生存时间,而不像expire命令那样,以秒为单位。相应的用PTTL命令查看其过期时间。
15 pexpireat
这个命令和expireat命令类似,但它以毫秒为单位设置key的过期 unix 时间戳,而不是像expireat那样,以秒为单位。
16 renamenx
当且仅当newkey不存在时,将key改名为newkey。
当key不存在时,返回一个错误。
127.0.0.1:6379> set name wxc
OK
127.0.0.1:6379> renamenx name myname
(integer) 1
127.0.0.1:6379> set name wxc
OK
127.0.0.1:6379> renamenx name myname
(integer) 0
17 restore
反序列化给定的序列化值,并将它和给定的key关联。如果键key已经存在, 并且给定了REPLACE选项, 那么使用反序列化得出的值来代替键key原有的值; 相反地, 如果键key已经存在, 但是没有给定REPLACE选项, 那么命令返回一个错误。
127.0.0.1:6379> restore email2 0 "\x00\x0bwxc@126.com\x06\x00\xd7\xf1hU\x0b,\x8cB" replace
OK
127.0.0.1:6379> get email2
"wxc@126.com"
18 sort
返回或保存给定列表、集合、有序集合key中经过排序的元素。排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。
一般 sort 用法
最简单的sort使用方法是sort key和sort key DESC:
127.0.0.1:6379> lpush numlist 32 45 3 46
(integer) 4
127.0.0.1:6379> sort numlist
1) "3"
2) "32"
3) "45"
4) "46"
127.0.0.1:6379> sort numlist desc
1) "46"
2) "45"
3) "32"
4) "3"
使用 alpha修饰符对字符串进行排序
127.0.0.1:6379> lpush strlist wxcname
(integer) 1
127.0.0.1:6379> lpush strlist wxchome
(integer) 2
127.0.0.1:6379> lpush strlist wxcemail
(integer) 3
127.0.0.1:6379> sort strlist alpha
1) "wxcemail"
2) "wxchome"
3) "wxcname"
使用 LIMIT 修饰符限制返回结果
排序之后返回元素的数量可以通过LIMIT修饰符进行限制, 修饰符接受offset和count两个参数:
offset指定要跳过的元素数量。
count指定跳过offset个指定的元素之后,要返回多少个对象。
127.0.0.1:6379> rpush rank 2 4 7 8 4
(integer) 5
127.0.0.1:6379> rpush rank 9 6 1 5 7
(integer) 10
127.0.0.1:6379> sort rank limit 0 5
1) "1"
2) "2"
3) "4"
4) "4"
5) "5"
使用外部 key 进行排序
by 选项[根据field2来排序field1】
sort field1 by field2
get 选项[根据field1排序再取出相应的field2]
使用GET选项, 可以根据排序的结果来取出相应的键值。
sort field1 get field2
组合使用 by 和 get[根据field2排序field1再取出相应的field3】
sort field1 by field2 get field3
获取多个外部键
sort field1 get field2 get field3
get有一个额外的参数规则,那就是 —— 可以用#获取被排序键的值。
sort field1 get # get field2 get field3[打印field1,field2,field3]
获取外部键,但不进行排序
通过将一个不存在的键作为参数传给by选项, 可以让sort跳过排序操作, 直接返回结果
sort field by not-exists-key[返回结果不会排序]
通过将这种用法和get选项配合, 就可以在不排序的情况下, 获取多个外部键, 相当于执行一个整合的获取操作(类似于 SQL 数据库的join关键字)。
sort field1 by not-exists-key get # get field2 get field3[打印不排序的field1,field2,field3]
将哈希表作为 GET 或 BY 的参数
BY和GET选项都可以用key->field的格式来获取哈希表中的域的值, 其中key表示哈希表键, 而field则表示哈希表的域
sort field1 by key->field get key->field2 get key->field3
保存排序结果
默认情况下,sort操作只是简单地返回排序结果,并不进行任何保存操作。通过给store选项指定一个key参数,可以将排序结果保存到给定的键上。如果被指定的key已存在,那么原有的值将被排序结果覆盖。
sort field store key[结果保存在key中]
19 scan
scan命令及其相关的sscan命令、hscan命令和zscan命令都用于增量地迭代一集元素:
scan命令用于迭代当前数据库中的数据库键。
zscan命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像keys命令、smembers命令带来的问题 —— 当keys命令被用于处理一个大的数据库时, 又或者smembers命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。
不过, 增量式迭代命令也不是没有缺点的: 举个例子, 使用smembers命令可以返回集合键当前包含的所有元素, 但是对于scan这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 。
因为scan、sscan、hscan和zscan四个命令的工作方式都非常相似, 所以这个文档会一并介绍这四个命令, 但是要记住:
sscan、hscan和zscan命令的第一个参数总是一个数据库键。
而scan命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。
SCAN 命令的基本用法
scan命令是一个基于游标的迭代器:scan命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为scan命令的游标参数, 以此来延续之前的迭代过程。
当scan命令的游标参数被设置为0时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为0的游标时, 表示迭代已结束。
scan 0