Простой, высокопроизводительный распределённый замок с поддержкой различных схем
Lock4j — это компонент распределённого замка, который предоставляет различные виды поддержки для удовлетворения потребностей в разных производительности и средах.
Цель проекта — создать простой, но содержательный компонент распределённого замка.
Характеристики
Использование
<dependencies>
<!-- Если используется RedisTemplate в качестве основы распределённого замка, необходимо ввести -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-redis-template-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
<!-- Если используется Redisson в качестве основы распределённого замка, необходимо ввести -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-redisson-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
<!-- Если используется Zookeeper в качестве основы распределённого замка, необходимо ввести -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-zookeeper-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
</dependencies>
spring:
redis:
host: 127.0.0.1
...
coordinate:
zookeeper:
zkServers: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
@Service
public class DemoService {
// По умолчанию время ожидания блокировки составляет 3 секунды, а срок действия блокировки — 30 секунд
@Lock4j
public void simple() {
// do something
}
// Полная настройка, поддержка spel
@Lock4j(keys = {"#user.id", "#user.name"}, expire = 60000, acquireTimeout = 1000)
public User customMethod(User user) {
return user;
}
}
Расширенное использование
lock4j:
acquire-timeout: 3000 # По умолчанию 3s, можно не устанавливать
expire: 30000 # По умолчанию 30s, можно не устанавливать
primary-executor: com.baomidou.lock.executor.RedisTemplateLockExecutor # По умолчанию redisson > redisTemplate > zookeeper, можно не устанавливать
lock-key-prefix: lock4j # Префикс ключа блокировки, по умолчанию lock4j, можно не устанавливать
acquire-timeout можно понимать как время ожидания в очереди, которое превышается только после выхода из очереди и возникновения исключения тайм-аута при получении блокировки.
Почему должна быть эта опция? Вы будете ждать вечно? Все будут ждать вечно без проблем?
expire — срок действия блокировки. Основная цель — предотвратить взаимоблокировку. Рекомендуется оценить время выполнения вашего метода блокировки, обычно несколько секунд для простых операций добавления, удаления, изменения и запроса без сложных бизнес-процессов, оставляя некоторый запас, 10 секунд достаточно. Мы по умолчанию установили 30 секунд, чтобы соответствовать большинству сценариев.
@Service
public class DemoService {
// Можно указать использование определённого исполнителя на уровне метода, если вы заранее внедрили его в Spring.
@Lock4j(executor = RedissonLockExecutor.class)
public Boolean test() {
return "true";
}
}
com.baomidou.lock.DefaultLockKeyBuilder
.@Component
public class MyLockKeyBuilder extends DefaultLockKeyBuilder {
@Override
public String buildKey(MethodInvocation invocation, String[] definitionKeys) {
String key = super.buildKey(invocation, definitionKeys);
// do something
return key;
}
}
com.baomidou.lock.DefaultLockFailureStrategy
.@Component
public class MyLockFailureStrategy implements LockFailureStrategy {
@Override
public void onLockFailure(String key, long acquireTimeout, int acquireCount) {
// write my code
}
}
@Service
public class ProgrammaticService {
@Autowired
private LockTemplate lockTemplate;
public void programmaticLock(String userId) {
// Различные операции запроса не блокируются
// ...
// Получение блокировки
final LockInfo lockInfo = lockTemplate.lock(userId, 30000L, 5000L, RedissonLockExecutor.class);
if (null == lockInfo) {
``` ```
бросить новое RuntimeException("业务处理中,请稍后再试");
}
// 获取锁成功,处理业务
попробуй {
System.out.println("Выполнение простого метода1 , текущий поток:" + Thread.currentThread().getName() + " , counter:" + (counter++));
} наконец {
//Освободить блокировку
lockTemplate.releaseLock(lockInfo);
}
//Завершить
}
}
@Service
public class DemoService {
// Пользователь может получить доступ только 1 раз за 5 секунд
@Lock4j(keys = {"#user.id"}, acquireTimeout = 0, expire = 5000, autoRelease = false)
public Boolean test(User user) {
return "true";
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )