Кэш-ключ дизайн - PullRequest
       11

Кэш-ключ дизайн

0 голосов
/ 12 июня 2019

У нас есть требование, в котором мы должны хранить много значений для каждого ключа (от одного до многих). И мы должны вернуть n (n будет варьироваться в каждом запросе) значений для запрошенного ключа, и эти значения должны быть удалены после его возврата, т. Е. Каждое значение используется только один раз. Так что следующий запрос не получит эти значения. Мы используем Redis.

Проблема с примером: -

Пример: - клавиша: - значения "12344": - "a", "b", "c", "d", "f", "g", "h" клавиша: - значения «12355»: - «m», «n», «o», «p», «q»

Запрос 1: - получить 2 значения ключа 12344 Результат: - a, b (порядок может быть любым, количество должно быть 2) После возврата 2 значений кэш должен содержать ключ: - значения «12344»: - c, d, f, g, h (a, b удалено), чтобы следующий запрос не получил эти значения

Запрос 2: - получить 4 значения 12344 Результат: - c, f, g, h (порядок может быть любым, число должно быть 4) После возврата значений кеш должен содержать ключ: - «12344» значения: - d

Мы разработали три подхода к этому сценарию: -

1. First option is using list or set or sorted set data structure of redis to store the values and when a request comes for key(Ex:-12344) and n values. Then return and delete those values , so that next request will not get those values. But it is not scalable when there is huge request(ex:- 100000/sec)

2. Second option is creating key like ex:- 12344_a,12344_b. and  store it as (key:12344_a, value:a)(key:12344_b, value:b) and  get n values using :- Key wildcard SCAN Count option. And delete those returned values using pipeline. Wild card search is not time efficient. 

3. Third option is creating key like ex:- 12344_1,12344_2 and store it as (key:12344_1, value:a), (key:12344_2, value:b)

Чтобы это работало, нам нужно сохранить последний перенастроенный счетчик ключей Пример: - 5 возвращается в последний раз, когда приходит новый запрос, например, для 2 значений, мы должны искать ключ 12344_6,12344_7 и т. Д., Возвращать эти значения и сохранять счетчик обновлен как 7. И удалите эти значения, используя конвейер. так что следующий запрос не получит эти значения. Но при таком подходе для каждого ключа мы должны хранить последний возвращенный счетчик.

Так есть ли другие лучшие подходы к этой проблеме?

...