redis的键(key)

来源:互联网 发布:plc编程软件免费下载 编辑:程序博客网 时间:2024/06/15 22:08

1.del

DEL key [key ...]

    删除给定的一个或多个 key。不存在的 key 会被忽略。

可用版本:

     >= 1.0.0

时间复杂度:

    O(N)N为被删除的 key的数量。

    删除单个字符串类型的 key,时间复杂度为O(1)

    删除单个列表、集合、有序集合或哈希表类型的 key,时间复杂度为O(M)M 为以上数据结构内的元素数量。

返回值:

    被删除 key 的数量。

命令:

#  删除单个 keyredis> SET name huangzOKredis> DEL name(integer) 1# 删除一个不存在的 keyredis> EXISTS phone(integer) 0redis> DEL phone # 失败,没有 key 被删除(integer) 0# 同时删除多个 keyredis> SET name "redis"OKredis> SET type "key-value store"OKredis> SET website "redis.com"OKredis> DEL name type website(integer) 3
2.dump

DUMP key

序列化给定的key,并返回被序列化的值,使用restore命令可以将这个值反序列化为redis键。

序列化生成的值有以下几个特点:

       ---它带有64位的校验和用于检测错误,restore在进行反序列化之前会先检查校验和

       ---值得编码格式和RDB文件保持一致

       ---RDB版本会被编码在序列化的值当中,如果因为redis的版本不同造成RDB合适不兼容,那么redis会拒绝对这个值进行反序列化的操作。

可用版本:

      >= 2.6.0

时间复杂度:

  查找给定键的复杂度为 O(1),对键进行序列化的复杂度为 O(N*M),其中 N是构成 keyRedis对象的数量,而 M则是这些对象的平均大小。

  如果序列化的对象是比较小的字符串,那么复杂度为 O(1)

返回值:

  如果 key 不存在,那么返回 nil

      否则,返回序列化之后的值。

命令:

redis> SET greeting "hello, dumping world!"OKredis> DUMP greeting"\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"redis> DUMP not-exists-key(nil)
3.exists

Exists key

  检查给定 key 是否存在。

可用版本:

      >= 1.0.0

时间复杂度:

     O(1)

返回值:

  若 key 存在,返回 1 ,否则返回0

命令:

redis> SET db "redis"OKredis> EXISTS db(integer) 1redis> DEL db(integer) 1redis> EXISTS db(integer) 0
4.expire

Expire key seconds

为给定key设置生存时间,当key过期时(生存时间为0),它会自动删除。在redis中,带有生存时间的key被称为[易失去](volatile)

