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

OSCHINA-MIRROR/chejiangyi-free-bsf-all

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 6.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 10:17 704b62b

Интеграция компонентов Redis

Введение

В компании используется стандартный режим кластера Redis. Текущий компонент предназначен для одной и той же упаковки и оптимизации параметров клиента, предоставления общих инструментов обслуживания и упрощения использования в бизнес-среде.
Более подробную информацию о построении и использовании кластера Redis можно найти на официальном сайте.

Зависимости

<dependency>
	<artifactId>free-bsf-redis</artifactId>
	<groupId>com.free.bsf</groupId>
	<version>1.7.1-SNAPSHOT</version>
</dependency>

Основные сведения о Redis

  1. Все значения, установленные в Redis, должны иметь срок действия. Не допускается сохранение данных навсегда. Максимальный срок действия не должен превышать 1 день.
    При разработке механизма истечения срока действия необходимо учитывать проблему мгновенного проникновения, а также дискретное истечение срока действия.
  2. Запрещается использовать запросы с ключом вида key:xxx*. Это может привести к блокировке всех запросов Redis и снижению производительности.

Конфигурация

[Расширенная конфигурация](doc/README-расширенная конфигурация.md)

#bsf redis, включить поддержку
bsf.redis.enabled = false

Пример кода для RedisCache

  • Аннотация
    #ключ поддерживает 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;
    }

Код примера распределённой блокировки

  • Распределённая блокировка Redis автоматически продлевает срок действия или позволяет настроить время ожидания.
     //блокировка, ожидание при конфликте
     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

Алгоритм выбора лидера реализован с использованием распределённых блокировок. Рекомендуется прочитать код и понять принцип работы перед использованием.

    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();

Распределённый код примера ограничения скорости

  • Redis реализует распределённое ограничение скорости, поддерживая счётчики, скользящие окна и алгоритмы токенов.
  • Рекомендуемый режим интеграции SDK
  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 {
        //ограничение скорости
  }

Примечание: счётчик и скользящее окно поддерживают кластерный режим, токен-ведро — нет.

Стандартные интерфейсы доступа к Redis [рекомендуется]

Документация стандартного интерфейса 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);
	}

Операции с оригинальным Redis [не рекомендуется]

#клиент режима кластера
val client = (JedisCluster)RedisProvider.getClient();
#клиент одномашинного режима
val client = (Jedis)RedisProvider.getClient();

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/chejiangyi-free-bsf-all.git
git@api.gitlife.ru:oschina-mirror/chejiangyi-free-bsf-all.git
oschina-mirror
chejiangyi-free-bsf-all
chejiangyi-free-bsf-all
3.4-SNAPSHOT