zoukankan      html  css  js  c++  java
  • 【分布式Redis锁】【并发编程】Redis分布式锁实例

    在处理业务代码时,总会遇到多线程对同一资源竞争,此时对已经抢到资源的线程做Lock。

    这里暂时先不考虑 是否是公平锁,是否可以重入的情况。

    给出实现代码,key为加锁的维度。

    @Service
    public class LockManagementService {
        private static Logger logger = LoggerFactory.getLogger(LockManagementService.class);
        
        @Autowired
        private RedisService redisService;
        
        /**
         * 加分布式锁
         */
        public void getLock(String type,String value){
            String key = type+value;
            Long result = redisService.setnx(key, "00");
            logger.info("{},开始创建分布式锁...",key);
            while(result==0L){
                Long ttl  =redisService.getTtl(key);
                logger.info("{},并发等待中...,剩余过期时间:{} s",key,ttl);
                try {
                    Thread.sleep(500L);
                } catch (InterruptedException e) {
                    logger.error("分布式锁线程等待出现异常:"+ e.getMessage(),e);
                };
                result = redisService.setnx(key, "00");
            }
            logger.info("{},成功创建分布式锁...",key);
            redisService.setKeyExpire(key, 300);//单位秒
        }
        /**
         * 释放分布式锁
         */
        public void unLock(String type,String value){
            String key = type+value;
            redisService.del(key);
            logger.info("{},成功释放分布式锁...",key);
        }
        
    }
  • 相关阅读:
    前端——DOM
    前端——JavaScript
    前端——HTML
    初学Python——协程
    初学Python——进程
    初学Python——线程
    初学Python——Socket网络编程
    初学Python——RabbitMQ的安装
    初学Python——面向对象(二)
    muduo网络库源码学习————线程池实现
  • 原文地址:https://www.cnblogs.com/liuxs13/p/9295940.html
Copyright © 2011-2022 走看看