Redis 部署与查询命令

本文最后更新于 2025年9月9日 晚上

Redis的安装部署

使用系统的包管理器来安装redis :

1
dnf install redis 

或者直接通过容器拉取redis容器 :

1
2
docker pull redis
docker run -d --name my-redis -p 6379:6379 redis:latest

Redis 文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@iZbp19tqlmjz1dmnm8w43uZ _posts]# whereis redis
redis: /usr/lib64/redis /etc/redis.conf

# 重要配置
bind 127.0.0.1 ::1
# 配置环回口监听, 如果需要从外部访问要改为 bind 0.0.0.0
port 6379
# 传输端口,默认6379
daemonize no
# 是否作为后台进程执行,默认是no 即前台运行
requirepass yourpassword
# 配置数据库密码
# 启动redis 服务器
redis-server path/your_redis.conf
# 需要使用自定义的配置文件启动,自定义配置才会生效

配置Redis作为服务在服务器上启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 设置.services文件
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/redis-server /etc/my_redis/redis.conf # 定义启动项
ExecStop=/usr/bin/redis-cli -a yourpassword shutdown # 定义结束过程
Restart=always
User=redis
Group=redis

# Optional: Make sure redis has permission to write to the PID/log/data files
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
#需要注意配置为linux服务时,要将daemonize设置为no
sudo systemctl daemon-reload
#重新加载守护进程配置
sudo systemctl enable redis
#配置redis开机启动
sudo systemctl start redis
#启动redis
redis-cli -p your_port -a your_password
#进入redis

Redis支持的数据结构与常用查询

通用命令

KEYS 查看符合模板的所有key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 匹配符	含义
# * 匹配任意个字符
127.0.0.1:6380> keys *
1) "people"
2) "b"
3) "25"
4) "user"
# ? 匹配任意单个字符
127.0.0.1:6380> keys ?
1) "b"
# [abc] 匹配 a 或 b 或 c
127.0.0.1:6380> keys [eb]
1) "b"
2) "e"

DEL 删除一个指定的key

1
2
127.0.0.1:6380> del e
(integer) 1

EXISTS 判断key是否存在

1
2
3
4
127.0.0.1:6380> exists b
(integer) 1
127.0.0.1:6380> exists e
(integer) 0

EXPIRE 给一个key设置有效期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
EXPIRE  item  scends
TTL # 查询剩余有效期
127.0.0.1:6380> set a 5
OK
127.0.0.1:6380> expire a 10
(integer) 1
127.0.0.1:6380> ttl a
(integer) 8
127.0.0.1:6380> ttl a
(integer) 3
127.0.0.1:6380> ttl a
(integer) 0
127.0.0.1:6380> ttl a
(integer) -2
127.0.0.1:6380> get a
(nil)

TYPE 查看key对应值的数据类型

1
2
3
4
127.0.0.1:6380> type mystring
string
127.0.0.1:6380> type mylist
list

RENAME 重命名key

1
2
127.0.0.1:6380> rename oldkey newkey
OK

字符串String

String类型支持三种数据格式:

  • string 字符串
  • int 整数
  • float 浮点数

基本操作

SET/GET 设置/获取字符串值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 基本语法
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]

# 基本使用
127.0.0.1:6380> set name "Alice"
OK
127.0.0.1:6380> get name
"Alice"

# 设置过期时间(秒)
127.0.0.1:6380> set session:123 "user_data" EX 3600
OK

# NX: 键不存在时才设置
127.0.0.1:6380> set lock:resource "locked" NX
OK

# XX: 键存在时才设置
127.0.0.1:6380> set config:timeout "30" XX
OK

# GET: 设置新值并返回旧值
127.0.0.1:6380> set counter 5 GET
(nil)
127.0.0.1:6380> set counter 10 GET
"5"

MSET/MGET 批量设置/获取多个键值对

1
2
3
4
5
6
127.0.0.1:6380> mset name "Bob" age 25 city "Beijing"
OK
127.0.0.1:6380> mget name age city
1) "Bob"
2) "25"
3) "Beijing"

字符串操作

STRLEN 获取字符串长度

1
2
3
4
127.0.0.1:6380> set message "Hello Redis"
OK
127.0.0.1:6380> strlen message
(integer) 11

GETRANGE 截取字符串

1
2
3
4
127.0.0.1:6380> getrange message 0 4
"Hello"
127.0.0.1:6380> getrange message 6 -1
"Redis"

SETRANGE 替换字符串的部分内容

1
2
3
4
127.0.0.1:6380> setrange message 6 "World"
(integer) 11
127.0.0.1:6380> get message
"Hello World"

