1. redis基础命令
Redis
命令通过Redis
客户端对 redis
服务端执行相应操作,Redis
客户端在官方下载的 redis
的 安装包中– redis-cli
。
语法
redis-cli -h host -p port -a password
[root@redis bin] ./redis-cli #连接本地Redis
127.0.0.1:6379> ping #执行 PING 命令,该命令用于检测 redis 服务是否启动
PONG
[root@localhost ~] redis-cli -h 172.24.8.78 -p 6379 #连接至远程Redis
172.24.8.78:6379> ping
PONG
2. redis key命令
DEL
语法:DEL key [key ...]
作用:删除给定的一个或多个 key ,不存在的 key 会被忽略。
示例:
127.0.0.1:6379> set phone 123456789
OK
127.0.0.1:6379> set address "hunan china"
OK
127.0.0.1:6379> del name #删除一个key
(integer) 1
127.0.0.1:6379> del age #删除一个不存在的key
(integer) 0
127.0.0.1:6379> del phone address #删除多个key
(integer) 2
DUMP
语法:DUMP key
作用:序列化指定的 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键。
示例:
127.0.0.1:6379> set greeting "hello,how are you!"
OK
127.0.0.1:6379> dump greeting
"\x00\x12hello,how are you!\t\x00\xf3\xff\xe8\xf6\x98\xec\xbar"
127.0.0.1:6379> dump name
(nil)
EXISTS
语法:EXISTS key
作用:检查指定 key 是否存在。
示例:
127.0.0.1:6379> set name "xhy"
OK
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS age
(integer) 0
127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> EXISTS name
(integer) 0
EXPIRE
语法:EXPIRE key seconds
作用:为给定 key 设置(更新)生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
延伸: 在 Redis 中,带有生存时间的 key 被称为『易失的』(volatile)。
生存时间可以通过使用 DEL 命令删除整个 key 来移除,或者被 SET 和 GETSET 命令覆写 (overwrite)。若一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来 代替(replace),则生存时间不会被改变。
比如,对一个 key 执行 INCR 命令,对一个列表进行 LPUSH 命令,或者对一个哈希表执行 HSET 命 令等操作都不会修改 key 本身的生存时间。
若使用 RENAME 对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样。
注意:若使用RENAME 命令将一个带生存时间的 A key 改名成另一个带生存时间的 B key ,这时B key (以及它的生存时间)会被删除,然后A key 会改名为 B key ,因此,新的 B key 的生存时间也 和原本的 A key 一样。
使用 PERSIST 命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个『持 久的』(persistent) key 。
对一个已经带有生存时间的 key 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。 示例:
127.0.0.1:6379> SET myweb "www.linuxsb.com"
OK
127.0.0.1:6379> EXPIRE myweb 30
(integer) 1
127.0.0.1:6379> TTL myweb
(integer) 25
127.0.0.1:6379> EXPIRE myweb 300
(integer) 1
127.0.0.1:6379> TTL myweb
(integer) 298
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 。
示例:
127.0.0.1:6379> MSET one 1 two 2 three 3 four 4 # 设置 4 个 key
OK
127.0.0.1:6379> KEYS *o*
1) "two"
2) "four"
3) "one"
127.0.0.1:6379> KEYS t??
1) "two"
127.0.0.1:6379> KEYS t[w]*
1) "two"
127.0.0.1:6379> KEYS *
1) "three"
2) "two"
3) "four"
4) "one"
MIGATE
语法:MIGRATE host port key destinationdb timeout [COPY] [REPLACE]
作用:将 key 原子性地从当前实例传送(迁移)到目标实例的指定数据库上,一旦传送(迁移)成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。
选项:
- COPY :不移除源实例上的 key
- REPLACE :替换目标实例上已存在的 key
延伸:MIGRATE命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发 生:迁移成功,迁移失败,等到超时。
原理:
- 执行MIGRATE命令时在当前实例对给定 key 执行 DUMP 命令 ,将它序列化,然后传送到目 标实例;
- 目标实例再使用 RESTORE 对数据进行反序列化,并将反序列化所得的数据添加到数据库中;
- 当前实例相当于目标实例的客户端,监测到 RESTORE 命令返回 OK ,当前实例调用 DEL 删 除自己数据库上 key
示例:
[root@redis ~]# redis-cli
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> SET greeting "Hello from 192.168.0.110 instance" #创建一个key
OK
127.0.0.1:6379> MIGRATE 192.168.0.111 6379 greeting 0 1000 #迁移key至目标
redis实例
OK
127.0.0.1:6379> EXISTS greeting
(integer) 0
[root@redis ~]# redis-cli -h 192.168.0.111 -p 6379 #客户端连接目标
redis实例
172.24.8.119:6379> GET greeting #查看迁移后的key
"Hello from 192.168.0.110 instance"
MOVE
语法:MOVE key db
作用:将当前数据库的 key 移动指指定的数据库 db 当中。若当前数据库(源数据库)和指定数据库(目 标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。
示例:
127.0.0.1:6379> SELECT 0 # redis默认使用数据库 0。
OK
127.0.0.1:6379> SET address "hunan china" #创建一个key
OK
127.0.0.1:6379> MOVE address 1 #移动至数据库1
(integer) 1
127.0.0.1:6379> SELECT 1 #选择数据库1
OK
127.0.0.1:6379[1]> GET address #查看移动结果
"hunan china"
127.0.0.1:6379[1]> EXISTS age #查看一个未存在的key
(integer) 0
127.0.0.1:6379[1]> MOVE age 0 #尝试移动一个不存在的key
(integer) 0
127.0.0.1:6379[1]> SELECT 0 #选择数据库0
OK
127.0.0.1:6379> EXISTS age #数据库1不存在,数据库0也不存在,说明移动失败
(integer) 0
127.0.0.1:6379> SET name hhh #设置数据库0的一个key
OK
127.0.0.1:6379> SELECT 1 #选择数据库1
OK
127.0.0.1:6379[1]> set name zhangsan #设置数据库1和0相同的key
OK
127.0.0.1:6379[1]> MOVE name 0 #尝试移动此key至数据库0
(integer) 0
127.0.0.1:6379[1]> SELECT 0 #选择数据库0
OK
127.0.0.1:6379> GET name #查看数据库0的key,可知相同key存在则移动无效果
"hhh"
RENAME
语法:RENAME key newkey
作用:将 key 改名为 newkey
示例:
127.0.0.1:6379> SET message "hello world!" #创建一个A key
OK
127.0.0.1:6379> RENAME message greeting #重命名A key为B key
OK
127.0.0.1:6379> EXISTS message #查看A key是否存在
(integer) 0
127.0.0.1:6379> GET greeting #查看B key
"hello world!"
127.0.0.1:6379> RENAME myname yourname #重命名一个不存在的key
(error) ERR no such key
127.0.0.1:6379> SET logname "This is my logfile!" #新建一个C key
OK
127.0.0.1:6379> RENAME logname greeting #使用C key覆盖B key
OK
127.0.0.1:6379> GET greeting #查看B key内容,原来的B key内容被覆盖
"This is my logfile!"
RENAMENX
语法:RENAMENX key newkey
作用:当且仅当 newkey 不存在时,将 key 改名为 newkey 。当 key 不存在时,返回一个错误。当 newkey 已经存在,返回 0。
127.0.0.1:6379> SET myname xhy #创建一个A key
OK
127.0.0.1:6379> EXISTS yourname #查看B key是否存在
(integer) 0
127.0.0.1:6379> RENAMENX myname yourname #将A key重命名为B key
(integer) 1
127.0.0.1:6379> EXISTS myname #查看A key改名过是否还存在
(integer) 0
127.0.0.1:6379> GET yourname #查看B key
"xhy"
127.0.0.1:6379> SET myage 18 #创建一个A key
OK
127.0.0.1:6379> SET yourage 20 #创建一个B key
OK
127.0.0.1:6379> RENAMENX myage yourage #将A key重命名为已存在的B key
(integer) 0
127.0.0.1:6379> GET myage #查看是否重命名成功
"18"
127.0.0.1:6379> GET yourage
"20"
RESTORE
语法:RESTORE key ttl serializedvalue
作用:反序列化给定的序列化值,并将它和给定的 key 关联。参数 ttl 以毫秒为单位为 key 设置生存
时间;如果 ttl 为 0 ,那么不设置生存时间。
示例:
127.0.0.1:6379> SET address "Hunam,china!" #创建一个key
OK
127.0.0.1:6379> DUMP address #执行序列化
"\x00\x0cHunam,china!\t\x00\xdc\x0e\xa5!@X\x8a\x9c"
127.0.0.1:6379> RESTORE my_address 0 "\x00\x0cHunam,china!\t\x00\xdc\x0e\xa5!@X\x8a\x9c" #执行反序列化
OK
127.0.0.1:6379> GET my_address #查看反序列化后的key
"Hunam,china!"
127.0.0.1:6379> RESTORE my_address 0 "\x00c" #使用错误的值进行反序列化验证校验操作
(error) BUSYKEY Target key name already exists.