目录

Redis 最佳实践

快速入门

安装与版本

当前使用版本为 Redis 8.6.2

macOS

# 使用 Homebrew 安装
brew install redis

# 启动服务
brew services start redis

# 或手动启动
redis-server

# 连接
redis-cli

Windows

Redis 官方不直接支持 Windows,但可以通过以下方式使用:

# 方法一:使用 WSL2(推荐)
# 在 WSL2 中安装 Redis
sudo apt update && sudo apt install redis-server
sudo service redis-server start

# 方法二:使用 Docker
docker run -d --name redis -p 6379:6379 redis:8.6.2-alpine

# 方法三:下载 Microsoft 维护的 Windows 版本(非官方)

Linux (Ubuntu)

# 更新并安装
sudo apt update
sudo apt install -y redis-server

# 启动服务
sudo systemctl start redis-server
sudo systemctl enable redis-server

# 或手动启动
redis-server

# 连接
redis-cli

Docker Compose 部署

services:
  redis:
    image: redis:8-alpine
    container_name: redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    command: redis-server --requirepass password123
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "password123", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  redis_data:

启动:docker compose up -d

连接:redis-cli -h localhost -p 6379 -a password123

基本操作

# 测试连接
PING

# 查看所有键
SCAN 0

# 基本数据类型操作
SET name "Alice"
GET name
DEL name

# 查看信息
INFO

数据类型

String(字符串)

# 基本操作
SET name "Alice"
GET name
MGET name age  # 批量获取
MSET name "Alice" age 30  # 批量设置

# 计数
SET counter 100
INCR counter      # 101
INCRBY counter 10  # 111
DECR counter       # 110

# 设置过期时间
SET token "abc123" EX 3600  # 1小时后过期
TTL token  # 查看剩余时间

Hash(哈希)

# 创建哈希
HSET user:1 name "Alice" email "[email protected]" age 30

# 获取字段
HGET user:1 name
HMGET user:1 name email

# 获取所有字段
HGETALL user:1

# 计数
HINCRBY user:1 age 1

List(列表)

# 添加元素
LPUSH tasks "task1"
RPUSH tasks "task2"
LPUSH tasks "task0"

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

# 弹出元素
LPOP tasks
RPOP tasks

Set(集合)

# 添加
SADD tags "redis" "database" "cache"

# 获取
SMEMBERS tags
SISMEMBER tags "redis"

# 交集、并集、差集
SINTER tag1 tag2
SUNION tag1 tag2
SDIFF tag1 tag2

Sorted Set(有序集合)

# 添加带分数的元素
ZADD leaderboard 100 "Alice"
ZADD leaderboard 200 "Bob"
ZADD leaderboard 150 "Charlie"

# 按分数排序获取
ZRANGE leaderboard 0 -1 WITHSCORES

# 获取排名
ZRANK leaderboard "Alice"
ZREVRANK leaderboard "Alice"

Stream(流)

Redis 8.x 新增,用于消息队列:

# 创建流
XADD mystream * sensor-id temp 25.5

# 读取流
XRANGE mystream - +

# 消费组
XGROUP CREATE mystream mygroup $

# 读取新消息
XREADGROUP GROUP mygroup consumer1 COUNT 10 STREAMS mystream ">"

缓存策略

缓存模式

# Cache-Aside(旁路缓存)
# 1. 读取时:先查缓存,缓存未命中则查数据库并写入缓存
# 2. 更新时:先更新数据库,再删除缓存

# Write-Through(写穿透)
# 写入时同时更新缓存和数据库

# Write-Behind(写回)
# 写入时只更新缓存,定期批量写回数据库

缓存过期策略

# 设置过期时间
EXPIRE user:1 3600  # 1小时
EXPIREAT user:1 1735689600  # 指定时间戳过期

# 惰性删除:等访问时检查过期
# 定期删除:每100ms随机检查过期键

# 内存淘汰策略
# noeviction: 不淘汰,返回错误
# allkeys-lru: 所有键中删除最近最少使用的
# volatile-lru: 已设置过期时间的键中删除最近最少使用的
# allkeys-random: 随机删除
# volatile-random: 已设置过期时间的键中随机删除
# volatile-ttl: 删除剩余存活时间最短的

缓存问题处理

# 缓存穿透:布隆过滤器或缓存空值
SET cache:bloom:users "exists"

# 缓存击穿:互斥锁或逻辑过期
# 使用 RedLock 实现分布式锁

# 缓存雪崩:过期时间加随机值,持久化 + 多级缓存

持久化

RDB(快照)

# 配置
save 900 1      # 900秒内至少1个key变化则保存
save 300 10     # 300秒内至少10个key变化则保存
save 60 10000   # 60秒内至少10000个key变化则保存

# 手动触发
BGSAVE
SAVE

# 查看最近保存时间
LASTSAVE

AOF(追加文件)

# 开启 AOF
appendonly yes

# 同步策略
appendfsync always     # 每次写入都同步
appendfsync everysec    # 每秒同步(默认)
appendfsync no          # 由操作系统决定

# 重写压缩
BGREWRITEAOF

混合持久化

# 开启混合持久化
aof-use-rdb-preamble yes

集群

主从复制

# 配置从节点
replicaof master-ip master-port

# 断开复制
REPLICAOF NO ONE

# 查看复制状态
INFO replication

Sentinel(哨兵)

# 监控主节点
sentinel monitor mymaster 127.0.0.1 6379 2

# 自动故障转移
# 哨兵自动选举新主节点

Cluster(集群)

# 创建集群
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \
  --cluster-replicas 1

# 查看集群状态
redis-cli -p 7001 cluster info

# 重新分片
redis-cli --cluster reshard 127.0.0.1:7001

集群槽位

# 查看槽位分配
redis-cli cluster slots

# 手动分配槽位
redis-cli -p 7001 cluster addslots 0 1 2 3 4

安全

认证

# 设置密码
CONFIG SET requirepass "your_password"

# 连接时认证
AUTH your_password

# 或命令行
redis-cli -a your_password

ACL

# 创建用户
ACL SETUSER alice ON >password ~cached:* -@all +get +set +del

# 查看用户
ACL LIST

# 用户权限说明
# + 添加权限
# - 撤销权限
# @ 添加权限类别
# ~ 添加键模式

安全配置

# 禁止危险命令
rename-command FLUSHALL ""
rename-command CONFIG "CONFIG_b45a0e32"

# 绑定地址
bind 127.0.0.1

# 禁用保护模式
protected-mode yes

性能优化

慢查询

# 查看慢查询日志
SLOWLOG GET

# 配置慢查询阈值
CONFIG SET slowlog-log-slower-than 1000  # 微秒

# 最大慢查询条数
CONFIG SET slowlog-max-len 100

内存优化

# 查看内存使用
INFO memory
MEMORY STATS

# 内存碎片整理
MEMORY PURGE

# 诊断大键
redis-cli --bigkeys

连接优化

# 最大连接数
CONFIG SET maxclients 10000

# TCP 优化
CONFIG SET tcp-backlog 511
CONFIG SET tcp-keepalive 300

常用命令速查

命令 说明
SET key value 设置字符串值
GET key 获取值
DEL key 删除键
EXISTS key 检查键是否存在
EXPIRE key seconds 设置过期时间
KEYS pattern 模式匹配查找键
SCAN cursor 渐进式遍历键
INFO 查看 Redis 信息
DBSIZE 键数量
FLUSHDB 清空当前数据库
FLUSHALL 清空所有数据库

相关资源