Redis 全方位指南:部署、运维、开发与核心功能#

Redis (Remote Dictionary Server) 是一个开源的、基于内存的键值存储系统,常被用作数据库、缓存和消息中间件。它以极高的读写性能、丰富的数据类型和原子性操作而闻名。


1. 部署与安装#

1.1 Linux (源码编译安装 - 推荐生产环境)#

源码安装可以获得最新稳定版,并能针对特定硬件优化。

# 1. 安装依赖 (GCC 等)
sudo yum install -y gcc tcl jemalloc-devel  # CentOS/RHEL
# 或
sudo apt-get install -y build-essential tcl jemalloc libjemalloc-dev # Ubuntu/Debian

# 2. 下载最新稳定版 (以 7.2 为例,请去 redis.io 确认最新版本)
wget https://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable

# 3. 编译 (使用 JEMALLOC 内存分配器以提升性能)
make MALLOC=jemalloc

# 4. 安装到系统目录
sudo make install

# 5. 验证安装
redis-server --version
redis-cli --version

配置 systemd 服务 (推荐): 创建 /etc/systemd/system/redis.service:

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target

注意:需提前创建 redis 用户并配置 /etc/redis/redis.conf

1.2 Docker 部署#

docker run --name some-redis \
  -p 6379:6379 \
  -v redis-data:/data \
  -d redis:7-alpine \
  redis-server --appendonly yes --requirepass "mystrongpassword"
  • --appendonly yes: 开启 AOF 持久化。
  • --requirepass: 设置密码。

1.3 初始配置关键点 (redis.conf)#

  • 绑定地址: bind 0.0.0.0 (生产环境务必配合防火墙或 protected-mode yes)。
  • 密码保护: requirepass your_strong_password (必须设置!)。
  • 持久化:
    • RDB: save 900 1 (900 秒内至少 1 个 key 变化则快照)。
    • AOF: appendonly yes (记录每次写操作,数据更安全)。
  • 内存限制: maxmemory 2gb (防止吃光服务器内存导致 OOM)。
  • 淘汰策略: maxmemory-policy allkeys-lru (内存满时,删除最近最少使用的 key)。

2. 日常使用命令 (增删改查)#

Redis 客户端工具为 redis-cli

2.1 连接#

# 本地连接
redis-cli

# 远程连接带密码
redis-cli -h 192.168.1.50 -p 6379 -a "mystrongpassword"
# 或在连接后 auth
AUTH "mystrongpassword"

2.2 基础 CRUD (以 String 和 Hash 为例)#

字符串 (String) - 最常用#

# 设置 (Set)
SET user:1001 "Alice"
SETNX user:1002 "Bob"  # 仅当 key 不存在时设置 (原子操作)

# 获取 (Get)
GET user:1001

# 自增/自减 (原子操作,常用于计数器)
INCR page:view:1001
INCRBY page:view:1001 10
DECR stock:item:50

# 设置过期时间 (Expire)
SETEX session:abc123 3600 "user_data_json" # 设置值并 1 小时后过期
EXPIRE user:1001 600   # 为已存在的 key 设置 10 分钟过期

# 批量操作
MSET k1 v1 k2 v2
MGET k1 k2

哈希 (Hash) - 存储对象#

# 设置字段
HSET user:1001 name "Alice" age 25 email "alice@example.com"

# 获取单个字段
HGET user:1001 name

# 获取所有字段
HGETALL user:1001

# 获取多个指定字段
HMGET user:1001 name email

# 字段自增
HINCRBY user:1001 login_count 1

# 删除字段
HDEL user:1001 age

列表 (List) - 队列/栈#

# 左推/右推 (LPush/RPush)
LPUSH tasks "task_1"
RPUSH tasks "task_2"

# 左弹/右弹 (LPop/RPop) - 阻塞式等待可用 BLPOP/BRPOP
LPOP tasks

# 获取范围
LRANGE tasks 0 -1  # 获取所有

集合 (Set) & 有序集合 (ZSet)#

# Set (去重列表)
SADD tags:post1 "redis" "nosql" "database"
SMEMBERS tags:post1
SISMEMBER tags:post1 "redis" # 检查是否存在

