Redis常见命令
约 3267 字大约 11 分钟
2025-06-25
Redis 是一个典型的 key-value 数据库,key 一般是字符串,而 value 则包含多种不同的数据类型,包括 String、Hash、List、Set 和 SortedSet。
为了方便学习,Redis 将操作不同数据类型的命令进行了分组。可以在 Redis 官网 查看不同类型的命令。不同类型的命令称为一个 group,也可以通过 help
命令来查看各种不同 group 的命令。
2.1 Redis 通用命令
通用指令是部分数据类型都可以使用的指令,常见的有:
命令 | 描述 |
---|---|
KEYS | 查看符合模板的所有 key。例如,KEYS * 可以查看所有 key,KEYS user:* 可以查看所有以 "user:" 开头的 key。注意: 在生产环境下,当 Redis 数据库包含大量 key 时,应谨慎使用该命令,因为它会阻塞 Redis 服务器,影响其性能。建议在生产环境中使用 SCAN 命令代替。 |
DEL | 删除一个指定的 key。例如,DEL user:1 可以删除 key 为 "user:1" 的数据。 |
EXISTS | 判断 key 是否存在。例如,EXISTS user:1 可以判断 key 为 "user:1" 的数据是否存在。 |
EXPIRE | 给一个 key 设置有效期,有效期到期时该 key 会被自动删除。例如,EXPIRE user:1 60 可以设置 key 为 "user:1" 的数据在 60 秒后过期。 |
TTL | 查看一个 KEY 的剩余有效期。如果返回 -1,表示该 key 永不过期;如果返回 -2,表示该 key 不存在。 |
可以通过 help [command]
查看一个命令的具体用法,例如:
# 查看 keys 命令的帮助信息:
127.0.0.1:6379> help keys
KEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic
2.2 String 类型
String 类型是 Redis 中最简单的存储类型。其 value 是字符串,不过根据字符串的格式不同,又可以分为 3 类:
- string:普通字符串。例如,
"hello"
。 - int:整数类型,可以做自增、自减操作。例如,
"123"
。 - float:浮点类型,可以做自增、自减操作。例如,
"3.14"
。
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过 512MB。
2.2.1 String 的常见命令
String 的常见命令有:
命令 | 描述 |
---|---|
SET key value | 添加或者修改已经存在的一个 String 类型的键值对。例如,SET name "Jack" 。 |
GET key | 根据 key 获取 String 类型的 value。例如,GET name 。 |
MSET key value [key value ...] | 批量添加多个 String 类型的键值对。例如,MSET name "Jack" age "20" 。 |
MGET key [key ...] | 根据多个 key 获取多个 String 类型的 value。例如,MGET name age 。 |
INCR key | 让一个整型的 key 自增 1。例如,如果 num 的值为 "1" ,执行 INCR num 后,num 的值为 "2" 。 |
INCRBY key increment | 让一个整型的 key 自增并指定步长。例如,INCRBY num 2 让 num 值自增 2。 |
INCRBYFLOAT key increment | 让一个浮点类型的数字自增并指定步长。例如,INCRBYFLOAT pi 0.1 让 pi 值自增 0.1。 |
SETNX key value | 添加一个 String 类型的键值对,前提是这个 key 不存在,否则不执行。NX 是 "Not Exist" 的缩写。 |
SETEX key seconds value | 添加一个 String 类型的键值对,并且指定有效期。EX 是 "Expire" 的缩写。例如,SETEX code 60 "123456" 可以设置 key 为 "code" 的数据在 60 秒后过期。 |
2.2.2 Key 结构
Redis 没有类似 MySQL 中的 Table 的概念,那么如何区分不同类型的 key 呢?
例如,需要存储用户、商品信息到 Redis,有一个用户 id 是 1,有一个商品 id 恰好也是 1,此时如果使用 id 作为 key,就会冲突。
可以通过给 key 添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:
Redis 的 key 允许有多个单词形成层级结构,多个单词之间用 :
隔开,格式如下:
项目名:业务名:类型:id
这个格式并非固定,也可以根据自己的需求来删除或添加词条。这样一来,就可以把不同类型的数据区分开了,从而避免了 key 的冲突问题。
例如项目名称叫 heima,有 user 和 product 两种不同类型的数据,可以这样定义 key:
- user 相关的 key:
heima:user:1
- product 相关的 key:
heima:product:1
如果 Value 是一个 Java 对象,例如一个 User 对象,则可以将对象序列化为 JSON 字符串后存储:
KEY | VALUE |
---|---|
heima:user:1 | {"id":1, "name": "Jack", "age": 21} |
heima:product:1 | {"id":1, "name": "小米11", "price": 4999} |
2.3 Hash 类型
Hash 类型,也叫散列,其 value 是一个无序字典,类似于 Java 中的 HashMap 结构。
String 结构是将对象序列化为 JSON 字符串后存储,当需要修改对象某个字段时很不方便。String 类型需要先取出整个 JSON 字符串,修改后再存入,而 Hash 类型可以直接修改某个字段。
Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD。
Hash 的常见命令有:
命令 | 描述 |
---|---|
HSET key field value | 添加或者修改 hash 类型 key 的 field 的值。例如,HSET user:1 name "Jack" 。 |
HGET key field | 获取一个 hash 类型 key 的 field 的值。例如,HGET user:1 name 。 |
HMSET key field value [field value ...] | 批量添加多个 hash 类型 key 的 field 的值。例如,HMSET user:1 name "Jack" age "20" 。 |
HMGET key field [field ...] | 批量获取多个 hash 类型 key 的 field 的值。例如,HMGET user:1 name age 。 |
HGETALL key | 获取一个 hash 类型的 key 中的所有的 field 和 value。 |
HKEYS key | 获取一个 hash 类型的 key 中的所有的 field。 |
HINCRBY key field increment | 让一个 hash 类型 key 的字段值自增并指定步长。例如,HINCRBY user:1 age 2 让 user:1 的 age 字段值自增 2。 |
HSETNX key field value | 添加一个 hash 类型的 key 的 field 值,前提是这个 field 不存在,否则不执行。 |
2.4 List 类型
Redis 中的 List 类型与 Java 中的 LinkedList 类似,可以看做是一个双向链表结构,既可以支持正向检索,也可以支持反向检索。
特征也与 LinkedList 类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
List 的常见命令有:
命令 | 描述 |
---|---|
LPUSH key element [element ...] | 向列表左侧插入一个或多个元素。例如,LPUSH mylist "a" "b" "c" ,列表中的元素顺序为 "c" "b" "a" 。 |
LPOP key | 移除并返回列表左侧的第一个元素,没有则返回 null 。 |
RPUSH key element [element ...] | 向列表右侧插入一个或多个元素。例如,RPUSH mylist "a" "b" "c" ,列表中的元素顺序为 "a" "b" "c" 。 |
RPOP key | 移除并返回列表右侧的第一个元素,没有则返回 null 。 |
LRANGE key start end | 返回一段角标范围内的所有元素。例如,LRANGE mylist 0 2 返回列表中索引 0 到 2 的元素。注意: start 和 end 都是从 0 开始计数,包括 start 和 end 对应的元素, 可以为负数,-1 表示最后一个元素,-2 表示倒数第二个元素。 |
BLPOP key [key ...] timeout | 与 LPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 null 。timeout 参数指定等待的秒数。当多个 key 都为空时,等待时间最长的 key 会优先被返回。 |
BRPOP key [key ...] timeout | 与 RPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 null 。timeout 参数指定等待的秒数。当多个 key 都为空时,等待时间最长的 key 会优先被返回。 |
2.5 Set 类型
Redis 的 Set 结构与 Java 中的 HashSet 类似,可以看做是一个 value 为 null 的 HashMap。因为也是一个 hash 表,因此具备与 HashSet 类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
Set 的常见命令有:
命令 | 描述 |
---|---|
SADD key member [member ...] | 向 set 中添加一个或多个元素。例如,SADD myset "a" "b" "c" 。 |
SREM key member [member ...] | 移除 set 中的指定元素。例如,SREM myset "a" 。 |
SCARD key | 返回 set 中元素的个数。 |
SISMEMBER key member | 判断一个元素是否存在于 set 中。例如,SISMEMBER myset "a" 。 |
SMEMBERS key | 获取 set 中的所有元素。 |
SINTER key1 key2 [key ...] | 求 key1 与 key2 的交集。 |
SDIFF key1 key2 [key ...] | 求 key1 与 key2 的差集。 |
SUNION key1 key2 [key ...] | 求 key1 与 key2 的并集。 |
练习题:
将下列数据用 Redis 的 Set 集合来存储:
- 张三的好友有:李四、王五、赵六
- 李四的好友有:王五、麻子、二狗
SADD user:zhangsan lisi wangwu zhaoliu SADD user:lisi wangwu mazi ergou
利用 Set 的命令实现下列功能:
- 计算张三的好友有几人
SCARD user:zhangsan
- 计算张三和李四有哪些共同好友
SINTER user:zhangsan user:lisi
- 查询哪些人是张三的好友却不是李四的好友
SDIFF user:zhangsan user:lisi
- 查询张三和李四的好友总共有哪些人
SUNION user:zhangsan user:lisi
- 判断李四是否是张三的好友
SISMEMBER user:zhangsan lisi
- 判断张三是否是李四的好友
SISMEMBER user:lisi zhangsan
- 将李四从张三的好友列表中移除
SREM user:zhangsan lisi
2.6 SortedSet 类型
Redis 的 SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有些类似,但底层数据结构却差别很大。SortedSet 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash 表。
SortedSet 具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为 SortedSet 的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet 的常见命令有:
命令 | 描述 |
---|---|
ZADD key score member [score member ...] | 添加一个或多个元素到 sorted set,如果已经存在则更新其 score 值。例如,ZADD myzset 1 "a" 2 "b" 3 "c" 。 |
ZREM key member [member ...] | 删除 sorted set 中的一个指定元素。例如,ZREM myzset "a" 。 |
ZSCORE key member | 获取 sorted set 中的指定元素的 score 值。例如,ZSCORE myzset "b" 。 |
ZRANK key member | 获取 sorted set 中的指定元素的排名(升序)。例如,ZRANK myzset "b" 。 排名从 0 开始。 |
ZREVRANK key member | 获取 sorted set 中的指定元素的排名(降序)。排名从 0 开始。 |
ZCARD key | 获取 sorted set 中的元素个数。 |
ZCOUNT key min max | 统计 score 值在给定范围内的所有元素的个数。例如,ZCOUNT myzset 1 3 。 注意:min 和 max 默认包含在范围内,可以使用 (min 和 (max 来表示不包含。 例如:ZCOUNT myzset (1 (3 表示 1 < score < 3 |
ZINCRBY key increment member | 让 sorted set 中的指定元素自增,步长为指定的 increment 值。例如,ZINCRBY myzset 2 "b" 让 myzset 中 b 的 score 值自增 2。 |
ZRANGE key start end | 按照 score 排序后,获取指定排名范围内的元素(升序)。例如,ZRANGE myzset 0 2 返回排名 0 到 2 的元素。和 LRANGE 一样,start 和 end 都是从 0 开始,且包含 start 和 end。 也能使用负数, -1 表示最后一个元素 |
ZREVRANGE key start end | 按照 score 排序后,获取指定排名范围内的元素(降序)。例如,ZREVRANGE myzset 0 2 返回排名最高的 3 个元素(如果 myzset 中至少有 3 个元素)。 start 和 end 都是从 0 开始,且包含 start 和 end。也能使用负数, -1 表示最后一个元素 |
ZRANGEBYSCORE key min max | 按照 score 排序后,获取指定 score 范围内的元素(升序)。例如,ZRANGEBYSCORE myzset 1 3 返回 score 在 1 到 3 之间的元素。 可以使用 (min 和 (max 来表示不包含。 例如:ZRANGEBYSCORE myzset (1 (3 表示 1 < score < 3 |
ZREVRANGEBYSCORE key max min | 按照 score 排序后,获取指定 score 范围内的元素(降序)。例如, ZREVRANGEBYSCORE myzset 3 1 返回 score 在 3 到 1 之间的元素。可以使用 (min 和 (max 来表示不包含。 例如:ZREVRANGEBYSCORE myzset (3 (1 表示 3 > score > 1 |
ZDIFF key [key ...] | 求差集。 从第一个 key 中删除所有其他 key 中的元素。返回结果,但不会更改任何集合。 |
ZINTER key [key ...] | 求交集。 |
ZUNION key [key ...] | 求并集。 |
注意:所有的排名默认都是升序,如果要降序则在命令的 Z 后面添加 REV 即可。
练习题:
将班级的下列学生得分存入 Redis 的 SortedSet 中:
- Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76
ZADD scores 85 Jack 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
利用 SortedSet 的命令实现下列功能:并实现下列功能:
- 删除 Tom 同学
ZREM scores Tom
- 获取 Amy 同学的分数
ZSCORE scores Amy
- 获取 Rose 同学的排名
ZRANK scores Rose
- 查询 80 分以下有几个学生
ZCOUNT scores -inf 79
- 给 Amy 同学加 2 分
ZINCRBY scores 2 Amy
- 查出成绩前 3 名的同学
ZREVRANGE scores 0 2
- 查出成绩 80 分以下的所有同学
ZRANGEBYSCORE scores -inf 79