生存时间可以通过使用del命令来删除整个key来移除,或者被setgetset命令覆盖(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的key的值而不是用一个新的key值来代替(replace)它的话,那么生存时间不会被改变。

比如说,对一个key执行INCR命令,对一个列表进行LPUSH命令。或者对一个哈希表执行HSET命令。这类操作都不会改变本身的生存时间。

另一方面,如果使用RENAME对一个key进行改名,那么改名后的key的生存时间和改名前一样。

RENAME命令的另一种可能是,尝试将一个带生存时间的key改名成另一个带生存时间的another_key,这是旧的another_key(以及它的生存时间)会被删除,然后旧的key会被改名为another_key,因此,新的another_key的生存时间也和原本的key一样。

使用persist命令可以在不删除key的情况下,移除key的生存时间,让key重新成为一个[持久的](persistent)key

更新生存时间

可以对一个已经带有生存时间的key执行expire命令,新指定的生存时间会取代旧的生存时间

过期时间的精确度

  在redis2.4版本中,过期时间延迟在1秒钟之内---也即是,就算key已经过期,但它还是可能在过期之后1秒钟之内被访问到,而在新的redis2.6版本中,延迟被降低到1毫秒之内。

Redis2.1.3之前的不同之处

  在redis2.1.3之前的版本中,修改一个带有生存时间的key会导致整个key被删除,这一行为是受当时复制(replication)层的限制而作出,现在这一限制已经被修复。

可用版本:

     >= 1.0.0

时间复杂度:

    O(1)

返回值:

 设置成功返回 1

 当 key 不存在或者不能为 key 设置生存时间时(比如在低于2.1.3 版本的Redis 中你尝试更新key 的生存时间),返回0

命令:

127.0.0.1:6379> set age 23OK127.0.0.1:6379> expire age 30 #设置过期时间为30秒(integer) 1127.0.0.1:6379> ttl age#查看剩余生存时间(integer) 24127.0.0.1:6379> expire age 6000  #更新过期时间(integer) 1127.0.0.1:6379> PERSIST age     #持久化的age(integer) 1127.0.0.1:6379> ttl age(integer) -1
模式:导航会话

假设你有一项web服务,打算根据用户最近访问的N个页面来进行物品推荐,并且假设用户停止阅览超过60秒,那么就清空阅览记录(为了减少物品推荐的计算量,并且保持推荐物品的新鲜度)

这些最近访问的页面记录,我们称之为[导航会话](Navigation session),可以用INCRRPUSH命令在redis中 实现它:每当用户阅览一个网页时,执行以下代码:

MULTI    RPUSH pagewviews.user:<userid> http://.....    EXPIRE pagewviews.user:<userid> 60EXEC
如果用户停止阅览超过60秒,那么它的导航会话就会被清空,当用户重新开始阅览的时候,系统又会重新记录导航会话,继续进行物品推荐。

5.keys

Keys pattern

  查找所有符合给定模式patternkey

      Keys * 匹配当前数据库中所有的key

      Keys h?llo 匹配hello,hallohxllo等等。

      Keys h*llo 匹配hlloheeeeello等等。

      Keys h[ae]llo 匹配hellohallo,但不匹配hillo

  特殊符号用\隔开

      Keys的速度非常快,但是在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据库中查找特定的key,你最好还是用redis的集合结构(set)来代替。

可用版本:

     >= 1.0.0

时间复杂度:

     O(N)N为数据库中 key的数量。

返回值:

  符合给定模式的 key列表

命令:

redis> MSET one 1 two 2 three 3 four 4  # 一次设置 4 个 keyOKredis> KEYS *o*1) "four"2) "two"3) "one"redis> KEYS t??1) "two"redis> KEYS t[w]*1) "two"redis> KEYS *  # 匹配数据库内所有 key1) "four"2) "three"3) "two"4) "one
6.migrate

Migrate host por key destination-db timeout [copy] [replace]

key原子性的从当前实例传送到目标实例指定数据库上,一旦传送成功,key保证会出现在目标实例上,而当前实例上的key会被删除。

这是命令是一个原子操作,它在执行的时候回会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。

命令的内部实现是这样的:它在当前实例对给定key执行DUMP命令,将它序列化,然后传送到目标实例,目标实例再使用restore对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到restore命令返回OK,它就会调用DEL删除自己数据库上的key

Timeout参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在timeout毫秒内完成,只是说数据传送的时间不能超过这个timeout数。

Migrate命令需要在给定的时间内完成IO操作。如果在传送数据时发生IO错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误:IOERR

IOERR出现时,有以下两种可能:

---key可能存在于两种实例

---key可能只存在于当前实例

唯一不可能的发生的情况就是丢失key,因此,如果一个客户端执行migrate命令,并且不幸遇上IOERR错误,那么这个客户端唯一要做的就是检查自己数据库上的key是否已经被正确的删除。

如果有其它错误发生,那么migrate保证key只会出现在当前实例中。(当然,目标实例的给定数据库上可能有key同名的键,不过这和migrate命令没关系)

可选项:

COPY :不移除源实例上的 key

REPLACE :替换目标实例上已存在的 key

可用版本:

>= 2.6.0

时间复杂度:

   这个命令在源实例上实际执行 DUMP命令和 DEL 命令,在目标实例执行 RESTORE命令,查看以上命令的文档可以看到详细的复杂度说明。

Key 数据在两个实例之间传输的复杂度为 O(N)

返回值:

   迁移成功时返回 OK,否则返回相应的错误。

命令:

先启动两个 Redis 实例,一个使用默认的 6379 端口,一个使用 7777 端口。$ ./redis-server &[1] 3557...$ ./redis-server --port 7777 &[2] 3560...然后用客户端连上 6379 端口的实例,设置一个键,然后将它迁移到 7777 端口的实例上:$ ./redis-cliredis 127.0.0.1:6379> flushdbOKredis 127.0.0.1:6379> SET greeting "Hello from 6379 instance"OKredis 127.0.0.1:6379> MIGRATE 127.0.0.1 7777 greeting 0 1000OKredis 127.0.0.1:6379> EXISTS greeting      # 迁移成功后 key 被删除(integer) 0使用另一个客户端,查看 7777 端口上的实例:$ ./redis-cli -p 7777redis 127.0.0.1:7777> GET greeting"Hello from 6379 instance"
7.move

Move key db

将当前数据库的key移动到给定的数据库db

如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定key,或者key不存在于当前数据库,那么move没有任何效果。

因此,也可以利用这一特性,将move当做锁(locking)原语(primitive)

可用版本:

>= 1.0.0

时间复杂度:

O(1)

返回值:

   移动成功返回 1 ,失败则返回 0

命令:

# key 存在于当前数据库redis> SELECT 0      # redis默认使用数据库 0,为了清晰起见,这里再显式指定一次。OKredis> SET song "secret base - Zone"OKredis> MOVE song 1   # 将 song 移动到数据库 1(integer) 1redis> EXISTS song   # song 已经被移走(integer) 0redis> SELECT 1     # 使用数据库 1OKredis:1> EXISTS song # 证实 song 被移到了数据库 1 (注意命令提示符变成了"redis:1",表明正在使用数据库 1)(integer) 1# 当 key 不存在的时候redis:1> EXISTS fake_key(integer) 0redis:1> MOVE fake_key 0  # 试图从数据库 1 移动一个不存在的 key 到数据库 0,失败(integer) 0redis:1> select 0         # 使用数据库0OKredis> EXISTS fake_key    # 证实 fake_key 不存在(integer) 0# 当源数据库和目标数据库有相同的 key 时 redis> SELECT 0          # 使用数据库0OKredis> SET favorite_fruit "banana"OKredis> SELECT 1         # 使用数据库1OKredis:1> SET favorite_fruit "apple"OKredis:1> SELECT 0    # 使用数据库0,并试图将 favorite_fruit 移动到数据库 1OKredis> MOVE favorite_fruit 1    # 因为两个数据库有相同的 key,MOVE 失败(integer) 0redis> GET favorite_fruit    # 数据库 0 的 favorite_fruit 没变"banana"redis> SELECT 1OKredis:1> GET favorite_fruit    # 数据库 1 的 favorite_fruit 也是"apple"
8.persist

persist key

移除给定key的生存时间,将这个key[易失的](带生存时间key)转换成[持久的](一个不带生存时间、永不过期的key)

可用版本:

>= 2.2.0

时间复杂度:

O(1)

返回值:

   当生存时间移除成功时,返回 1 .

   如果 key 不存在或 key 没有设置生存时间,返回0

命令:

redis> SET mykey "Hello"OKredis> EXPIRE mykey 10  # 为 key 设置生存时间(integer) 1redis> TTL mykey(integer) 10redis> PERSIST mykey    # 移除 key 的生存时间(integer) 1redis> TTL mykey(integer) -1
9.randomkey

randomkey

从当前数据库中随机返回(不删除)一个key

可用版本:

>= 1.0.0

时间复杂度:

O(1)

返回值:

   当数据库不为空时,返回一个 key

   当数据库为空时,返回 nil

命令:

# 数据库不为空redis> MSET fruit "apple" drink "beer" food "cookies"   # 设置多个 keyOredis> RANDOMKEY"fruit"redis> RANDOMKEY"food"redis> KEYS *    # 查看数据库内所有key,证明 RANDOMKEY 并不删除 key1) "food"2) "drink"3) "fruit"# 数据库为空redis> FLUSHDB  # 删除当前数据库所有 keyOKredis> RANDOMKEY
10.rename

Rename key newkey

key改名为newkey

keynewkey相同,或者key不存在时,返回一个错误。

newkey已经存在时,rename命令将覆盖旧值。

可用版本:

>= 1.0.0

时间复杂度:

O(1)

返回值:

   改名成功时提示 OK,失败时候返回一个错误。

命令:

# key 存在且 newkey 不存在redis> SET message "hello world"OKredis> RENAME message greetingOKredis> EXISTS message               # message 不复存在(integer) 0redis> EXISTS greeting              # greeting 取而代之(integer) 1# 当 key 不存在时,返回错误redis> RENAME fake_key never_exists(error) ERR no such key# newkey 已存在时, RENAME 会覆盖旧 newkeyredis> SET pc "lenovo"OKredis> SET personal_computer "dell"OKredis> RENAME pc personal_computerOKredis> GET pc(nil)redis:1> GET personal_computer      # 原来的值 dell 被覆盖了"lenovo"
11.TTL

TTL key

以秒为单位,返回给定key的剩余生存时间(TTL,time to live)

可用版本:

>= 1.0.0

时间复杂度:

O(1)

返回值:

   当key不存在时,返回-2

   当key存在但没有设置剩余生存时间时,返回-1

   否则,以秒为单位,返回key的剩余生存时间。

注意:在redis2.8以前当key不存在时,或者key没有设置剩余时间时,命令都返回-1

命令:

# 不存在的 keyredis> FLUSHDBOKredis> TTL key(integer) -2# key 存在,但没有设置剩余生存时间redis> SET key valueOKredis> TTL key(integer) -1# 有剩余生存时间的 keyredis> EXPIRE key 10086(integer) 1redis> TTL key(integer) 10084
12.Type

Type key

返回key所存储的值的类型

可用版本:

>= 1.0.0

时间复杂度:

O(1)

返回值:

none(key不存在)  string(字符串)  list(列表)  set(集合)  zset(有序集)  hash(哈希表)

命令:

# 字符串redis> SET weather "sunny"OKredis> TYPE weatherstring# 列表redis> LPUSH book_list "programming in scala"(integer) 1redis> TYPE book_listlist# 集合redis> SADD pat "dog"(integer) 1redis> TYPE patset


0 0
原创粉丝点击