APPEND 向字符串末尾追加内容

1
2
3
4
127.0.0.1:6380> append message "!!!"
(integer) 14
127.0.0.1:6380> get message
"Hello World!!!"

数值操作

INCR/DECR 自增/自减

1
2
3
4
5
6
127.0.0.1:6380> set counter 10
OK
127.0.0.1:6380> incr counter
(integer) 11
127.0.0.1:6380> decr counter
(integer) 10

INCRBY/DECRBY 按指定步长自增/自减

1
2
3
4
127.0.0.1:6380> incrby counter 5
(integer) 15
127.0.0.1:6380> decrby counter 3
(integer) 12

INCRBYFLOAT 浮点数自增

1
2
3
4
127.0.0.1:6380> set price 19.99
OK
127.0.0.1:6380> incrbyfloat price 0.01
"20"

条件设置

SETNX 仅在键不存在时设置值

1
2
3
4
127.0.0.1:6380> setnx lock:user:123 "processing"
(integer) 1
127.0.0.1:6380> setnx lock:user:123 "processing"
(integer) 0

SETEX 设置值并指定过期时间

1
2
3
4
127.0.0.1:6380> setex session:abc123 3600 "user_session_data"
OK
127.0.0.1:6380> ttl session:abc123
(integer) 3599

Hash 哈希表(散列表)

Hash类型用于存储对象,相当于一个小型的key-value数据库。

基本操作

HSET/HGET 设置/获取哈希表中的字段

1
2
3
4
127.0.0.1:6380> hset user:1001 name "Alice" age 25 email "alice@example.com"
(integer) 3
127.0.0.1:6380> hget user:1001 name
"Alice"

HMSET/HMGET 批量设置/获取多个字段

1
2
3
4
5
6
127.0.0.1:6380> hmset product:123 name "Laptop" price 999.99 stock 50
OK
127.0.0.1:6380> hmget product:123 name price stock
1) "Laptop"
2) "999.99"
3) "50"

HGETALL 获取哈希表中所有字段和值

1
2
3
4
5
6
7
127.0.0.1:6380> hgetall user:1001
1) "name"
2) "Alice"
3) "age"
4) "25"
5) "email"
6) "alice@example.com"

字段操作

HKEYS/HVALS 获取所有字段名/字段值

1
2
3
4
5
6
7
8
127.0.0.1:6380> hkeys user:1001
1) "name"
2) "age"
3) "email"
127.0.0.1:6380> hvals user:1001
1) "Alice"
2) "25"
3) "alice@example.com"

HDEL 删除指定字段

1
2
127.0.0.1:6380> hdel user:1001 email
(integer) 1

HEXISTS 判断字段是否存在

1
2
3
4
127.0.0.1:6380> hexists user:1001 name
(integer) 1
127.0.0.1:6380> hexists user:1001 email
(integer) 0

HLEN 获取字段数量

1
2
127.0.0.1:6380> hlen user:1001
(integer) 2

HSTRLEN 获取字段值的长度

1
2
127.0.0.1:6380> hstrlen user:1001 name
(integer) 5

数值操作和条件设置

HINCRBY 对字段值进行数值自增

1
2
3
4
127.0.0.1:6380> hincrby user:1001 age 1
(integer) 26
127.0.0.1:6380> hincrby product:123 stock -5
(integer) 45

HSETNX 仅在字段不存在时设置值

1
2
3
4
127.0.0.1:6380> hsetnx user:1001 created_at "2025-01-01"
(integer) 1
127.0.0.1:6380> hsetnx user:1001 created_at "2025-01-02"
(integer) 0

HRANDFIELD 随机获取字段

1
2
3
127.0.0.1:6380> hrandfield user:1001 2
1) "name"
2) "age"

List 列表(双向链表)

List是一个有序的字符串列表,支持从两端进行插入和删除操作。

插入操作

LPUSH/RPUSH 从左/右侧插入元素

1
2
3
4
127.0.0.1:6380> lpush tasks "task3" "task2" "task1"
(integer) 3
127.0.0.1:6380> rpush tasks "task4" "task5"
(integer) 5

LPUSHX/RPUSHX 仅在列表存在时从左/右侧插入

1
2
3
4
127.0.0.1:6380> lpushx tasks "task0"
(integer) 6
127.0.0.1:6380> lpushx nonexist "task"
(integer) 0

LINSERT 在指定元素前/后插入新元素

1
2
3
4
127.0.0.1:6380> linsert tasks BEFORE "task3" "task2.5"
(integer) 7
127.0.0.1:6380> linsert tasks AFTER "task1" "task1.5"
(integer) 8