# ZSet (带分数的排序集合,常用于排行榜)
ZADD leaderboard 100 "player_A"
ZADD leaderboard 95 "player_B"
ZREV RANGE leaderboard 0 9 WITHSCORES # 获取前 10 名 (降序)
ZINCRBY leaderboard 5 "player_A" # 分数增加

删除与清空#

DEL key1 key2       # 删除指定 key
EXISTS key1         # 检查 key 是否存在
TTL key1            # 查看剩余生存时间 (秒)
FLUSHDB             # 清空当前数据库 (危险!)
FLUSHALL            # 清空所有数据库 (极度危险!)

3. 运维与研发常用命令#

3.1 运维人员 (Ops) 常用命令#

场景命令说明
查看服务器信息INFO核心,查看内存、CPU、持久化、连接等详细统计
监控实时命令MONITOR实时打印所有执行的命令 (生产慎用,影响性能)
慢查询日志SLOWLOG GET 10查看最近 10 条慢于 slowlog-log-slower-than 的命令
内存分析MEMORY USAGE key查看某个 key 占用的内存字节数
大 Key 查找redis-cli --bigkeys扫描发现占用内存最大的 Key (需在低峰期执行)
热 Key 查找redis-cli --hotkeys扫描访问频率最高的 Key
强制保存BGSAVE / BGREWRITEAOF后台触发 RDB 快照或 AOF 重写
查看连接ClientCLIENT LIST查看当前所有连接的客户端详情
踢出客户端CLIENT KILL ip:port强制断开指定连接
集群状态CLUSTER INFO / CLUSTER NODES查看 Cluster 模式下的节点状态和槽位分布
持久化状态LASTSAVE查看上次成功保存的时间戳

3.2 研发人员 (Dev) 常用命令/技巧#

场景命令/逻辑说明
分布式锁SET lock_key unique_value NX EX 10核心,原子性加锁 (NX=不存在才设,EX=过期时间)
限流算法INCR + EXPIREZADD + ZREMRANGEBYSCORE滑动窗口或固定窗口限流实现
发布订阅PUBLISH channel "msg" / SUBSCRIBE channel简单的消息通知机制
事务MULTIEXEC队列化命令,一次性执行 (不保证原子性回滚,仅保证隔离)
Lua 脚本EVAL "script" 0SCRIPT LOAD高级,将复杂逻辑在服务端原子执行,减少网络 RTT
管道技术redis-cli --pipe < file 或代码中 Pipeline批量发送命令,减少网络往返次数,大幅提升吞吐
位图操作SETBIT / GETBIT / BITCOUNT高效处理签到、在线状态等布尔值大数据量场景
HyperLogLogPFADD / PFCOUNT超低内存占用基数统计 (如 UV 统计,允许微小误差)

4. 核心自带功能讲解#

4.1 丰富的数据结构#

Redis 不仅仅是 Key-Value,其 Value 可以是复杂结构:

  • String: 二进制安全,可存文本、数字、图片、序列化对象。
  • List: 双向链表,适合消息队列、最新列表。
  • Hash: 字段 - 值映射,适合存储对象,修改部分字段无需重写整个对象。
  • Set: 无序去重集合,适合标签、好友关系、共同好友计算 (交集/并集/差集)。
  • ZSet (Sorted Set): 带分数的有序集合,适合排行榜、延时队列。
  • Bitmaps: 基于 String 的位操作,极大节省空间。
  • HyperLogLog: 概率算法,用于基数统计。
  • Geospatial: 基于 ZSet 的地理位置索引 (GEOADD, GEORADIUS)。
  • Stream: (5.0+) 真正的消息队列结构,支持消费者组、消息确认 (ACK)。

4.2 持久化机制#

  • RDB (Redis Database):
    • 原理:定时生成数据快照 (dump.rdb)。
    • 优点:文件紧凑,恢复速度快,适合备份。
    • 缺点:可能丢失最后一次快照后的数据。
  • AOF (Append Only File):
    • 原理:记录每次写操作命令。
    • 优点:数据更安全,可配置每秒同步 (everysec)。
    • 缺点:文件体积大,恢复速度比 RDB 慢。
  • 混合持久化 (Redis 4.0+): RDB 做镜像 + AOF 做增量,兼顾速度与安全性 (推荐)。

