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(记录每次写操作,数据更安全)。
- RDB:
- 内存限制:
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 重写 |
| 查看连接Client | CLIENT 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 + EXPIRE 或 ZADD + ZREMRANGEBYSCORE | 滑动窗口或固定窗口限流实现 |
| 发布订阅 | PUBLISH channel "msg" / SUBSCRIBE channel | 简单的消息通知机制 |
| 事务 | MULTI … EXEC | 队列化命令,一次性执行 (不保证原子性回滚,仅保证隔离) |
| Lua 脚本 | EVAL "script" 0 或 SCRIPT LOAD | 高级,将复杂逻辑在服务端原子执行,减少网络 RTT |
| 管道技术 | redis-cli --pipe < file 或代码中 Pipeline | 批量发送命令,减少网络往返次数,大幅提升吞吐 |
| 位图操作 | SETBIT / GETBIT / BITCOUNT | 高效处理签到、在线状态等布尔值大数据量场景 |
| HyperLogLog | PFADD / 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 -1或SMEMBERS。
- 避免在生产环境对大集合使用
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 中做复杂的计算,让它专注于“快”和“简单”。