Параллелизм в Redis для продажи флеш в распределенной системе - PullRequest
0 голосов
/ 18 мая 2019

Я собираюсь построить систему для продажи флэш-памяти, которая будет использовать тот же экземпляр Redis и будет одновременно работать на 15 серверах.

Таким образом, алгоритм продажи флэш-памяти будет.

Set Max inventory for any product id in Redis 
 using redisTemplate.opsForValue().set(key, 400L);

for every request :
   get current inventory using Long val = redisTemplate.opsForValue().get(key);
    check if it is non zero
     if (val == null || val == 0) {
                            System.out.println("not taking order....");
     } 
else{

put order in kafka 
and decrement using redisTemplate.opsForValue().decrement(key)
}

Но проблема здесь в параллелизме: если я установлю инвентаризацию 400 и протестирую ее с потоком 500 запросов, инвентаризация станет отрицательной. Если я сделаю функцию синхронизированной, я не смогу управлять ею на распределенных серверах.

Так что будет лучшим подходом к этому?Примечание: я не могу перейти на RDBMS и установить уровень изоляции из-за большого количества запросов.

1 Ответ

0 голосов
/ 20 мая 2019

Redis является однопоточным, поэтому запуск Lua Script всегда атомарен.Затем вы можете определить Lua-скрипт для своего экземпляра Redis и запустить его из своих экземпляров Spring.

Ваш Lua-скрипт будет просто последовательностью операций, выполняемых с вашим экземпляром Redis (единственной, которая имеет правильное значениевашей акции) и возвращает новое значение, например, или ошибку, если значение является отрицательным.

Ваш скрипт Lua - это, в основном, транзакция Redis, есть и другие методы для выполнения транзакции Redis, но IMHO Lua - самый простой из всех (возможно, наименее производительный, но я обнаружил, что в большинстве случаев он достаточно быстрый).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...