Redis 安装与使用
一、安装与配置
1. 安装
(1)Linux 源码安装
1)准备工作
-
安装依赖
yum install -y gcc make wget gcc-c++ # 核心编译依赖,gcc 需 4.8+(Redis 6+ 要求)- 依赖于 gcc
2)下载并解压
wget https://github.com/redis/redis/archive/refs/tags/8.4.0.tar.gz
tar -xvf 8.4.0.tar.gz
3)编译源码
# 进入源码目录
cd /server/softwares/redis-8.4.0/src
# 执行编译(默认编译所有模块,-j 指定 CPU 核心数加速,如 -j4)
make -j$(nproc)
# 编译验证:无 error 即成功,若报"jemalloc/jemalloc.h"错误,执行:
# make MALLOC=libc
4)安装
# 默认安装到 /usr/local/bin(系统 PATH 路径,可直接执行 redis 命令)
make install
# 验证安装:查看命令是否存在
ls /usr/local/bin/redis-* # 应显示 redis-server、redis-cli、redis-sentinel 等
- 生成的二进制文件
- redis-benchmark:基线测试工具
- redis-check-aof:aof 文件修复工具
- redis-check-rdb:rdb 文件修复工具
- redis-cli:客户端工具
- redis-sentinel:哨兵工具
- redis-server:服务器启动命令
(2)Docker 安装
略。
2. 初始化目录和配置
# 创建数据、配置、日志目录(规范部署)
mkdir -p /data/redis/{data,conf,log}
# 复制默认配置文件到自定义目录,并修改核心配置
cp /server/softwares/redis-8.4.0/redis.conf /data/redis/conf/
# 需修改的核心配置(极简版):
bind 0.0.0.0 # 注释掉,或改为 0.0.0.0,允许所有 IP 访问(生产需限定具体 IP)
protected-mode no # 关闭保护模式
daemonize yes # 后台守护进程运行
pidfile /var/run/redis_6379.pid
dir /data/redis/data # 数据存储目录
logfile /data/redis/log/redis.log # 日志文件
requirepass yourpassword # 设置密码(生产必配)
maxmemory 1G # 限制最大内存(按需调整)
maxmemory-policy volatile-lru # 内存淘汰策略
3. 启动时常见警告及解决
(1)内存超配警告
[root@yingzai conf]# redis-server /data/redis/conf/redis.conf
145119:C 28 Dec 2025 15:45:31.563 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[root@yingzai conf]# vim /etc/sysctl.conf
-
报错原因:Redis 执行 RDB 持久化、主从复制时需临时申请内存,即使实际内存充足,也可能因内核的内存超配检查失败导致操作异常,因此 Redis 强制建议将其设为 1(允许内存超配,仅检查物理内存 + 交换分区是否足够)。
-
解决方案
-
永久解决
# 1. 编辑 sysctl 配置文件 echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf # 2. 重载配置使修改生效(无需重启) sysctl -p /etc/sysctl.conf -
验证配置
# 查看参数是否已设为 1 sysctl vm.overcommit_memory # 正确输出:vm.overcommit_memory = 1
-
二、启动与管理
1. 启动
# 启动(指定自定义配置文件)
redis-server /data/redis/conf/redis.conf
2. 验证
# 1. 验证启动状态
ps -ef | grep redis-server # 查看进程
netstat -tulpn | grep 6379 # 查看端口(默认 6379)
lsof -i:6379 # 端口
# 2. 连接测试
[root@yingzai conf]# redis-cli -p 6379 -a 12345678
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> keys *
1) "test"
127.0.0.1:6379> get test
"123"
-
登录后的密码警告
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.-
报错原因:这是一个标准错误输出,不影响使用
-
解决方案
-
分两次登录:无密码登录后,再输入密码
[root@yingzai conf]# redis-cli -p 6379 127.0.0.1:6379> auth 12345678 OK -
标准错误输出到黑洞
[root@yingzai conf]# redis-cli -p 6379 -a 12345678 2>/dev/null 127.0.0.1:6379>
-
-
3. 关闭
(1)通过 Redis 客户端关闭(推荐)
redis-cli shutdown
(2)通过 kill 命令杀死进程
ps -ef | grep redis
kill -9 xxx
命令合并之后:
ps -ef | grep redis | grep -v grep | awk '//{print $2}' | xargs kill -9
- 注意:强行杀死进程,此时 Redis 可能还有操作未完成
4. 卸载
- 停止服务
- 删除 /usr/local/bin 下以 redis 开头的文件
三、Redis 基础使用
1. 数据库实例
- 默认创建 16 个库,可以通过配置文件修改,库的编号是 0-15
- 与关系型数据库的区别
- Redis 中的库不能自定义命名,只能用序号表示
- 使用时最好一个应用使用一个 Redis 实例,应用之间数据通过库隔离
- Redis 实例本身所占的空间很小,所以不会浪费存储空间
2. 基础操作
(1)连接 Redis
redis-cli -h 127.0.0.1 -p 6379
- -h:指定主机
- -p:指定端口
(2)退出 Redis
- exit 或 quit
(3)查看状态
-
ping
# 返回 PONG,表示服务正常 127.0.0.1:6379> ping PONG
(4)查看服务器统计信息
-
info [section] [section]
info server- section:指定需要统计的区域,包括 server、client、memory 等;如果不加参数,表示统计全部信息
(5)获取配置文件信息
-
config get [parameter]
127.0.0.1:6379[1]> config get * 1) "shutdown-timeout" 2) "10" 3) "cluster-node-timeout" 4) "15000" ... 127.0.0.1:6379[1]> config get port 1) "port" 2) "6379"- parameter:指定具体参数;* 表示所有信息
3. 数据库操作
- SELECT db:切换数据库(默认 0-15 共 16 个库),时间复杂度 O(1)
- FLUSHDB:清空当前数据库所有键,时间复杂度 O(N)(N 为当前库键数)
- FLUSHALL:清空所有数据库所有键,时间复杂度 O(N)(N 为总键数)
- DBSIZE:获取当前数据库键的数量,时间复杂度 O(1)
- SWAPDB db1 db2:交换两个数据库的所有数据,时间复杂度 O(1)
4. Key 的通用操作
(1)常用操作
- DEL key1 key2…:删除指定键(支持批量),时间复杂度 O(N)(N 为删除键数)
- UNLINK key:非阻塞删除。仅将 key 从 keyspace 元数据中删除,真正的删除在后续异步执行。
- EXISTS key:判断键是否存在,时间复杂度 O(1)
- EXPIRE key seconds:设置键过期时间(秒级),时间复杂度 O(1)
- PEXPIRE key ms:设置键过期时间(毫秒级),时间复杂度 O(1)
- TTL key:获取键剩余过期时间(秒,-1 = 永不过期,-2 = 不存在),时间复杂度 O(1)
- PTTL key:获取键剩余过期时间(毫秒),时间复杂度 O(1)
- PERSIST key:移除键的过期时间(变为永不过期),时间复杂度 O(1)
- RENAME key newkey:重命名键(newkey 存在则覆盖),时间复杂度 O(1)
- RENAMENX key newkey:仅 newkey 不存在时重命名,时间复杂度 O(1)
- TYPE key:获取键对应值的数据类型(string/hash/list 等),时间复杂度 O(1)
- KEYS pattern:按通配符匹配键(如 KEYS user:),时间复杂度 O(N)(N 为数据库总键数),支持匹配符:、?、()
- SCAN cursor [MATCH pattern] [COUNT n]:迭代遍历键(非阻塞,替代 KEYS),时间复杂度 O(1)(单次)/O(N)(全量)
- MOVE key db:将键移动到指定数据库(如 MOVE user:1001 1),时间复杂度 O(1)
- RANDOMKEY:随机返回一个存在的键,时间复杂度 O(1)
(2)业务场景
- 键生命周期管理:EXPIRE/PEXPIRE 设置缓存过期(如商品缓存 30 分钟),TTL 监控过期时间;
- 批量清理数据:DEL 批量删除无用键,SCAN 遍历删除符合规则的键(如过期的日志键);
- 数据迁移:MOVE 拆分不同业务数据到不同数据库;
- 类型校验:TYPE 排查数据类型错误(如误将 Hash 存为 String)。
(3)注意事项
- KEYS 命令在键数量大时(如百万级)会阻塞主线程,生产环境优先用 SCAN;
- SCAN 的 cursor 为 0 表示遍历结束,COUNT 仅为提示值,实际返回数量可能不符;
- RENAME 会覆盖已有 newkey,需先 EXISTS 校验,或用 RENAMENX;
- EXPIRE 对 Hash/ZSet 等类型仅作用于整个 key,无法单独设置字段 / 元素过期。