4.3 高可用架构#

  • 主从复制 (Master-Slave): 一主多从,数据异步复制,从库只读。
  • 哨兵模式 (Sentinel):
    • 监控主从节点健康。
    • 自动故障转移 (Master 挂掉,选举新 Master)。
    • 配置中心,通知客户端新 Master 地址。
  • Redis Cluster (集群):
    • 去中心化,无主从概念,所有节点平等。
    • 数据分片 (Sharding): 16384 个槽 (Slots),自动分布到不同节点。
    • 支持在线扩缩容。
    • 天然高可用 (每个主节点可配置从节点)。

4.4 过期策略与内存淘汰#

  • 过期删除: 定期删除 + 惰性删除结合。
  • 内存淘汰策略 (maxmemory-policy):
    • noeviction: 不淘汰,写操作报错 (默认)。
    • allkeys-lru: 所有 key 中,淘汰最近最少使用的 (最常用)。
    • volatile-lru: 仅淘汰设置了过期时间的 key 中最近最少使用的。
    • allkeys-random / volatile-random: 随机淘汰。
    • allkeys-lfu / volatile-lfu: 淘汰最不经常使用的 (Least Frequently Used)。

5. 注意事项与最佳实践#

5.1 性能陷阱#

  • Big Key (大键):
    • 定义:Value 过大 (如 String > 10KB, Hash/List/Set/ZSet 元素过多)。
    • 危害:阻塞网络带宽,导致单线程阻塞,删除时卡顿。
    • 对策:拆分大 Key,使用 UNLINK (异步删除) 替代 DEL
  • Hot Key (热键):
    • 定义:访问频率极高的 Key。
    • 危害:单节点 CPU/带宽打满,造成热点倾斜。
    • 对策:本地缓存 + Redis 多级缓存,或将热 Key 复制多份 (如 key_1, key_2) 分散请求。
  • O(N) 命令:
    • 避免在生产环境对大集合使用 KEYS * (会导致 Redis 阻塞数秒甚至分钟级),请使用 SCAN 命令替代。
    • 慎对大 List/Set 使用 LRANGE 0 -1SMEMBERS

5.2 数据安全#

  • 密码与网络: 严禁裸奔。必须设置 requirepass,绑定内网 IP,禁用 rename-command 高危命令 (如 FLUSHALL, CONFIG, DEBUG)。
  • 持久化配置: 生产环境建议开启 AOF (appendfsync everysec) 并定期备份 RDB 文件到远程存储。
  • 主从同步风险: 首次全量同步会阻塞 Master,建议在从库初始化时不要有大流量写入。

5.3 开发规范#

  • Key 命名规范: 使用冒号分隔,如 业务名:模块名:ID (order:info:1001),便于管理和查看。
  • 设置过期时间: 缓存类数据必须设置 TTL,防止内存无限增长。
  • 缓存雪崩/击穿/穿透:
    • 雪崩: 大量 Key 同时过期 -> 设置随机过期时间。
    • 击穿: 热点 Key 过期 -> 使用互斥锁 (分布式锁) 重建缓存。
    • 穿透: 查询不存在的数据 -> 缓存空对象或使用布隆过滤器 (Bloom Filter)。
  • 事务局限性: Redis 事务 (MULTI/EXEC) 不支持回滚。如果业务强依赖 ACID 回滚,请在应用层控制或使用 Lua 脚本保证原子性。

5.4 监控建议#

  • 内存使用率: 接近 maxmemory 时需报警。
  • 命中率: keyspace_hits / (keyspace_hits + keyspace_misses),过低说明缓存设计有问题。
  • 阻塞时间: 监控 blocked_clients 和命令耗时。
  • 主从延迟: master_repl_offset - slave_repl_offset
  • 工具推荐: Prometheus + Redis Exporter + Grafana。

Redis 是高性能架构的基石。正确使用它需要理解其单线程模型的特性、内存管理机制以及不同数据结构的适用场景。避免在 Redis 中做复杂的计算,让它专注于“快”和“简单”。