DCS实践干货:使用Redis实现分布式锁

本文通过实例展示了如何使用Redis作为缓存数据库实现分布式锁,以确保在多线程环境下对资源的有序访问。通过设置超时时间和锁的有效时间,防止死锁,并讨论了加锁操作的简单性和高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景介绍

很多互联网场景(如商品秒杀,论坛回帖盖楼等),需要用加锁的方式,以对某种资源进行顺序访问控制。如果应用服务集群部署,则涉及到对分布式应用加锁。当前分布式加锁主要有三种方式:(磁盘)数据库、缓存数据库、Zookeeper。接下里让我们一起看看加锁实践过程。

 

加锁实现

1  package dcsDemo01;

2   

3  import java.util.UUID;

4   

5  import redis.clients.jedis.Jedis;

6   

7  public class DistributedLock {

8      private final String host = "192.168.0.220";

9      private final int port = 6379;

10   

11      private static final String SUCCESS = "OK";

12      private static final String SET_IF_NOT_EXIST = "NX";

13      private static final String EXPIRE_TIME = "PX";

14   

15      public  DistributedLock(){}

16   

17      /*

18       * @param lockName      锁名

19       * @param timeout       获取锁的超时时间

20       * @param lockTimeout   锁的有效时间

21       * @return              锁的标识

22       */

23      public String getLockWithTimeout(String lockName, long timeout, long lockTimeout) {

24          String ret = null;

25          Jedis jedisClient = new Jedis(host, port);

26   

27          try {

28              String authMsg = jedisClient.auth("Demo@123");

29              if (!SUCCESS.equals(authMsg)) {

30                  System.out.println("AUTH FAILED: " + authMsg);

31              }

32   

33              String identifier = UUID.randomUUID().toString();

34              String lockKey = "DLock:" + lockName;

35              long end = System.currentTimeMillis() + timeout;

36   

37              while(System.currentTimeMillis() < end) {

38                  String result = jedisClient.set(lockKey, identifier, SET_IF_NOT_EXIST, EXPIRE_TIME, lockTimeout);

39               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值