分布式锁

1. 概述

本章主要介绍saturn业务层分布式并发锁

1.1. 分布式锁介绍

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在 分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证 一致性,在这种情况下,便需要使用到分布式锁。
分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证 一致性,这个时候,便需要使用到分布式锁。

2. 编码指南

2.1. 依赖引入

pom.xml

< dependency >
     < groupId >com.huifu.saturn</ groupId >
     < artifactId >saturn-redis</ artifactId >
     < version >${saturn.version}</ version >
</ dependency >

2.2. 代码实例

src\java\resources\application-biz.xml(单元测试日志输出)

< bean id = "satrunRedisConfig" class = "com.huifu.saturn.redis.SatrunRedisConfig" init-method = "init" >
         <!--本机方式,直接使用master(127.0.0.1:6379)-->
         < property name = "userSentinel" value = "false" />
         
         <!--测试、线上环境sentinel配置(192.168.21.205:28389)-->
         < property name = "userSentinel" value = "true" />
         < property name = "hostName" value = "${redis.ipaddr}" />
         < property name = "port" value = "${redis.port}" />
     </ bean >
< import resource = "classpath*:applicationContext-lock.xml" ></ import >
<!--当使用spring的TransactionTemplate处理事务时需要引入-->
< import resource = "classpath*:applicationContext-lock-aspectj-template.xml" ></ import >

 

 

/**
  * lockSample.
  */
public class LockSampleBiz{
     @Autowired
     LockFactory lockFactory;
 
     public SampleBO doSomething() {
         RLock lock = lockFactory.getLock( "proect_xx_lock_1" );
         if (lock.tryLock( 5 , TimeUnit.SECONDS)){
             System.out.println( "lock" );
         } else {
             System.out.println( "lock fial" );
         }
         lock.unlock();
     }
}
/**
  * 使用TransactionTemplate处理事务,需要在事务提交后才释放锁,引入aspectj增强后自动释放,调用如下:
  */
public class LockTransactionSampleBiz{
     @Autowired
     LockFactory lockFactory;
     @Autowired
     private TransactionTemplate transactionTemplate;
 
     public void doSomethingWithTransaction(Object object) {
           transactionTemplate.execute( new TransactionCallback<Object>() {
             @Override
             public Object doInTransaction(TransactionStatus status) {
                 boolean exists = isExists(object);
                 if (!exists){
                     RLock lock = lockFactory.getLock( "proect_xx_lock_2" );
                     try {
                         if (lock.tryLock( 5 , TimeUnit.SECONDS)){
                             if (isExists(object)){
                               //doSomething
                             }
                         } else {
                             //锁定失败后处理
                         }
                     } catch (InterruptedException e) {
                            //handle exception 报警satrun分布式锁服务异常
                     }
                 }
             }
         });
     }
}

3. 注意事项

注意不要使用嵌套锁,请尽量设计只使用一个锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值