В процессе разработки реальных продуктов часто приходится использовать распределённые блокировки. Наиболее зрелым из них является redisson (по мнению автора).
Однако для автора, который предпочитает чистоту и не любит излишеств, использование redisson только увеличило объём на 12 Мбайт, что вызвало у него сильное раздражение.
Кроме того, конфигурация redisson слишком сложна и тяжеловесна, и использование его исключительно в качестве распределённой блокировки кажется автору излишним.
Поэтому автор решил разработать собственный плагин для распределённых блокировок.
Примечание: этот плагин будет постоянно развиваться в будущем, предоставляя такие функции, как аспекты, поддержка Redis кластера и Zookeeper, и будет принадлежать Coody Framework и опубликован в центральном репозитории Maven. Ссылка: https://gitee.com/coodyer/coody-icop
Плагин распределённой блокировки, основанный на функции подписки jedis для Redis.
// Прямое инициализирующее соединение с пулом
ELockCache.initJedisPool(JediPool);
// Передача IP, порта, пароля, времени ожидания для инициализации
ELockCache.initJedisPool(host, port, secretKey, timeOut);
// Передача IP, порта, пароля, времени ожидания, конфигурации JedisPool для инициализации
ELockCache.initJedisPool(host, port, secretKey, timeOut, jedisPoolConfig);
Примечание: если пароль не требуется, передайте null.
LockHandle.lock(key, expireSecond);
LockHandle.unLock(key);
Код для блокировки (LockHandle.lock(key, expireSecond);) должен быть заключён в try{}catch{} и освобождён в finally (LockHandle.unLock(key);).
LockHandle.lock(key, 100);
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getId() + ">>" + i);
Thread.sleep(100l);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
LockHandle.unLock(key);
}```
###### 6. Тестовый код
```package org.coody.framework.elock.test;
import java.util.ArrayList;
import java.util.List;
import org.coody.framework.elock.LockHandle;
import org.coody.framework.elock.redis.ELockCache;
/**
* Распределённая блокировка тестирования
* @author Coody
*
* 2018年12月14日
*
* @blog 54sb.org
*/
public class ELockTest {
// Ключ для блокировки
static String key = "TESTLOCK_1";
static {
// Инициализировать соединение Jedis
ELockCache.initJedisPool("127.0.0.1", 16379, "123456", 10000);
}
public static void main(String[] args) {
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
test();
}
});
threads.add(thread);
}
// Запустить десять потоков
for (Thread thread : threads) {
thread.start();
}
}
// Метод блокировки
private static void test() {
try {
LockHandle.lock(key, 100);
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getId() + ">>" + i);
Thread.sleep(100l);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
LockHandle.unLock(key);
}
}
}```
###### 7. Эффект выполнения

### Авторские права:
Этот проект содержит тестовые примеры исходного кода.
Автор: Coody.
Права: ©2014-2020 Test404 All right reserved. Все права защищены.
Адрес обратной связи: 644556636@qq.com
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )