Redis操作--key(键)

Key(键)

1.DEL

DEL key [key ...]
删除给定的一个或多个key。
不存在的key会被忽略。
返回值:
被删除key的数量。

#  删除单个 key
redis> SET name huangz
OK

redis> DEL name
(integer) 1

# 删除一个不存在的 key
redis> EXISTS phone
(integer) 0

redis> DEL phone # 失败,没有 key 被删除
(integer) 0

# 同时删除多个 key
redis> SET name "redis"
OK

redis> SET type "key-value store"
OK

redis> SET website "redis.com"
OK

redis> DEL name type website
(integer) 3

2.DUMP

DUMP key
序列化给定key,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键。
序列化生成的值有以下几个特点:
它带有 64 位的校验和,用于检测错误, RESTORE 在进行反序列化之前会先检查校验和。
值的编码格式和 RDB 文件保持一致。
RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作。
序列化的值不包括任何生存时间信息。
返回值:
如果key不存在,那么返回nil。
否则,返回序列化之后的值。

redis> SET greeting "hello, dumping world!"
OK

redis> DUMP greeting
"\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"

redis> DUMP not-exists-key
(nil)

3.EXISTS

EXISTS key
检查给定key是否存在。
返回值:
若key存在,返回1,否则返回0。

redis> SET db "redis"
OK

redis> EXISTS db
(integer) 1

redis> DEL db
(integer) 1

redis> EXISTS db
(integer) 0

4.EXPIRE

SDIFFSTORE destination key [key ...]
为给定key设置生存时间,当key过期时(生存时间为0),它会被自动删除。
在 Redis 中,带有生存时间的key被称为『易失的』(volatile)。
生存时间可以通过使用 DEL 命令来删除整个key来移除,或者被 SETGETSET 命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的key的值而不是用一个新的key值来代替(replace)它的话,那么生存时间不会被改变。
比如说,对一个key执行INCR 命令,对一个列表进行 LPUSH 命令,或者对一个哈希表执行 HSET 命令,这类操作都不会修改key本身的生存时间。
另一方面,如果使用 RENAME 对一个key进行改名,那么改名后的key的生存时间和改名前一样。
RENAME 命令的另一种可能是,尝试将一个带生存时间的key改名成另一个带生存时间的another_key,这时旧的another_key(以及它的生存时间)会被删除,然后旧的key会改名为another_key,因此,新的another_key的生存时间也和原本的key一样。
使用 PERSIST 命令可以在不删除key的情况下,移除key的生存时间,让key重新成为一个『持久的』(persistent)key。
更新生存时间
可以对一个已经带有生存时间的key执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。
过期时间的精确度
在 Redis 2.4 版本中,过期时间的延迟在 1 秒钟之内 —— 也即是,就算key
已经过期,但它还是可能在过期之后一秒钟之内被访问到,而在新的 Redis 2.6 版本中,延迟被降低到 1 毫秒之内。
返回值:
设置成功返回1。
当key不存在或者不能为key设置生存时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新key的生存时间),返回0。

redis> SET cache_page "www.google.com"
OK

redis> EXPIRE cache_page 30  # 设置过期时间为 30 秒
(integer) 1

redis> TTL cache_page    # 查看剩余生存时间
(integer) 23

redis> EXPIRE cache_page 30000   # 更新过期时间
(integer) 1

redis> TTL cache_page
(integer) 29996

5.EXPIREAT

EXPIREAT key timestamp
EXPIREAT 的作用和 EXPIRE 类似,都用于为key设置生存时间。
不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
返回值:
如果生存时间设置成功,返回1。

当key不存在或没办法设置生存时间,返回0。

redis> SET cache www.google.com
OK

redis> EXPIREAT cache 1355292000     # 这个 key 将在 2012.12.12 过期
(integer) 1

redis> TTL cache
(integer) 45081860

6.KEYS

KEYS pattern
查找所有符合给定模式pattern的key。
KEYS * 匹配数据库中所有key。
KEYS h?llo 匹配hello,hallo和hxllo等。
KEYS h*llo 匹配hllo和heeeeello等。

KEYS h[ae]llo匹配hello和hallo,但不匹配hillo。
特殊符号用\隔开

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

返回值:
符合给定模式的key
列表。

redis> MSET one 1 two 2 three 3 four 4  # 一次设置 4 个 key
OK

redis> KEYS *o*
1) "four"
2) "two"
3) "one"

redis> KEYS t??
1) "two"

redis> KEYS t[w]*
1) "two"

redis> KEYS *  # 匹配数据库内所有 key
1) "four"
2) "three"
3) "two"
4) "one"

