Redis作为当下最流行的内存数据库之一,凭借其超高的读写性能和丰富的数据结构,已经成为现代应用开发的标准配置。而Docker Desktop让开发者能够在本地环境轻松构建容器化应用,两者的结合堪称开发效率的加速器。
我在过去三年为17个不同规模的项目配置过Redis环境,从电商秒杀系统到实时聊天应用,Docker化的Redis部署方案帮我节省了至少60%的环境搭建时间。特别是在团队协作场景下,再也不用担心"在我机器上能跑"的经典问题。
首先确认你的Docker Desktop已正确安装并运行。打开终端执行:
bash复制docker --version
正常情况应显示类似Docker version 20.10.17的版本信息。如果报错,需要重新安装Docker Desktop。
注意:Windows用户需确保已启用WSL2后端(推荐)或Hyper-V。在Docker Desktop设置 → General中勾选"Use WSL 2 based engine"。
Redis作为内存数据库,默认需要至少100MB可用内存。建议在Docker Desktop设置 → Resources中:
对于需要处理大量数据的场景,可以适当调高这些参数。我的经验法则是:预期数据集大小 × 1.5 = 建议内存分配量。
执行以下命令获取最新稳定版Redis:
bash复制docker pull redis:7.0
如果想使用特定版本,可以指定标签如redis:6.2.6。我建议生产环境使用固定版本号,避免自动升级带来的兼容性问题。
基础启动命令:
bash复制docker run --name my-redis -d -p 6379:6379 redis:7.0
参数说明:
--name 指定容器名称(后续管理用)-d 后台运行-p 端口映射(主机端口:容器端口)默认情况下Redis数据只在容器生命周期内存在。要启用持久化,需要:
bash复制mkdir ~/redis-data
bash复制docker run --name my-redis \
-v ~/redis-data:/data \
-d -p 6379:6379 \
redis:7.0 redis-server --save 60 1 --appendonly yes
这里启用了两种持久化机制:
对于生产环境,建议使用自定义配置文件:
bash复制curl -o redis.conf https://raw.githubusercontent.com/redis/redis/7.0/redis.conf
ini复制maxmemory 1gb
maxmemory-policy allkeys-lru
timeout 300
bash复制docker run --name my-redis \
-v ~/redis-data:/data \
-v $(pwd)/redis.conf:/usr/local/etc/redis/redis.conf \
-d -p 6379:6379 \
redis:7.0 redis-server /usr/local/etc/redis/redis.conf
基础安全措施:
ini复制requirepass yourstrongpassword
ini复制rename-command FLUSHDB ""
rename-command CONFIG ""
进入Redis CLI:
bash复制docker exec -it my-redis redis-cli
查看日志:
bash复制docker logs my-redis
停止/启动容器:
bash复制docker stop my-redis
docker start my-redis
bash复制docker exec my-redis redis-cli SAVE
bash复制cp ~/redis-data/dump.rdb ~/redis-backups/dump-$(date +%Y%m%d).rdb
bash复制docker exec my-redis redis-cli BGREWRITEAOF
bash复制docker ps -a | grep redis
bash复制netstat -tulnp | grep 6379
bash复制docker exec -it my-redis redis-cli PING
bash复制docker stats my-redis
bash复制docker exec my-redis redis-cli INFO
重点关注:
ini复制slowlog-log-slower-than 10000
slowlog-max-len 128
对于需要多个独立Redis实例的场景:
bash复制docker run --name project1-redis -d -p 6380:6379 redis:7.0
docker run --name project2-redis -d -p 6381:6379 redis:7.0
bash复制docker network create project1-net
docker run --name project1-redis --network project1-net -d redis:7.0
Python示例(使用redis-py):
python复制import redis
r = redis.Redis(
host='localhost',
port=6379,
password='yourpassword',
decode_responses=True
)
r.set('foo', 'bar')
print(r.get('foo'))
Node.js示例(使用ioredis):
javascript复制const Redis = require('ioredis');
const redis = new Redis({
port: 6379,
host: 'localhost',
password: 'yourpassword'
});
await redis.set('foo', 'bar');
console.log(await redis.get('foo'));
bash复制docker run --name redis-master \
-d -p 6379:6379 \
redis:7.0 redis-server --appendonly yes
bash复制docker run --name redis-slave \
-d -p 6380:6379 \
redis:7.0 redis-server --appendonly yes --slaveof redis-master 6379
sentinel.conf:ini复制port 26379
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
bash复制docker run --name redis-sentinel \
-v $(pwd)/sentinel.conf:/sentinel.conf \
-d -p 26379:26379 \
redis:7.0 redis-server /sentinel.conf --sentinel
使用适当的数据结构:
启用内存淘汰策略(当maxmemory被触及时):
ini复制maxmemory-policy volatile-lru
ini复制tcp-keepalive 60
bash复制sysctl -w net.core.somaxconn=65535
sysctl -w vm.overcommit_memory=1
bash复制docker run --name redis-exporter \
-d -p 9121:9121 \
oliver006/redis_exporter \
--redis.addr redis://my-redis:6379
yaml复制scrape_configs:
- job_name: 'redis'
static_configs:
- targets: ['redis-exporter:9121']
yaml复制alert: RedisMemoryHigh
expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
for: 5m
yaml复制alert: RedisConnectionsHigh
expr: redis_connected_clients > 1000
for: 10m
bash复制docker stop my-redis
bash复制docker cp my-redis:/data/. ~/redis-backup/
bash复制docker run --name my-redis-new \
-v ~/redis-data:/data \
-d -p 6379:6379 \
redis:7.2 redis-server --appendonly yes
使用redis-cli进行数据迁移:
bash复制docker exec -it my-redis redis-cli \
--rdb /data/dump.rdb
docker cp my-redis:/data/dump.rdb .
docker cp dump.rdb my-redis-new:/data/
docker-compose.yml配置:
yaml复制version: '3.8'
services:
redis:
image: redis:7.0
container_name: my-redis
ports:
- "6379:6379"
volumes:
- ~/redis-data:/data
command: redis-server --appendonly yes
restart: unless-stopped
启动命令:
bash复制docker-compose up -d
redis-deployment.yaml示例:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: redis-data
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: redis-pvc
bash复制docker network create redis-net --driver bridge
bash复制docker run --name my-redis \
--network redis-net \
-d -p 127.0.0.1:6379:6379 \
redis:7.0
bash复制redis-cli -h yourhost -p 6379 PING
bash复制docker scan redis:7.0
redis-backup.sh示例:
bash复制#!/bin/bash
BACKUP_DIR="/backups/redis"
DATE=$(date +%Y%m%d)
docker exec my-redis redis-cli SAVE
docker cp my-redis:/data/dump.rdb $BACKUP_DIR/dump-$DATE.rdb
find $BACKUP_DIR -name "*.rdb" -mtime +30 -delete
添加到cron:
bash复制0 2 * * * /path/to/redis-backup.sh
恢复步骤:
bash复制chown redis:redis /data/dump.rdb
测试建议:
基础测试命令:
bash复制docker exec my-redis redis-benchmark \
-h localhost -p 6379 \
-n 100000 -c 50 -q
测试项目建议:
关键指标解读:
优化方向:
使用连接池示例:
python复制pool = redis.ConnectionPool(
host='localhost',
port=6379,
max_connections=50,
socket_timeout=5
)
r = redis.Redis(connection_pool=pool)
调优参数:
max_connections:根据并发量调整socket_keepalive:保持长连接retry_on_timeout:自动重试Jedis配置示例:
java复制JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(128);
poolConfig.setMaxIdle(32);
poolConfig.setMinIdle(8);
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
关键参数:
bash复制HSET session:1234 user_id 5678 last_active 1630000000
EXPIRE session:1234 3600
bash复制ZADD leaderboard 100 "player1" 85 "player2"
ZREVRANGE leaderboard 0 9 WITHSCORES
bash复制LPUSH notifications "message1"
BRPOP notifications 30
bash复制HMSET user:1000 name "John" age 30
bash复制SET counter 100
OBJECT ENCODING counter # 返回"int"
bash复制SADD common_tags "tag1" "tag2" "tag3"
SINTERSTORE project:123:tags common_tags project:123:user_tags
实现原子计数器:
lua复制local current = redis.call('GET', KEYS[1])
if not current then
current = 0
end
local new = current + tonumber(ARGV[1])
redis.call('SET', KEYS[1], new)
return new
调用方式:
bash复制EVAL "$(cat incrby.lua)" 1 mycounter 5
bash复制SCRIPT LOAD "return redis.call('GET', KEYS[1])"
EVALSHA sha1hash 1 mykey
启动集群节点:
bash复制docker run --name redis-node1 \
-d -p 7001:6379 \
redis:7.0 redis-server --cluster-enabled yes
创建集群:
bash复制redis-cli --cluster create \
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 127.0.0.1:7006 \
--cluster-replicas 1
python复制from rediscluster import RedisCluster
startup_nodes = [{"host": "127.0.0.1", "port": "7001"}]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
bash复制docker exec -it my-redis redis-cli
bash复制docker exec -it my-redis bash
ls /data
cat /etc/redis/redis.conf
bash复制docker logs -f my-redis
bash复制docker logs my-redis | grep -i error
ini复制loglevel notice # debug/verbose/notice/warning
logfile /var/log/redis/redis-server.log