redis Key命令

2017-04-26  本文已影响0人  鬭闢

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命令用于迭代当前数据库中的数据库键。

sscan命令用于迭代集合键中的元素。

hscan命令用于迭代哈希键中的键值对。

zscan命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像keys命令、smembers命令带来的问题 —— 当keys命令被用于处理一个大的数据库时, 又或者smembers命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

不过, 增量式迭代命令也不是没有缺点的: 举个例子, 使用smembers命令可以返回集合键当前包含的所有元素, 但是对于scan这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 。

因为scansscanhscanzscan四个命令的工作方式都非常相似, 所以这个文档会一并介绍这四个命令, 但是要记住:

sscanhscanzscan命令的第一个参数总是一个数据库键。

而scan命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。

SCAN 命令的基本用法

scan命令是一个基于游标的迭代器:scan命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为scan命令的游标参数, 以此来延续之前的迭代过程。

scan命令的游标参数被设置为0时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为0的游标时, 表示迭代已结束。

scan 0

上一篇下一篇

猜你喜欢

热点阅读