7.SISMEMBER

SISMEMBER key member
将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。
返回值:
迁移成功时返回OK,否则返回相应的错误。

#先启动两个 Redis 实例,一个使用默认的 6379 端口,一个使用 7777 端口。

$ ./redis-server &
[1] 3557

...

$ ./redis-server --port 7777 &
[2] 3560

...

#然后用客户端连上 6379 端口的实例,设置一个键,然后将它迁移到 7777 端口的实例上:

$ ./redis-cli

redis 127.0.0.1:6379> flushdb
OK

redis 127.0.0.1:6379> SET greeting "Hello from 6379 instance"
OK

redis 127.0.0.1:6379> MIGRATE 127.0.0.1 7777 greeting 0 1000
OK

#迁移成功后 key 被删除
redis 127.0.0.1:6379> EXISTS greeting                           
(integer) 0

#使用另一个客户端,查看 7777 端口上的实例:
$ ./redis-cli -p 7777

redis 127.0.0.1:7777> GET greeting
"Hello from 6379 instance"

8.MOVE

MOVE key db
将当前数据库的key移动到给定的数据库db当中。
如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。
因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive)。
返回值:
移动成功返回1,失败则返回0。

# key 存在于当前数据库

# redis默认使用数据库 0,为了清晰起见,这里再显式指定一次。
redis> SELECT 0                     
OK

redis> SET song "secret base - Zone"
OK

# 将 song 移动到数据库 1
redis> MOVE song 1                  
(integer) 1

# song 已经被移走
redis> EXISTS song                  
(integer) 0

 # 使用数据库 1
redis> SELECT 1                    
OK

# 证实 song 被移到了数据库 1 (注意命令提示符变成了"redis:1",表明正在使用数据库 1)
redis:1> EXISTS song                
(integer) 1


# 当 key 不存在的时候
redis:1> EXISTS fake_key
(integer) 0

# 试图从数据库 1 移动一个不存在的 key 到数据库 0,失败
redis:1> MOVE fake_key 0                    
(integer) 0

 # 使用数据库0
redis:1> select 0                          
OK

# 证实 fake_key 不存在
redis> EXISTS fake_key                      
(integer) 0

# 当源数据库和目标数据库有相同的 key 时
# 使用数据库0
redis> SELECT 0                             
OK
redis> SET favorite_fruit "banana"
OK

 # 使用数据库1
redis> SELECT 1                            
OK
redis:1> SET favorite_fruit "apple"
OK

 # 使用数据库0,并试图将 favorite_fruit 移动到数据库 1
redis:1> SELECT 0                          
OK

 # 因为两个数据库有相同的 key,MOVE 失败
redis> MOVE favorite_fruit 1               
(integer) 0

# 数据库 0 的 favorite_fruit 没变
redis> GET favorite_fruit            
"banana"

redis> SELECT 1
OK

# 数据库 1 的 favorite_fruit 也是
redis:1> GET favorite_fruit                 
"apple"

9.SMOVE

SMOVE source destination member
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 位有符号整数编码为整数来进行储存。
  • 列表可以被编码为ziplist或linkedlist。ziplist是为节约大小较小的列表空间而作的特殊表示。
  • 集合可以被编码为intset或者hashtable。intset是只储存数字的小集合的特殊表示。
  • 哈希表可以编码为zipmap或者hashtable。zipmap是小哈希表的特殊表示。
  • 有序集合可以被编码为ziplist或者skiplist格式。ziplist用于表示小的有序集合,而skiplist则用于表示任何大小的有序集合。

假如你做了什么让 Redis 没办法再使用节省空间的编码时(比如将一个只有 1 个元素的集合扩展为一个有 100 万个元素的集合),特殊编码类型(specially encoded types)会自动转换成通用类型(general type)。
返回值:
REFCOUNT和IDLETIME返回数字。
ENCODING返回相应的编码类型

 # 设置一个字符串
redis> SET game "COD"          
OK

# 只有一个引用
redis> OBJECT REFCOUNT game     
(integer) 1

# 等待一阵。。。然后查看空闲时间
redis> OBJECT IDLETIME game     
(integer) 90

# 提取game, 让它处于活跃(active)状态
redis> GET game                 
"COD"

# 不再处于空闲状态
redis> OBJECT IDLETIME game     
(integer) 0

# 字符串的编码方式
redis> OBJECT ENCODING game     
"raw"

# 非常长的数字会被编码为字符串
redis> SET big-number 23102930128301091820391092019203810281029831092  
OK

