分布式锁

spring-integration-redis

初始化 RedisLockRegistry

1
2
3
4
5
@Bean
public RedisLockRegistry redisLockRegistry (RedisConnectionFactory factory) {
// 60s过期,单位:ms
return RedisLockRegistry(factory, "ts-template", 60000L);
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Resource
private RedisLockRegistry redisLockRegistry;

public void send(String message) {
// 获取锁
Lock lock = redisLockRegistry.obtain(message);
try {
// 上锁
if (lock.tryLock()) {
// 业务逻辑
// ...
}
} catch() {
// 异常处理
} finally {
// 删除当前未锁定的旧锁:要手动调用一下这个函数,否则 RedisLockRegistry 中的 locks 对象会越来越大,因为调用 unlock 之后,不会自动删除 locks 中保存的当前锁的对象。但是调用这个删除逻辑最好是通过定时器去调用,因为如果 locks 对象中数据量很大,每次都要迭代一次会很耗时
redisLockRegistry.expireUnusedOlderThan(10*60*1000L);
// 释放锁
lock.unlock();
}
}

通过定时器调用 expireUnusedOlderThan

1
2
3
4
5
6
7
8
@Resource
private RedisLockRegistry redisLockRegistry;

@Scheduled(fixedDelay=10*60*1000)
public void expireUnusedOlderThan() {
// 删除当前未锁定的旧锁
redisLockRegistry.expireUnusedOlderThan(10*60*1000L);
}
  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/4eb3381c.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!