分享java带来的快乐

我喜欢java新东西

Redis命令——Keys相关

 

以下为Redis中有关Keys操作的一些命令,内容主要来源于Redis的官方文档。如有需要,请参阅Redis的官方文档:http://redis.io/commands#generic

 1.DEL
语法:DEL key [key
...]
说明:移除指定的keys,如果该key不存在则将会被忽略。该操作的时间复杂度为O(N),这里N为将要移除的keys的个数。当将要移除的key对应除字符串类型外其它类型的值时,对该key进行操作的时间复杂度为O(M),M为列表(list)、集合(set)、有序集合(sorted
set)或者哈希(hash)中所包含元素的个数。移除对应值为字符串类型的单个key的时间复杂度为O(1)。
返回值:将要移除的keys的个数。
该命令自0.07版本后可用。

2.EXISTS
语法:EXISTS
key
说明:判断指定的key是否存在。该操作的时间复杂度为O(1)。
返回值:如果指定的key存在,则返回值为1,否则返回值为0。
该命令自0.0.7版本后可用。

3.EXPIRE
语法:EXPIRE
key
seconds
说明:设置指定key的超时时间,超时后该key将会被自动删除。该操作的时间复杂度为O(1)。在Redis中,如果一个key与某个超时时间相关联,那么该key将被称为是易失的(volatile)。在2.1.3版本之前,已经存在的超时时间是不能被重写的。因此,如果一个key已经关联了某个过期时间,那么该命令将不会起作用并且返回值为0。但是自2.1.3版本后,Redis允许更新一个key的超时时间。另外,你可以使用PERSIST命令来移除一个key相关联的超时时间。
返回值:如果成功设置了超时时间,那么返回值为1;如果该key不存在或者不能够设置超时时间,那么返回值为0。

 

该命令自0.0.9版本后可用。

4.EXPIREAT
语法:EXPIREAT key
timestemp
说明:该操作的时间复杂对为O(1)。该命令与EXPIRE命令有着相同的语义和效果,二者唯一的差别是:EXPIREAT命令中指定的并不是表示TTL(Time
To
Live)的秒数,而是一个确定的UNIX时间戳(即自1970年1月1日之后的秒数)。
返回值:如果成功设置了超时时间,那么返回值为1,如果该key不存在或者不能够设置超时时间,那么返回值为0。

 

 


该命令自1.1版本后可用。

5.KEYS
语法:KEYS
pattern
说明:返回与指定模式相匹配的所用的keys。该操作的时间复杂度为O(N),N为数据库中所拥有的keys的个数,并假设数据库中keys的名称与给定的匹配模式均具有有限的长度。虽然该操作的时间复杂度为O(N),但是此处时间复杂度的常量系数相当低。需要注意的是:在生产环境中使用该命令需要特别注意,该命令在对规模较大的数据库进行操作时可能会损害性能。该命令主要是设计用来进行调试和进行特殊的操作,例如更改keyspace的布局(layout)等。

 

该命令所支持的匹配模式如下:
(1)?:用于匹配单个字符。例如,h?llo可以匹配hello、hallo和hxllo等;
(2)*:用于匹配零个或者多个字符。例如,h*llo可以匹配hllo和heeeello等;
(3)[]:可以用来指定模式的选择区间。例如h[ae]llo可以匹配hello和hallo,但是不能匹配hillo。
同时,可以使用“/”符号来转义特殊的字符

 

例如,使用如下命令可以查看数据库中的所有keys:keys *


 


返回值:返回匹配指定模式的keys的列表。


该命令自0.0.7版本后可用。

6.MOVE
语法:MOVE key
db
说明:将指定的key从当前选择的数据库(使用SELECT命令)移动到目标数据库,该操作的时间复杂度为O(1)。当该key在目标数据库中已经存在或者它在源数据库中并不存在时,该命令将不进行任何操作。基于此可以将该命令用作一个锁定的原语操作(locking
primitive)。


返回值:如果该key被移至目标数据库,那么返回值为1;如果该key未被移动,那么返回值为0。

 

该命令自0.0.7版本后可用。

