用Docker可快速搭建Redis或ZooKeeper分布式锁服务:Redis轻量高吞吐,适合秒杀等场景,通过redis:6镜像+Redisson实现;ZooKeeper强一致可靠,适合任务调度,用zookeeper:3.5.6+Curator实现。

用 Docker 快速搭建容器化的分布式锁服务,核心思路是:选对中间件(Redis 或 ZooKeeper)、用标准镜像启动、配好关键参数、再通过客户端接入。不依赖复杂集群,单机多实例或轻量集群就足以支撑开发与测试场景。
选 Redis 还是 ZooKeeper?看需求定
两者都能实现分布式锁,但设计哲学不同:
-
Redis 更轻快:适合高吞吐、低延迟场景,如秒杀抢购、订单幂等控制;用
SETNX + EXPIRE或 Redisson 的红锁(RedLock)即可落地,Docker 启动极简。 - ZooKeeper 更严谨:基于 ZAB 协议强一致,天然支持临时顺序节点,锁释放自动触发通知(Watcher),适合对可靠性要求高的任务调度、主从选举等场景。
用 Docker 跑 Redis 分布式锁(推荐入门)
以 Redis 6 + Redisson 为例,三步到位:
-
1. 启动 Redis 实例(带密码和持久化)
创建配置文件/usr/local/redis6/conf/redis.conf,关键项:bind 0.0.0.0<br>protected-mode no<br>port 6379<br>requirepass 123456<br>appendonly yes<br>dir /data
执行:docker run -d --name redis6 -p 6379:6379 -v /usr/local/redis6/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/redis6/data:/data redis:6 redis-server /etc/redis/redis.conf -
2. 应用端集成 Redisson
在 Spring Boot 的application.yml中配置:spring:<br> redis:<br> host: localhost<br> port: 6379<br> password: 123456<br>redisson:<br> file: classpath:redisson.yml
对应redisson.yml启用单节点并设好连接池与序列化(如JsonJacksonCodec)。 -
3. 代码中直接加锁
一行获取可重入锁:RLock lock = redissonClient.getLock("order:lock:1001");<br>lock.lock(30, TimeUnit.SECONDS); // 自动续期
业务结束调lock.unlock()即可。
用 Docker 跑 ZooKeeper 分布式锁(强调可靠性)
ZooKeeper 锁基于临时顺序节点,无需手动设过期时间,断连即释放,更“零感知”:
-
1. 启动单节点 ZooKeeper(开发用)
docker run -d --name zk -p 2181:2181 -v /d/zk/data:/data zookeeper:3.5.6
注意挂载/data保证会话数据不丢。 -
2. 客户端使用 Curator 框架
Maven 引入:<dependency><br><groupid>org.apache.curator</groupid><br><artifactid>curator-recipes</artifactid><br></dependency>
代码示例:InterProcessMutex lock = new InterProcessMutex(client, "/locks/order_1001");<br>if (lock.acquire(3, TimeUnit.SECONDS)) {<br> try { /* 执行临界区 */ }<br> finally { lock.release(); }<br>} -
3. 验证锁行为
可用zkCli.sh -server localhost:2181连入,执行ls /locks查看节点生成情况——临时顺序节点名形如order_1001-lock-0000000001,最小序号者持锁。
进阶建议:别只跑单点
生产虽需集群,但本地验证可模拟多节点协作:
- Redis:用 3 个容器(6380/6381/6382 端口),配合 Redisson 的
RedLock配置,要求多数派节点响应才视为加锁成功。 - ZooKeeper:用
docker-compose起 3 节点 ensemble,通过自定义zoo.cfg设置server.1~server.3,启用选举机制,真正还原 CP 场景。 - 统一网络:建议创建专用 bridge 网络(如
docker network create zk-net),避免端口冲突和通信异常。











