Redis 最佳实践
目录
快速入门
安装与版本
当前使用版本为 Redis 8.6.2。
macOS
# 使用 Homebrew 安装
brew install redis
# 启动服务
brew services start redis
# 或手动启动
redis-server
# 连接
redis-cliWindows
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-cliDocker 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 1List(列表)
# 添加元素
LPUSH tasks "task1"
RPUSH tasks "task2"
LPUSH tasks "task0"
# 获取范围
LRANGE tasks 0 -1 # 获取所有
# 弹出元素
LPOP tasks
RPOP tasksSet(集合)
# 添加
SADD tags "redis" "database" "cache"
# 获取
SMEMBERS tags
SISMEMBER tags "redis"
# 交集、并集、差集
SINTER tag1 tag2
SUNION tag1 tag2
SDIFF tag1 tag2Sorted 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
# 查看最近保存时间
LASTSAVEAOF(追加文件)
# 开启 AOF
appendonly yes
# 同步策略
appendfsync always # 每次写入都同步
appendfsync everysec # 每秒同步(默认)
appendfsync no # 由操作系统决定
# 重写压缩
BGREWRITEAOF混合持久化
# 开启混合持久化
aof-use-rdb-preamble yes集群
主从复制
# 配置从节点
replicaof master-ip master-port
# 断开复制
REPLICAOF NO ONE
# 查看复制状态
INFO replicationSentinel(哨兵)
# 监控主节点
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_passwordACL
# 创建用户
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 |
清空所有数据库 |