代码拉取完成,页面将自动刷新
handy-lock是一个简易的redis分布式锁实现类库。它并不像redission实现的分布式锁那样严谨,但是简单易用,而且可以用于codis。
<dependency>
<groupId>com.github.free-jungle</groupId>
<artifactId>handy-lock-starter</artifactId>
<version>1.0.0</version>
</dependency>
redis操作使用springboot的RedisTemplate实现,所以配置和spring.redis配置是一样的
spring:
redis:
host: 127.0.0.1
port: 6379
@Resource
private RedisLockManager redisLockManager;
public void lockUseLockManager(String id) {
String lockKey = String.format("%s.%s#%s", this.getClass().getCanonicalName(), "lockUseLockManager", id);
try (RedisLock redisLock = redisLockManager.fetchAndTryLock(lockKey, 5000, 1000, 2)) {
TimeUnit.SECONDS.sleep(2L);
} catch (LockFailException | IOException | InterruptedException ex) {
LOGGER.error("error when lockUseLockManager", ex);
}
}
@RedisDistributedLockable(key = "com.github.free.jungle.lock.examples.service.impl.lockUseAnnotation",
expireInMilliseconds = 10000, waitInMilliseconds = 10, tryCount = 1)
public void lockUseAnnotation() {
LOGGER.info("start lockUseAnnotation");
try {
TimeUnit.MILLISECONDS.sleep(100L);
} catch (Exception ex) {
LOGGER.error("error when lockUseAnnotation", ex);
}
LOGGER.info("end lockUseAnnotation");
}
虽然提供了注解的使用方式,还是推荐直接用例1的方式,代码易读,易懂,用起来也很简单,没有比 注解麻烦。
@RedisDistributedLockable(keySpel = "'com.github.free.jungle.lock.examples.service.impl.lockUserAnnotationWithSpel#'+#id",
expireInMilliseconds = 10000, waitInMilliseconds = 1000, tryCount = 3)
public void lockUserAnnotationWithSpel(String id) {
LOGGER.info("start lockUserAnnotationWithSpel:{}", id);
try {
TimeUnit.SECONDS.sleep(2L);
} catch (Exception ex) {
LOGGER.error("error when lockUseAnnotation", ex);
}
LOGGER.info("end lockUserAnnotationWithSpel:{}", id);
}
适用于key需要根据入参动态拼装的情况,其中keySpel是spel表达式
上面的用法有一个困难的问题,就是过期时间参数(expireInMilliseconds)的配置可能很难,因为:
所以实现了一个能够自动延长锁有效时间的加锁方法,使用方法如下:
@Resource
private RedisLockManager redisLockManager;
public void lockWithScheduleUseLockManager(String id) {
String lockKey = String.format("%s.%s#%s", this.getClass().getCanonicalName(), "lockUseLockManager", id);
try (RedisLock redisLock = redisLockManager.fetchAndTryLockWithSchedule(lockKey)) {
TimeUnit.SECONDS.sleep(30L);
} catch (LockFailException | IOException | InterruptedException ex) {
LOGGER.error("error when lockUseLockManager", ex);
}
}
类RedisLockManager 的方法有较为详尽的注释,请直接查看源码。
handy-lock-examples是专门的使用样例项目,作为参考使用
只是实现了客户端层面的简易分布式锁,所以无法处理由于redis服务端故障造成数据不一致的问题,需要 更严谨的分布式锁的情况建议用Redssion
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。