Ограничить длину списка в redis
Я использую списки повторов и добавляю новые элементы в список. Проблема в том, что мне действительно нужны только самые последние 10 элементов в списке.
я использую lpush
добавить элементы в список и lrange
чтобы получить самые последние 10.
Есть ли в любом случае, чтобы бросить предметы после определенного числа? Я закончу списками, которые могут иметь 1000 элементов и могут вызвать проблемы с производительностью с задержкой.
Спасибо!
6 ответов
После каждого lpush
, вызов ltrim
урезать список до 10 элементов
Смотрите http://redis.io/commands/ltrim
Вы можете использовать LTRIM периодически после любого LPUSH, не нужно вызывать LTRIM после каждого LPUSH, так как это увеличит общую задержку в вашем приложении (хотя redis действительно быстр, но вы можете сохранить много операций LPUSH)
Вот псевдокод для достижения LTRIM примерно на каждом 5-м LPUSH:
LPUSH mylist 1
random_int = some random number between 1-5
if random_int == 1: # trim my list with 1/5 chance
LTRIM mylist 0 10
Хотя ваш список может вырасти до нескольких элементов более чем из 10 элементов за раз, но он, несомненно, будет усекаться через равные промежутки времени. Этот подход хорош для большинства практических целей и экономит много операций LTRIM, сохраняя ваши усилия быстро.
Никто не дает точного решения для хранения только самых последних 10 элементов.
Создадим примерный список из 15 пунктов (здесь только числа):
RPUSH list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Теперь укажите смещение от конца списка:
LTRIM list -10 -1
Показать список
LRANGE list 0 -1
1) "6"
2) "7"
3) "8"
4) "9"
5) "10"
6) "11"
7) "12"
8) "13"
9) "14"
10) "15"
Теперь вы можете добавлять новые элементы и запускать обрезку:
RPUSH list 16
LTRIM list -10 -1
1) "7"
2) "8"
3) "9"
4) "10"
5) "11"
6) "12"
7) "13"
8) "14"
9) "15"
10) "16"
Следующий код,
- выталкивает элемент в список,
- сохранить размер до 10,
- и возвращает последние 10 элементов
в транзакции.
MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC
Просто альтернатива. Согласно официальному документу LPUSH
, он возвращает длину списка после операций push. Вы можете установить пороговую длину как k
(в вашем случае k > 10) и позвоните LTRIM
когда возвращаемая длина больше чем k
, Пример псевдокода следующим образом:
len = LPUSH mylist xxx
if len > k:
LTRIM mylist 0 9
LRANGE mylist 0 9
Это более управляемый, чем случайный метод. большая k
вызывает меньше LTRIM
но с большей стоимостью памяти. Вы можете настроить k
в зависимости от того, как часто вы хотите позвонить LTRIM
так как вызов дополнительной команды дороже.
ВызовLTRIM <list-name> -1 -10
послеLPUSH <list-name> <item>
самый простой ответ. Многие его покрыли.
Вы должны выполнить две эти операции в транзакции или должны использовать сценарий Lua, чтобы гарантировать, что операция является атомарной.