概述
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息代理。具有以下特点:
- 高性能:基于内存存储,读写速度极快
- 丰富数据类型:支持字符串、哈希、列表、集合、有序集合等
- 持久化:支持 RDB 和 AOF 两种持久化方式
- 高可用:支持主从复制、哨兵模式和集群
- 原子操作:所有操作都是原子性的
💡 提示: Redis 特别适合缓存、会话存储、排行榜、计数器、消息队列等场景。
环境准备
系统要求
- Docker 20.10+
- 内存:至少 512MB RAM
- 存储:SSD 推荐
- 网络:稳定的网络连接
依赖检查
# 检查 Docker 版本
docker --version
# 检查可用内存
free -h
# 检查磁盘空间
df -h
Docker 安装部署
1. 查看可用的 Redis 版本
访问 Redis 镜像库地址:https://hub.docker.com/_/redis
也可以用命令来查看:
docker search redis
2. 拉取指定版本的 Redis 镜像
# 拉取最新版本
docker pull redis:latest
# 拉取指定版本
docker pull redis:7.2
3. 查看本地镜像
docker images | grep redis
4. 单节点部署
基本部署
# 简单部署
docker run -d \
--name redis \
-p 6379:6379 \
redis:latest
# 带持久化的部署
docker run -d \
--name redis \
-p 6379:6379 \
-v redis_data:/data \
redis:latest redis-server --appendonly yes
自定义配置部署
# 创建配置文件目录
mkdir -p /opt/redis/conf
# 创建 Redis 配置文件
cat > /opt/redis/conf/redis.conf << 'EOF'
# 网络配置
bind 0.0.0.0
port 6379
timeout 300
tcp-keepalive 60
# 内存配置
maxmemory 512mb
maxmemory-policy allkeys-lru
# 持久化配置
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
# 安全配置
requirepass your_password_here
# 日志配置
loglevel notice
logfile ""
EOF
# 启动带自定义配置的 Redis
docker run -d \
--name redis \
-p 6379:6379 \
-v /opt/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v redis_data:/data \
redis:latest redis-server /usr/local/etc/redis/redis.conf
5. 使用 Docker Compose 部署
创建 docker-compose.yml 文件:
version: '3.8'
services:
redis:
image: redis:7.2
container_name: redis
restart: unless-stopped
command: redis-server --requirepass yourpassword --appendonly yes
environment:
- REDIS_PASSWORD=yourpassword
ports:
- "6379:6379"
volumes:
- redis_data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
networks:
- redis_network
sysctls:
- net.core.somaxconn=65535
ulimits:
memlock: -1
redis-commander:
image: rediscommander/redis-commander:latest
container_name: redis-commander
restart: unless-stopped
environment:
- REDIS_HOSTS=redis:redis:6379:0:yourpassword
ports:
- "8081:8081"
depends_on:
- redis
networks:
- redis_network
volumes:
redis_data:
networks:
redis_network:
driver: bridge
启动服务:
docker-compose up -d
6. 验证安装
# 查看容器运行状态
docker ps
# 查看日志
docker logs redis
# 测试连接
docker exec -it redis redis-cli ping
基本配置
连接 Redis
# 连接本地 Redis
redis-cli
# 连接带密码的 Redis
redis-cli -a yourpassword
# 连接远程 Redis
redis-cli -h host -p 6379 -a password
# 使用 Docker 连接
docker exec -it redis redis-cli
基本命令
# 测试连接
PING
# 设置密码
CONFIG SET requirepass yourpassword
# 验证密码
AUTH yourpassword
# 查看配置
CONFIG GET *
# 查看信息
INFO
# 选择数据库
SELECT 0
数据类型与操作
字符串(String)
# 设置值
SET key value
SET name "John Doe"
# 获取值
GET key
GET name
# 设置过期时间(秒)
SETEX key 3600 value
SETEX session:user1 3600 "user_data"
# 批量操作
MSET key1 value1 key2 value2
MGET key1 key2
# 数值操作
INCR counter
DECR counter
INCRBY counter 5
哈希(Hash)
# 设置哈希字段
HSET user:1 name "John" age 30 email "john@example.com"
# 获取哈希字段
HGET user:1 name
HGETALL user:1
# 批量操作
HMSET user:2 name "Alice" age 25 email "alice@example.com"
HMGET user:1 name age
# 字段操作
HEXISTS user:1 name
HDEL user:1 email
HKEYS user:1
HVALS user:1
列表(List)
# 左侧推入
LPUSH mylist "first" "second"
# 右侧推入
RPUSH mylist "third" "fourth"
# 获取列表
LRANGE mylist 0 -1
# 弹出元素
LPOP mylist
RPOP mylist
# 列表长度
LLEN mylist
# 指定位置插入
LINSERT mylist BEFORE "second" "new"
集合(Set)
# 添加成员
SADD myset "member1" "member2" "member3"
# 获取所有成员
SMEMBERS myset
# 检查成员存在
SISMEMBER myset "member1"
# 集合运算
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"
SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集
有序集合(Sorted Set)
# 添加成员
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"
# 获取排名
ZRANGE leaderboard 0 -1 WITHSCORES
# 按分数范围获取
ZRANGEBYSCORE leaderboard 100 200
# 获取排名
ZRANK leaderboard "player1"
# 增加分数
ZINCRBY leaderboard 50 "player1"
持久化配置
RDB 持久化
# 配置保存策略
CONFIG SET save "900 1 300 10 60 10000"
# 手动保存
SAVE # 阻塞保存
BGSAVE # 后台保存
# 查看最后保存时间
LASTSAVE
# 配置文件中的设置
save 900 1 # 900秒内至少1个key变化
save 300 10 # 300秒内至少10个key变化
save 60 10000 # 60秒内至少10000个key变化
AOF 持久化
# 开启 AOF
CONFIG SET appendonly yes
# 设置同步策略
CONFIG SET appendfsync everysec
# 重写 AOF 文件
BGREWRITEAOF
# AOF 配置选项
appendonly yes
appendfsync everysec # always, everysec, no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
主从复制
配置主从复制
主节点配置 (redis-master.conf)
# 基本配置
port 6379
bind 0.0.0.0
# 安全配置
requirepass master_password
masterauth master_password
# 持久化
save 900 1
appendonly yes
从节点配置 (redis-slave.conf)
# 基本配置
port 6380
bind 0.0.0.0
# 主从配置
replicaof 127.0.0.1 6379
masterauth master_password
requirepass slave_password
# 只读配置
replica-read-only yes
Docker Compose 主从部署
version: '3.8'
services:
redis-master:
image: redis:7.2
container_name: redis-master
command: redis-server --requirepass master_password --appendonly yes
ports:
- "6379:6379"
volumes:
- redis_master_data:/data
redis-slave:
image: redis:7.2
container_name: redis-slave
command: redis-server --replicaof redis-master 6379 --masterauth master_password --requirepass slave_password
ports:
- "6380:6379"
volumes:
- redis_slave_data:/data
depends_on:
- redis-master
volumes:
redis_master_data:
redis_slave_data:
哨兵模式
哨兵配置文件 (sentinel.conf)
# 哨兵端口
port 26379
# 监控主节点
sentinel monitor mymaster 127.0.0.1 6379 2
# 主节点密码
sentinel auth-pass mymaster master_password
# 故障转移超时时间
sentinel down-after-milliseconds mymaster 30000
# 故障转移时间限制
sentinel failover-timeout mymaster 180000
# 并行同步的从节点数量
sentinel parallel-syncs mymaster 1
Docker Compose 哨兵部署
version: '3.8'
services:
redis-master:
image: redis:7.2
container_name: redis-master
command: redis-server --requirepass master_password
networks:
- redis_network
redis-slave:
image: redis:7.2
container_name: redis-slave
command: redis-server --replicaof redis-master 6379 --masterauth master_password
depends_on:
- redis-master
networks:
- redis_network
redis-sentinel:
image: redis:7.2
container_name: redis-sentinel
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel.conf:/etc/redis/sentinel.conf
ports:
- "26379:26379"
depends_on:
- redis-master
- redis-slave
networks:
- redis_network
networks:
redis_network:
driver: bridge
集群配置
集群节点配置
# 启用集群模式
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes.conf
# 节点超时时间
cluster-node-timeout 15000
# 集群端口
port 7000
Docker Compose 集群部署
version: '3.8'
services:
redis-node-1:
image: redis:7.2
container_name: redis-node-1
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --port 7000
ports:
- "7000:7000"
- "17000:17000"
networks:
- redis_cluster
redis-node-2:
image: redis:7.2
container_name: redis-node-2
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --port 7001
ports:
- "7001:7001"
- "17001:17001"
networks:
- redis_cluster
redis-node-3:
image: redis:7.2
container_name: redis-node-3
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --port 7002
ports:
- "7002:7002"
- "17002:17002"
networks:
- redis_cluster
networks:
redis_cluster:
driver: bridge
初始化集群
# 创建集群
redis-cli --cluster create \
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
# 检查集群状态
redis-cli -c -p 7000 cluster info
redis-cli -c -p 7000 cluster nodes
性能优化
内存优化
# 设置最大内存
CONFIG SET maxmemory 512mb
# 设置内存淘汰策略
CONFIG SET maxmemory-policy allkeys-lru
# 内存淘汰策略选项:
# noeviction - 不淘汰任何key,内存满时报错
# allkeys-lru - 在所有key中使用LRU算法删除
# volatile-lru - 在设置了过期时间的key中使用LRU算法删除
# allkeys-random - 在所有key中随机删除
# volatile-random - 在设置了过期时间的key中随机删除
# volatile-ttl - 删除即将过期的key
连接优化
# 连接配置
timeout 300
tcp-keepalive 60
tcp-backlog 511
# 客户端连接数
maxclients 10000
# 慢查询配置
slowlog-log-slower-than 10000
slowlog-max-len 128
管道操作
# Python 示例:使用管道批量操作
import redis
r = redis.Redis(host='localhost', port=6379, password='yourpassword')
# 使用管道
pipe = r.pipeline()
for i in range(1000):
pipe.set(f'key_{i}', f'value_{i}')
pipe.execute()
安全配置
访问控制
# 设置密码
CONFIG SET requirepass your_strong_password
# 重命名危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG f85ac64b1b4747d0
# 绑定网络接口
bind 127.0.0.1 192.168.1.100
用户权限管理(Redis 6.0+)
# 创建用户
ACL SETUSER alice on >password ~cached:* +get +set
# 查看用户
ACL LIST
# 删除用户
ACL DELUSER alice
# 查看当前用户
ACL WHOAMI
监控与运维
监控命令
# 查看服务器信息
INFO
INFO memory
INFO replication
INFO persistence
# 监控执行的命令
MONITOR
# 查看慢查询
SLOWLOG GET 10
# 查看客户端连接
CLIENT LIST
# 查看键空间信息
INFO keyspace
性能分析
# 内存使用分析
MEMORY USAGE keyname
MEMORY STATS
# 延迟监控
LATENCY LATEST
LATENCY HISTORY command_name
# 键空间分析
SCAN 0 COUNT 1000
备份恢复
# RDB 备份
cp /data/dump.rdb /backup/dump-$(date +%Y%m%d).rdb
# AOF 备份
cp /data/appendonly.aof /backup/appendonly-$(date +%Y%m%d).aof
# 使用 redis-cli 备份
redis-cli --rdb backup.rdb
# 恢复数据
# 1. 停止 Redis 服务
# 2. 复制备份文件到数据目录
# 3. 重启 Redis 服务
客户端工具
命令行工具
# Redis CLI
redis-cli -h host -p port -a password
# Redis Benchmark
redis-benchmark -h host -p port -a password -n 100000 -c 50
# Redis RDB 工具
rdb --command json dump.rdb | head -10
可视化工具
-
AnotherRedisDesktopManager
- GitHub: https://github.com/qishibo/AnotherRedisDesktopManager/releases
- 跨平台桌面客户端
-
Redis Commander
- Web 界面管理工具
- Docker 部署方便
-
RedisInsight
- Redis 官方可视化工具
- 功能强大的分析工具
常见问题
问题1:内存使用过高
现象: Redis 内存占用持续增长 原因: 没有设置内存限制或淘汰策略 解决方案:
# 设置内存限制
CONFIG SET maxmemory 1gb
# 设置淘汰策略
CONFIG SET maxmemory-policy allkeys-lru
# 查看内存使用
INFO memory
问题2:连接超时
现象: 客户端连接 Redis 超时 原因: 网络问题或连接数限制 解决方案:
# 检查网络连接
telnet localhost 6379
# 检查连接数
redis-cli INFO clients
# 增加连接数限制
CONFIG SET maxclients 20000
问题3:持久化失败
现象: RDB 或 AOF 文件无法生成 原因: 磁盘空间不足或权限问题 解决方案:
# 检查磁盘空间
df -h
# 检查文件权限
ls -la /data/
# 手动触发保存
redis-cli BGSAVE
⚠️ 注意: 在生产环境中,建议同时启用 RDB 和 AOF 持久化,以确保数据安全。
相关文章
数据库相关
- MongoDB 文档数据库
- MySQL 关系型数据库
- Cassandra 分布式数据库
- Elasticsearch 搜索引擎
Redis 扩展功能
应用集成
运维部署
监控运维
大数据集成
- Kafka 消息队列 - Redis与Kafka数据流处理
- Flink 实时数据处理与 Redis 集成
- Kafka 消息队列
相关阅读
- Kafka 简明教程:
./Kafka简明教程.md - RabbitMQ 入门:
./RabbitMQ.md - MySQL 基础:
../../../数据库/MySQL/MySQL.md - Flink CDC:
../../../大数据/Flink/DataStream API/4. Flink CDC.md