redis 简单分布式锁dome

redis 简单分布式锁dome


import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;
 
@Component
public class DistrbutedLockUtil {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Value("${server.port}")
    private String port;

    /**
     * 上锁
     *
     * @param key     键  (要唯一)
     * @param timeout 时间大小
     * @param unit    时间颗粒度 (时分秒....)
     * @return
     */
    public boolean lock(String key,  long timeout, TimeUnit unit) throws UnknownHostException {
        String ip = InetAddress.getLocalHost().getHostAddress() + ":" + port;
        return stringRedisTemplate.opsForValue().setIfAbsent(key, ip, timeout, unit);
    }

    /**
     * 解锁
     * @param key 键 (上锁的值)
     */
    public void unlock(String key) {
        if ("".equals(key)) {
            System.out.println("没有锁,不需要锁释锁!");
        } else {
            String str = stringRedisTemplate.delete(key) == true ? "锁释放成功" : "锁释放失败";
            System.out.println(key + str);
        }
    }

}


import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Component
public class DomeTask1 {

    @Autowired
    private DistrbutedLockUtil distrbutedLockUtil;

    @Scheduled(cron = "0 */1 * * * ?")
    public void dome() throws Exception {
        String key = "dome";
        //设置锁
        try {
            Boolean flagLock = distrbutedLockUtil.lock(key,30,TimeUnit.SECONDS);
            if (!flagLock) {
                key = "";
                System.out.println("-----抢redis锁失败-----");
            } else {
                System.out.println("-----抢redis锁成功-----");
                //抢锁成功后的业务操作:
                Date now2 = Calendar.getInstance().getTime();
                SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                //操作完毕,释放锁,在return前释放
                System.out.println(format1.format(now2) + " 在这里执行定时任务的业务.....");
                Thread.sleep(20000);
                System.out.println("-----业务执行完成-----");
            }
        } finally {
            distrbutedLockUtil.unlock(key);
        } 
    } 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值