redis> OBJECT ENCODING big-number
"raw"

# 而短的数字则会被编码为整数
redis> SET small-number 12345  
OK

redis> OBJECT ENCODING small-number
"int"

10.PERSIST

PERSIST key
移除给定key的生存时间,将这个key从『易失的』(带生存时间key)转换成『持久的』(一个不带生存时间、永不过期的key)。
返回值:
当生存时间移除成功时,返回1.
如果key不存在或key没有设置生存时间,返回0。

redis> SET mykey "Hello"
OK

# 为 key 设置生存时间
redis> EXPIRE mykey 10  
(integer) 1

redis> TTL mykey
(integer) 10

 # 移除 key 的生存时间
redis> PERSIST mykey   
(integer) 1

redis> TTL mykey
(integer) -1

11.PEXPIRE

PEXPIRE key milliseconds
这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key的生存时间,而不像 EXPIRE 命令那样,以秒为单位。
返回值:
设置成功,返回 1
key不存在或设置失败,返回 0

redis> SET mykey "Hello"
OK

redis> PEXPIRE mykey 1500
(integer) 1

redis> TTL mykey    # TTL 的返回值以秒为单位
(integer) 2

redis> PTTL mykey   # PTTL 可以给出准确的毫秒数
(integer) 1499

12.PEXPIREAT

PEXPIREAT key milliseconds-timestamp
这个命令和 EXPIREAT 命令类似,但它以毫秒为单位设置 key的过期 unix 时间戳,而不是像 EXPIREAT 那样,以秒为单位。
返回值:
如果生存时间设置成功,返回 1。
当 key不存在或没办法设置生存时间时,返回 0 。(查看 EXPIRE 命令获取更多信息)

redis> SET mykey "Hello"
OK

redis> PEXPIREAT mykey 1555555555005
(integer) 1

redis> TTL mykey           # TTL 返回秒
(integer) 223157079

redis> PTTL mykey          # PTTL 返回毫秒
(integer) 223157079318

13.PTTL

PTTL key
这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。
返回值:
当 key不存在时,返回 -2。
当 key存在但没有设置剩余生存时间时,返回 -1。
否则,以毫秒为单位,返回 key的剩余生存时间。

# 不存在的 key
redis> FLUSHDB
OK

redis> PTTL key
(integer) -2

# key 存在,但没有设置剩余生存时间
redis> SET key value
OK

redis> PTTL key
(integer) -1

# 有剩余生存时间的 key
redis> PEXPIRE key 10086
(integer) 1

redis> PTTL key
(integer) 6179

14.RANDOMKEY

RANDOMKEY
从当前数据库中随机返回(不删除)一个 key。
返回值:
当数据库不为空时,返回一个 key。
当数据库为空时,返回 nil。

# 数据库不为空
redis> MSET fruit "apple" drink "beer" food "cookies"   # 设置多个 key
OK

redis> RANDOMKEY
"fruit"

redis> RANDOMKEY
"food"

redis> KEYS *    # 查看数据库内所有key,证明 RANDOMKEY 并不删除 key
1) "food"
2) "drink"
3) "fruit"

# 数据库为空
redis> FLUSHDB  # 删除当前数据库所有 key
OK

redis> RANDOMKEY
(nil)

15.RENAME

RENAME key newkey
将 key改名为 newkey。
当 key和 newkey相同,或者 key不存在时,返回一个错误。
当 newkey已经存在时, RENAME 命令将覆盖旧值。
返回值:
改名成功时提示 OK ,失败时候返回一个错误。

# key 存在且 newkey 不存在

redis> SET message "hello world"
OK

redis> RENAME message greeting
OK

redis> EXISTS message               # message 不复存在
(integer) 0

redis> EXISTS greeting              # greeting 取而代之
(integer) 1

# 当 key 不存在时,返回错误

redis> RENAME fake_key never_exists
(error) ERR no such key

# newkey 已存在时, RENAME 会覆盖旧 newkey

redis> SET pc "lenovo"
OK

redis> SET personal_computer "dell"
OK

redis> RENAME pc personal_computer
OK

redis> GET pc
(nil)

redis:1> GET personal_computer      # 原来的值 dell 被覆盖了
"lenovo"

16.RENAMENX

RENAMENX key newkey
当且仅当 newkey 不存在时,将 key改名为 newkey 。
当 key 不存在时,返回一个错误。
返回值:
修改成功时,返回 1。
如果 newkey 已经存在,返回 0。


    原文作者:layjoy
    原文地址: https://www.jianshu.com/p/e0e572036fab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