7.OBJECT
语法:OBJECT
subcommand [arguments [arguments
...]]
说明:对于现阶段已经实现的子命令而言,时间复杂度均为O(1)。该命令允许用户查看与keys相关联的Redis对象的内部信息。对于调试或者理解keys是否正在使用特殊编码的数据类型以便节省空间,该命令非常有用。在使用Redis作为缓存时,你的应用程序可能需要使用OBJECT命令返回的信息来实现应用层次的key驱离策略(eviction
policies)。
该命令支持多种子命令,如下所示:
(1)OBJECT REFCOUNT
<key>:返回对与指定key相关联的值的引用个数。该命令对用户进行调试非常有帮助;
(2)OBJECT ENCODING
<key>:返回用于存储与指定key相关联的值的内部表示类型;
(3)OBJECT IDLETIME
<key>:返回与key相关联的值自存储以来处于空闲状态(IDLE)的秒数(未被read或write等操作所请求)。计时器的时间粒度为10秒,该值在后续版本中可能会发生变化。
对象可以使用如下不同的方式进行编码:
(1)string可以按照正常的字符串编码格式进行存储或者使用int类型(表示64位有符号数区间中整数的字符串可以按照这种方式进行编码以便节省存储空间);
(2)lists可以被编码为ziplist或者linkedlist格式。对于规模较小的链表而言,可以使用ziplist来表示以便节省存储空间;
(3)sets可以被编码为intset或者hashtable格式。intset作为一种特别的编码方式可以用于仅有整数构成的规模较小的集合中;
(4)hashes可以被编码为zipmap或者hashtable。zipmap可以用于对规模较小的hashes进行编码;
(5)sorted
sets可以编码为ziplist或者skiplist。对于list类型,规模较小的有序集合(sorted
sets)可以使用ziplist进行编码,而skiplist可以用于对任何大小的有序集合进行编码。
需要注意的是:你一旦执行了一种使得Redis无法保持能够节约存储空间的编码方式的操作后,所有特殊编码的类型将会被自动转换为普通类型。
返回值:对于不同的子命令将会有不同的返回值。
(1)对于refcount和idletime子命令,返回值为整型(integers)。
(2)对于encoding子命令将会返回一个块回复(bulk
reply)。
(3)如果你要查看的object已经丢失,那么将会返回一个null块。


可以通过如下实例进行测试:lpush mylist “hello world”

 

 


通过上述测试可以了解到,Redis
2.2.6版本中对对象处于IDLE状态的时间统计的时间粒度为10秒。
该命令自2.2.3版本后可用。

8.PERSIST
语法:PERSIST
key
说明:移除与key相关联的超时时间。该操作的时间复杂度为O(1)。
返回值:如果超时时间被移除,那么返回者为1;如果该key不存在或者没有与之相关联的超时时间,那么返回值将为0.

 

该命令自2.1.2版本后可用。

9.RANDOMKEY
语法:RANDOMKEY
说明:从当前选择的数据库中返回一个随机的key。该操作的时间复杂度为O(1)。
返回值:返回随机key;如果数据库为空时,那么将返回nil。

 

该命令的实例如下所示:


 
该命令自0.0.7版本后可用。

 

10.RENAME
语法:RENAME key
newkey
说明:将指定的key命名为newkey。该操作的时间复杂度为O(1)。当源和目标的名称相同或指定的key不存在时,将会返回一个错误。如果newkey已经存在时,它将会被重写。
返回值:返回Redis定义的状态码。
该命令自0.0.7版本后可用。

11.RENAMENX
语法:RENAMENX
key
newkey
说明:在newkey不存在的情况下将key命名为newkey。如果源和目标的名称相同或者指定的key不存在时返回一个错误。该操作的时间复杂度为O(1)。

 

返回值:如果key被命名为newkey,那么返回值为1;如果newkey已经存在,那么返回值为0。
该命令自0.0.7版本后可用。

12.SORT
语法:SORT
key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC]
[ALPHA] [STORE destination]
说明:返回或按key存储包含在列表(list)、集合(set)或者有序集合(sorted
set)中的元素。该操作的时间复杂度为O(N+M*log(M)),此处N是将要排序的列表(list)或者集合(set)中元素的个数,而M为将要返回的元素个数。在元素未被排序时,复杂度在现阶段是O(N)。在下一个发行版本中,其中的拷贝这一步骤将会被避免。
在默认情况下,排序是数字型的,并且元素通过他们的值进行比较,值被解释为双精度浮点数。
假设mylist是一组数字的列表,最简单的SORT命令形式如下所示:
SORT
mylist


