1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/baomidou-lock4j

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Простой, высокопроизводительный распределённый замок с поддержкой различных схем

Lock4j — это компонент распределённого замка, который предоставляет различные виды поддержки для удовлетворения потребностей в разных производительности и средах.

Цель проекта — создать простой, но содержательный компонент распределённого замка.

Характеристики

  1. Простота использования, мощные функции и высокая расширяемость.
  2. Поддержка Redission, RedisTemplate, Zookeeper. Возможность смешивания и расширения.

Использование

  1. Ввести соответствующие зависимости (поддерживается одновременное существование, разные методы — разные реализации замка).
<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>
  1. Настроить Redis или Zookeeper в соответствии с основой.
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
  1. Использовать аннотацию Lock4j в местах, где требуется распределённая блокировка.
@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;
    }
}

Расширенное использование

  1. Настройка глобального времени ожидания по умолчанию и срока действия блокировки.
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 секунд, чтобы соответствовать большинству сценариев.

  1. Пользовательский исполнитель.
@Service
public class DemoService {

    // Можно указать использование определённого исполнителя на уровне метода, если вы заранее внедрили его в Spring.
    @Lock4j(executor = RedissonLockExecutor.class)
    public Boolean test() {
        return "true";
    }
}
  1. Пользовательский генератор ключей блокировки. По умолчанию генератором ключей блокировки является 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;
    }
}
  1. Пользовательская стратегия сбоя при получении блокировки. По умолчанию стратегия сбоя при получении блокировки — com.baomidou.lock.DefaultLockFailureStrategy.
@Component
public class MyLockFailureStrategy implements LockFailureStrategy {

    @Override
    public void onLockFailure(String key, long acquireTimeout, int acquireCount) {
        // write my code
    }
}
  1. Ручное получение и снятие блокировки.
@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);
        }
        //Завершить
    }
}
  1. Не освобождать блокировку в течение указанного времени (ограничение скорости)

@Service
public class DemoService {

    // Пользователь может получить доступ только 1 раз за 5 секунд
    @Lock4j(keys = {"#user.id"}, acquireTimeout = 0, expire = 5000, autoRelease = false)
    public Boolean test(User user) {
        return "true";
    }
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/baomidou-lock4j.git
git@gitlife.ru:oschina-mirror/baomidou-lock4j.git
oschina-mirror
baomidou-lock4j
baomidou-lock4j
master