В компании используется стандартный режим кластера Redis. Текущий компонент предназначен для одной и той же упаковки и оптимизации параметров клиента, предоставления общих инструментов обслуживания и упрощения использования в бизнес-среде.
Более подробную информацию о построении и использовании кластера Redis можно найти на официальном сайте.
<dependency>
<artifactId>free-bsf-redis</artifactId>
<groupId>com.free.bsf</groupId>
<version>1.7.1-SNAPSHOT</version>
</dependency>
[Расширенная конфигурация](doc/README-расширенная конфигурация.md)
#bsf redis, включить поддержку
bsf.redis.enabled = false
#ключ поддерживает spel выражение, timeout в секундах
@RedisCache(key = "'user-'+#userId", timeout = 60)
public User callComplex(long userId) {
return new User(userId, "hello: " + System.currentTimeMillis(), Arrays.asList(new User.Job(userId + "001", "haha")));
}
public List<User> callback(long userId) {
List<User> list = redisProvider.cache("user-" + userId, 60, () -> Arrays.asList(new User(userId, "hello: " + userId, Arrays.asList(new User.Job(userId + "001", "haha")))), new TypeReference<List<User>>() {
}.getType());
System.out.println(list);
return list;
}
//блокировка, ожидание при конфликте
redisProvider.lock(key, () -> {
try {
callable.call();
} catch (Exception e) {
e.printStackTrace();
}
});
//попытка блокировки, отказ при неудаче
boolean result = redisProvider.tryLock(key, () -> {
try {
callable.call();
} catch (Exception e) {
e.printStackTrace();
}
});
Алгоритм выбора лидера реализован с использованием распределённых блокировок. Рекомендуется прочитать код и понять принцип работы перед использованием.
RedisLeaderElection leaderElection = new RedisLeaderElection();
//асинхронное уведомление о выборах
leaderElection.doElection(task);
//асинхронный слушатель
leaderElection.getListeners().add((name,isMaster)->{
if(isMaster){
System.out.println(threadName+ "【главный узел】:" + isMaster);
}else{
System.out.println(threadName+ "【подчиненный узел】:" + isMaster);
}
});
//выход из выборов
leaderElection.exitElection();
//текущий статус главного узла
leaderElection.isMaster();
val redis = ContextUtils.getBean(RedisProvider.class,false);
if (redis.limit("тестирование ограничения скорости", 1, 10,RedisLimitType.Count)) {
//нормальный доступ
} else {
//ограничение скорости
}
val jRedis = new Jedis({IP},6379);
val redis = RedisLimitFactory.create(jRedis,RedisLimitType.Slide);
if (redis.visit("тестирование ограничения скорости", 1, 10)) {
//нормальный доступ
} else {
//ограничение скорости
}
Примечание: счётчик и скользящее окно поддерживают кластерный режим, токен-ведро — нет.
Документация стандартного интерфейса API
Пример использования:
@Autowired
private RedisProvider redisProvider;
/**
* получить значение
*/
public String get(String key) {
return redisProvider.get(key);
}
/**
* установить ключ-значение
*/
public void set(String key, String value, int timeout) {
redisProvider.set(key, value, timeout);
}
#клиент режима кластера
val client = (JedisCluster)RedisProvider.getClient();
#клиент одномашинного режима
val client = (Jedis)RedisProvider.getClient();
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )