命令分类
在 Redis 基础篇当中,根据用户操作对象的不同,相关的命令也不同,大体可分为三类:
- 基础性命令
- 对 key 的操作命令
- 对 value 的操作命令
命令的补齐和 Shell 命令的补齐方式一样,都是使用 Tab 键。
所有的命令都可以在这里找到用法和说明—— https://redis.io/commands/
基础性命令
# 首先将我们的 Redis 实例启动
Shell > /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
# 接着使用 redis-cli 连接到 Redis ,不指定数据库,默认使用 0 号数据库。相关的 Shell 命令为:
Shell > /usr/local/redis/bin/redis-cli -h 192.168.100.3 -p 6379 -a MyPassword
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.100.3:6379>
-
ping
命令用于检测 Redis 实例是否在正常工作.
192.168.100.3:6379> ping PONG
-
set
和get
命令set 命令的用法为——
set KEY VALUE
,这会将相应的 key-value 写入到 DB 中。get 命令的用法为——get KEY
,根据 key 获取相应的 value。使用示例如下所示:192.168.100.3:6379> set cityname WuHan OK 192.168.100.3:6379> set city_id 430000 OK 192.168.100.3:6379> get cityname "WuHan" 192.168.100.3:6379> get city_id "430000"
mset
和 mget
命令。-
select
命令前面我们说明配置文件的 GENERAL 部分时,有这样的一个配置参数和值——databases 16。该参数表示配置数据库的数量,值为16,表示从 0 编号的数据库,即 db0、db1…db15。
select 命令就是用来切换数据库的,用法为——
select 数据库编号
# 比如您需要切换到 10 号数据库,请键入 ## 当您切换数据库编号后,相应的终端提示符会发生变化 192.168.100.3:6379> select 10 OK 192.168.100.3:6379[10]>
-
dbsize
命令用来获取当前数据库中 key 的数量。
192.168.100.3:6379[10]> select 0 OK 192.168.100.3:6379> dbsize (integer) 2
-
flushdb
命令用来清空当前所在库的所有数据,在生产环境下慎用!!!
-
flushall
命令用来清空所有库的所有数据,在生产环境下慎用!!!
flushdb 命令和 flushall 命令会对生产环境下的数据造成很大影响,一般都会禁用掉。这在前面的《Redis基础篇04 — 客户端连接前的一些基本配置工作》中我们说明过了。
-
help
命令查看命令的帮助信息
192.168.100.3:6379> help get GET key summary: Returns the string value of a key. since: 1.0.0 group: string
帮助分4行,第一行说明用法;第二行是命令的说明;第三行是命令存在的起始时间;第四行表示命令的分组
-
quit
命令用来退出 Redis 的交互命令行,使用
exit
命令也可以退出。
对 key 的操作命令
Redis 是一个 KV 型的 NoSQL(有些资料也会把 Redis 称为 内存型数据库 或 缓存型数据库),它会将数据全部以 键值对 的形式存储在内存当中,key 与 value 一 一对应,检索 key 就能找到相关的 value。
众所周知,Redis 支持常用的五个 value 数据类型,分别是:
- strings(字符串)
- hashes(哈希)
- lists(列表)
- sets (集合)
- sorted set(有序集合)
关于这个数据类型,后面有专门的篇幅介绍。
-
type
命令虽然我们说数据类型针对的是 value ,但是 key 的数据类型与 value 一 一对应,即如果一个 key 的 value 是 string 类型的,则这个 key 也是 string 类型的。我们可以键入 type 命令查看 key 的类型,比如:
192.168.100.3:6379> type cityname string 192.168.100.3:6379> type city_id string
-
exists
命令判断一个或多个 key 是否存在,用法为——
exists KEY1 KEY2 ...
。若 1 个 key 存在,则返回 1 ;若 2 个 key 存在,则返回 2,以此类推。192.168.100.3:6379> exists cityname city_id (integer) 2
-
del
命令删除一个或多个 key,用法为——
del KEY1 KEY2 ...
。命令执行后,返回被删除的 key 数量,若 key 不存在,则会被忽略。192.168.100.3:6379> del cityname city_id (integer) 2
为了后面演示,重新将数据补上:
192.168.100.3:6379> set cityname WuHan OK 192.168.100.3:6379> set city_id 430000 OK
-
keys
命令根据 pattern 查找 key,用法为——
keys pattern
。命令执行后返回的结果为数组。pattern 支持一些样式(其实就是 bash 当中的通配符样式,只不过 bash 用来匹配文件名或目录名,而 Redis 当中则是用来匹配 key),比如:- keys h?llo // 匹配 hello、hallo 和hxllo
- keys h*llo // 匹配 hllo 和 heeeello
- keys h[ae]llo // 匹配 hallo 和 hello ,但是不匹配 hillo
- keys h[^e]llo // 匹配 hallo、hbllo,但是不匹配 hello
- keys h[a-c]llo // 匹配 hallo、hbllo、hcllo
- keys * // 查找当前库中的所有 key
bash 中常见的通配符:
通配符样式 作用 ? 匹配文件名或目录名的一个字符 * 匹配文件名或目录名的 0 个或多个任意字符 [ ] 匹配括号中的任何一个字符。例如 [one] 意思是匹配o、n或e [-] 匹配括号中给定范围内的任何单个字符。例如 [0-9] 表示匹配从 0 到 9 的任何单个数字 [^] 单个字符的「逻辑非」匹配。例如 [^a-zA-Z] 表示匹配单个非字母字符。 192.168.100.3:6379> keys * 1) "city_id" 2) "cityname"
scan
命令作为替代,因为 keys
命令会对 Redis 的性能造成影响,当操作的是一个大型库时,可能会因为阻塞造成服务中断。-
rename
命令对 key 进行重命名。
# 当旧的 key 名称不存在时,返回错误 192.168.100.3:6379> rename city1 city_d (error) ERR no such key # 当对已经存在的 key 进行重命名时,如果新的 key 的名称已经存在于当前库中,则会将其 value 覆盖 192.168.100.3:6379> get cityname "WuHan" 192.168.100.3:6379> rename city_id cityname OK 192.168.100.3:6379> get cityname "430000"
-
move
命令将当前库中的一个 key 移动到另外一个库中。不支持对多个 key 的移动。
192.168.100.3:6379> move cityname 3 (integer) 1 192.168.100.3:6379> select 3 OK 192.168.100.3:6379[3]> keys * 1) "cityname" 192.168.100.3:6379[3]> move cityname 0 (integer) 1
-
expire
命令 和pexpire
命令为 key 设置过期时间(生存时间),到达了过期时间,key就会被自动删除,这时候的 key 状态被称为「易失性」,用法为:
expire key 秒数
pexpire key 毫秒数
192.168.100.3:6379> expire city_id 5 (integer) 1
-
ttl
命令和pttl
命令查看 key 剩余的生存时间,ttl 执行成功后返回秒数(如果 key 是存在的),pttl 执行后返回毫秒数(如果 key 是存在的)。如果被查看的 key 是不存在的,则返回 -2 ;如果 key 未设置生存时间,返回 -1。
192.168.100.3:6379> expire cityname 20 (integer) 1 192.168.100.3:6379> ttl cityname (integer) 15 192.168.100.3:6379> ttl number (integer) -2
-
persist
命令移除 key 的生存时间,将 key 的状态由「易失性」变更为「持久化」。若 key 不存在,返回0;若 key 存在,返回 1
192.168.100.3:6379> persist stu_class (integer) 0
-
randomkey
命令在当前库中返回一个随机 key。有时需要在编程语言中调用 Redis 的 API,用来判断一个库中是否存在数据。
192.168.100.3:6379> randomkey
-
scan
命令遍历库中的 key。
192.168.100.3:6379> help scan SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] summary: Iterates over the key names in the database. since: 2.8.0 group: generic
cursor 表示指针或游标,从哪里开始遍历。pattern 表示匹配的模式。COUNT 是可选的,表示每次遍历后返回的 key 数量,默认值为 10,指定了 COUNT 参数的值,并不能保证一定返回相同数量的 key。
# 写入一些数据 192.168.100.3:6379> mset stu_name frank city_name GZ level 0 class 7 log_level debug price 100 number 30 size 100kib file_inode 30698 speed 100Mbps add yes test abcdef port 6379 OK 192.168.100.3:6379> keys * 1) "port" 2) "stu_name" 3) "level" 4) "city_name" 5) "file_inode" 6) "test" 7) "log_level" 8) "class" 9) "number" 10) "add" 11) "price" 12) "size" 13) "speed"
第一次遍历:使用 0 作为游标并返回 10 个key
192.168.100.3:6379> scan 0 1) "3" // 表示下一次开始遍历时的指针 2) 1) "level" 2) "city_name" 3) "file_inode" 4) "log_level" 5) "add" 6) "price" 7) "size" 8) "speed" 9) "class" 10) "number"
第二次遍历:使用 3 作为游标并返回 3 个 key
192.168.100.3:6379> scan 3 count 3 1) "15" 2) 1) "port" 2) "stu_name" 3) "test"
根据模式筛选 key:
192.168.100.3:6379> scan 3 match *stu* count 3 1) "15" 2) 1) "stu_name"
使用 scan 有几点需要注意:
- 在实际的生产环境下,由于 KV 数据是不断 增加/修改/删除 的,因此没办法保证能匹配所有的 key
- 在实际的生产环境下,由于 KV 数据是不断 增加/修改/删除 的,因此,通过 MATCH 匹配 key 可能会返回相同的 key
- 指定 COUNT 参数的值,并不能保证一定返回相同数量的 key
- scan 的初始游标是 0,如果 KV 数据没有被反复的 增加/修改/删除 ,则直到下次使用 scan 再次返回游标 0,表示这是一个完整遍历
- MATCH 参数值支持的样式与
keys
命令 是相同的,如 ? 、*、[ae]、[^1-9]
-
touch
命令用来修改一个或多个 key 的最后访问时间,将最后的访问时间修改为当前时间。
192.168.100.3:6379> touch price speed (integer) 2
-
object
命令从内部查看你给定 key 的 Redis 对象。用法为——
object 子命令 KEY
子命令可以有:
- encoding // key 的底层编码
- freq
- help
- idletime // key 的空闲时间,以秒为单位。每次使用 get 或 touch 命令后,空闲时间都会被重新记录
- refcount // 查看给定 key 被引用的次数