查询操作

LRANGE 查询指定范围的元素

1
2
3
4
5
6
7
8
9
127.0.0.1:6380> lrange tasks 0 -1
1) "task0"
2) "task1"
3) "task1.5"
4) "task2"
5) "task2.5"
6) "task3"
7) "task4"
8) "task5"

LINDEX 获取指定位置的元素

1
2
3
4
127.0.0.1:6380> lindex tasks 0
"task0"
127.0.0.1:6380> lindex tasks -1
"task5"

LPOS 查找元素的位置

1
2
3
4
5
6
127.0.0.1:6380> lpos tasks "task3"
(integer) 5
# 查找多个位置,最多搜索前10个元素
127.0.0.1:6380> lpos tasks "task" COUNT 2 MAXLEN 10
1) (integer) 0
2) (integer) 1

LLEN 获取列表长度

1
2
127.0.0.1:6380> llen tasks
(integer) 8

删除和弹出操作

LPOP/RPOP 从左/右侧弹出元素

1
2
3
4
5
127.0.0.1:6380> lpop tasks 2
1) "task0"
2) "task1"
127.0.0.1:6380> rpop tasks 1
1) "task5"

LREM 删除指定数量的指定元素

1
2
3
4
5
6
# LREM key count element
# count > 0: 从头开始删除
# count < 0: 从尾开始删除
# count = 0: 删除所有匹配元素
127.0.0.1:6380> lrem tasks 1 "task1.5"
(integer) 1

LTRIM 保留指定范围的元素,删除其他元素

1
2
127.0.0.1:6380> ltrim tasks 1 -2
OK

阻塞操作

BLPOP/BRPOP 阻塞式弹出元素

1
2
3
4
5
6
7
8
9
# 如果列表为空,等待5秒
127.0.0.1:6380> blpop empty_list 5
(nil)
(5.06s)

# 如果有元素,立即返回
127.0.0.1:6380> blpop tasks 5
1) "tasks"
2) "task2"

Set 集合

Set是一个无序的、不重复的字符串集合。

基本操作

SADD 向集合添加元素

1
2
3
127.0.0.1:6380> sadd languages "Python" "Java" "Go" "Python"
(integer) 3
# Python重复,只添加了3个元素

SMEMBERS 获取集合的所有成员

1
2
3
4
127.0.0.1:6380> smembers languages
1) "Go"
2) "Java"
3) "Python"

SREM 从集合中移除元素

1
2
127.0.0.1:6380> srem languages "Java"
(integer) 1

SPOP 随机移除并返回元素

1
2
127.0.0.1:6380> spop languages 1
1) "Go"

查询操作

SCARD 获取集合元素个数

1
2
127.0.0.1:6380> scard languages
(integer) 1

SISMEMBER 判断元素是否存在于集合中

1
2
3
4
127.0.0.1:6380> sismember languages "Python"
(integer) 1
127.0.0.1:6380> sismember languages "C++"
(integer) 0

SRANDMEMBER 随机获取元素(不删除)

1
2
127.0.0.1:6380> srandmember languages 2
1) "Python"

集合运算

SINTER 求多个集合的交集

1
2
3
4
5
6
127.0.0.1:6380> sadd backend "Python" "Java" "Go"
(integer) 3
127.0.0.1:6380> sadd frontend "JavaScript" "TypeScript" "Python"
(integer) 3
127.0.0.1:6380> sinter backend frontend
1) "Python"

SDIFF 求多个集合的差集

1
2
3
4
5
6
127.0.0.1:6380> sdiff backend frontend
1) "Java"
2) "Go"
127.0.0.1:6380> sdiff frontend backend
1) "JavaScript"
2) "TypeScript"

SUNION 求多个集合的并集

1
2
3
4
5
6
127.0.0.1:6380> sunion backend frontend
1) "Go"
2) "Java"
3) "JavaScript"
4) "Python"
5) "TypeScript"

SMOVE 将元素从一个集合移动到另一个集合

1
2
127.0.0.1:6380> smove backend frontend "Java"
(integer) 1

Sorted Set 有序集合

Sorted Set是一个有序的、不重复的字符串集合,每个元素都关联一个分数用于排序。

基本操作

ZADD 添加元素及其分数

1
2
3
4
5
127.0.0.1:6380> zadd leaderboard 100 "Alice" 85 "Bob" 92 "Charlie"
(integer) 3
# 也可以指定选项
127.0.0.1:6380> zadd leaderboard NX 95 "David" # 仅在不存在时添加
(integer) 1

ZRANGE 按排名范围获取元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 按排名(升序)
127.0.0.1:6380> zrange leaderboard 0 -1
1) "Bob"
2) "Charlie"
3) "David"
4) "Alice"

# 按排名(降序)
127.0.0.1:6380> zrevrange leaderboard 0 2
1) "Alice"
2) "David"
3) "Charlie"

# 包含分数
127.0.0.1:6380> zrange leaderboard 0 -1 WITHSCORES
1) "Bob"
2) "85"
3) "Charlie"
4) "92"
5) "David"
6) "95"
7) "Alice"
8) "100"

ZRANGEBYSCORE 按分数范围获取元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 分数在90-100之间
127.0.0.1:6380> zrangebyscore leaderboard 90 100 WITHSCORES
1) "Charlie"
2) "92"
3) "David"
4) "95"
5) "Alice"
6) "100"

# 使用开区间 (90 表示大于90,不包含90
127.0.0.1:6380> zrangebyscore leaderboard (90 +inf
1) "Charlie"
2) "David"
3) "Alice"

ZRANGEBYLEX 按字典序范围获取元素

1
2
3
4
127.0.0.1:6380> zrangebylex leaderboard [A [D
1) "Alice"
2) "Bob"
3) "Charlie"

查询操作

ZRANK/ZREVRANK 获取元素的排名

1
2
3
4
127.0.0.1:6380> zrank leaderboard "Alice"
(integer) 3
127.0.0.1:6380> zrevrank leaderboard "Alice"
(integer) 0

ZSCORE 获取元素的分数

1
2
127.0.0.1:6380> zscore leaderboard "Alice"
"100"

ZMSCORE 获取多个元素的分数

1
2
3
4
127.0.0.1:6380> zmscore leaderboard "Alice" "Bob" "Charlie"
1) "100"
2) "85"
3) "92"

ZCARD 获取集合中元素的数量

1
2
127.0.0.1:6380> zcard leaderboard
(integer) 4

ZCOUNT 统计分数范围内的元素数量

1
2
127.0.0.1:6380> zcount leaderboard 90 100
(integer) 3

修改操作

ZINCRBY 增加元素的分数

1
2
127.0.0.1:6380> zincrby leaderboard 5 "Bob"
"90"

ZREM 删除元素

1
2
127.0.0.1:6380> zrem leaderboard "Bob"
(integer) 1

ZREMRANGEBYSCORE 按分数范围删除元素

1
2
127.0.0.1:6380> zremrangebyscore leaderboard -inf 90
(integer) 0

ZREMRANGEBYLEX 按字典序范围删除元素

1
2
127.0.0.1:6380> zremrangebylex leaderboard [A [B
(integer) 1

ZREMRANGEBYRANK 按排名范围删除元素

1
2
127.0.0.1:6380> zremrangebyrank leaderboard 0 0
(integer) 1

ZPOPMAX/ZPOPMIN 弹出分数最高/最低的元素

1
2
3
4
5
6
127.0.0.1:6380> zpopmax leaderboard 1
1) "Alice"
2) "100"
127.0.0.1:6380> zpopmin leaderboard 1
1) "Charlie"
2) "92"

集合运算

ZDIFF 计算多个有序集合的差集

1
2
3
4
5
6
7
127.0.0.1:6380> zadd set1 1 "a" 2 "b" 3 "c"
(integer) 3
127.0.0.1:6380> zadd set2 2 "b" 4 "d"
(integer) 2
127.0.0.1:6380> zdiff 2 set1 set2
1) "a"
2) "c"

ZINTER 计算多个有序集合的交集

1
2
3
4
5
6
7
8
# 基本交集
127.0.0.1:6380> zinter 2 set1 set2
1) "b"

# 带权重的交集,并指定聚合方式
127.0.0.1:6380> zinter 2 set1 set2 WEIGHTS 1 2 AGGREGATE SUM WITHSCORES
1) "b"
2) "6"

ZUNION 计算多个有序集合的并集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6380> zunion 2 set1 set2 WITHSCORES
1) "a"
2) "1"
3) "c"
4) "3"
5) "d"
6) "4"
7) "b"
8) "2"

# 使用权重和聚合方式
127.0.0.1:6380> zunion 2 set1 set2 WEIGHTS 2 1 AGGREGATE MAX
1) "a"
2) "b"
3) "d"
4) "c"

Redis 部署与查询命令
http://gadoid.io/2025/04/10/Redis-部署与查询命令/
作者
Codfish
发布于
2025年4月10日
许可协议