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。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,958评论 2 27
  • 01 有几个朋友,总是时不时地问:“丹丹,你最近都在看些什么书啊?” 好吧,我承认我只跟你们说了一半的实话。虽说内...
    丹心随行阅读 401评论 0 0
  • 就要开始新的一段学习 就像春夏秋冬一样 在每个季节收获每份别样精彩 从知道这个网站,到注册自己的账号····那么长...
    丸子妹妹阅读 112评论 0 0
  • 离自己当时订的写作目标已经过去了20天,看了看自己的完成情况,简直可以用“惨不忍睹”来形容,12篇得到专栏的留言只...
    林几点阅读 185评论 1 2