假设mylist中存储有1-10这些值,使用该命令会有如下的输出结果:

 

 

如果你希望使用降序顺序来排列元素,可以使用DESC修饰符,如下所示:
SORT mylist
DESC
当mylist中包含字符串并且你希望使用字母顺序进行排列时,可以使用ALPHA修饰符,如下所示:
SORT mylist
ALPHA


使用该命令后,会有以下输出结果:

 


返回元素的个数可以通过LIMIT修饰符进行限制。使用该修饰符时需要指定起始元素的偏移值和将要返回的元素的总数。如下所示:
SORT mylist
LIMIT 0
5
通过外部keys进行排序
有时候你希望通过使用外部keys作为权值而并非比较列表(list)、集合(set)或者有序集合(sorted
set)中的真实元素来进行排序。例如,假如
列表mylist中包含元素1、2和3,分别表示存储在object_1、object_2和object_3中对象的唯一ID。当这些对象具有存储在weight_1、weight_2和weight_3中的相关联的权值时,SORT可以使用这些权值来排序mylist。如下所示:
SORT
mylist BY
weight_*
BY选项选用了一个模式(本例中为weight_*)来生成用来排序的keys。这些keys的名称可以通过取代模式中的“*”符号来加以生成,用于取代“*”符号的值是mylist列表中能够首次匹配模式中的“*”符号的真实值(在本例中为1、2、和3)。

 

假设在mylist列表中存有值1、2和3,object_1上存储有值object_1,object_2上存储有值object_2,object_3上存储有值object_3,weight_1上存储有值0.87,weight_2上存储有值3,weight_3上存储有值-6.4。如下所示:


 


使用SORT mylist BY weight_*可以得到如下输出:

 

 

(1)跳过排序元素
可以给BY选项指定一个并不存在的key,这将会使得SORT命令跳过排序操作。这是一种在不进行排序的情况下取得外部keys的有效方式。如下所示:
SORT
mylist BY
nosort
(2)获取外部keys
在一些情况下,获取真正的对象而非它们的ID更为有用(object_1、object_2和object_3)。基于列表(list)、集合(set)或有序集合(sorted
set)中的元素获取外部keys可以通过使用如下命令来完成:
SORT mylist BY weight_* GET object_*

 

在使用上述命令后,可以得到如下输出:

 


GET选项可以被多次使用,从而对原有列表(list)、集合(set)或有序集合(sorted
set)中的每个元素取得更多的keys。同样,使用特殊的模式#,可以获取元素本身。如下所示:
SORT mylist BY weight_* GET
object_* GET #


使用上述命令后,可以得到如下输出:

 


(3)存储排序操作的结果
在默认情况下,SORT向客户端返回排序后的元素。使用STORE选项,可以将结果存储在一个列表中,用户可以同时指定与列表相关联的key。如下所示:
SORT
mylist BY weight_* SRORE
resultkey
(4)在BY和GET选项中使用hashes
你可以对hash字段使用BY和GET选项,语法如下:
SORT mylist
BY weight_*->fieldname GET
object_*->fieldname
字符串“->”用来区分hash字段名称和key名称。
返回值:排序元素的列表。
该命令自0.0.7版本后可用。

13.TTL
语法:TTL
key
说明:如果指定的key有与之相关联的超时时间,那么将会返回该key还能存活的时间。该操作的时间复杂度为O(1)。这一自省能力使得Redis客户端能够查看一个指定的key还能够作为dataset的一部分存在多长时间。
返回值:以秒为单位的TTL(Time
To Live);如果指定的key不存在或者没有与之相关联的超时时间,那么便会返回-1。
该命令自0.1000版本后可用。

14.
TYPE
语法: TYPE
key
说明:返回存储在指定key上的值所具有的数据类型的字符串描述。该操作的时间复杂度为O(1)。数据类型可以是:string、list、set、zset和hash。
返回值:存储在key上的值的数据类型,如果该key不存在,那么返回值为none。
该命令自0.0.7版本后可用。

 

posted on 2012-06-19 11:29 强强 阅读(705) 评论(0)  编辑  收藏 所属分类: Redis


只有注册用户登录后才能发表评论。


网站导航: