中文帮助文档
lihao edited this page Dec 25, 2021
·
3 revisions
-
Redis Template模式
<dependency> <groupId>io.github.pearstack</groupId> <artifactId>lock-redis-template-spring-boot-starter</artifactId> <version>0.0.3</version> </dependency>
-
Redisson 模式
<dependency> <groupId>io.github.pearstack</groupId> <artifactId>lock-redisson-spring-boot-starter</artifactId> <version>0.0.3</version> </dependency>
-
ZooKeeper 模式
<dependency> <groupId>io.github.pearstack</groupId> <artifactId>lock-zookeeper-spring-boot-starter</artifactId> <version>0.0.3</version> </dependency>
spring:
lock:
# 锁key的前缀, 默认为lock, 可不设置
prefix: lock
# 锁过期时间, 默认为30秒, 可不设置
expire: 30
# 获取锁超时时间, 默认为3秒, 可不设置
acquire-timeout: 3
# 获取锁失败时重试间隔时间, 默认为1秒, 可不设置
retry-interval: 1
# 时间单位, 默认为秒, 可不设置
unit: seconds
# ZooKeeper 模式
zookeeper:
host: xxx.xxx.xxx.xxx
# Redis 模式
redis:
host: xxx.xxx.xxx.xxx
package com.lihao.lock.controller;
import io.github.pearstack.lock.annotation.Locked;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class TestController {
public static Integer apple = 200;
public static Integer pear = 200;
/**
* 带分布式锁, 不会出现超卖
*
* @param appleId
* @return
*/
@Locked(keys = "#appleId")
@GetMapping("/get/apple")
public String getApple(Long appleId) {
if (apple <= 0) {
return "对不起, 已经没货了!";
} else {
apple = apple - 1;
log.info("购买成功, 现在apple数量为:{}", apple);
return "购买成功!";
}
}
/**
* 不带分布式锁, 会出现超卖
*
* @param pearId
*/
@GetMapping("/get/pear")
public String getPear(Long pearId) {
if (pear <= 0) {
return "对不起, 已经没货了!";
} else {
pear = pear - 1;
log.info("购买成功, 现在pear数量为:{}", pear);
return "购买成功!";
}
}
}
package com.lihao.lock.service;
import io.github.pearstack.lock.service.GetLockKeyService;
import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Service;
@Service
public class GetLockKeyServiceImpl implements GetLockKeyService {
/**
* 获取分布式锁名称
*
* @param joinPoint aop切面方法
* @param name 对应注解的name属性
* @param keys 对应注解的keys属性
* @param separator 分布式锁key的分隔符, redis默认是: , zookeeper默认是/
* @return 分布式锁名称
*/
@Override
public String getKey(JoinPoint joinPoint, String name, String[] keys, String separator) {
return "testOnLocked";
}
}
package com.lihao.lock.service;
import io.github.pearstack.lock.service.OnLockFailedService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.lang.reflect.Method;
@Slf4j
@Service
public class OnLockFailedServiceImpl implements OnLockFailedService {
/**
* 失败失败调用接口
*
* @param method 对象
* @param arguments 异常信息
*/
@Override
public void onLockFailed(Method method, Object[] arguments) {
log.error("上锁异常!");
}
}