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.
    
    • 报错原因:这是一个标准错误输出,不影响使用

    • 解决方案

      1. 分两次登录:无密码登录后,再输入密码

        [root@yingzai conf]# redis-cli -p 6379
        127.0.0.1:6379> auth 12345678
        OK
        
      2. 标准错误输出到黑洞

        [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,无法单独设置字段 / 元素过期。