Ограничить длину списка в 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, чтобы гарантировать, что операция является атомарной.

Другие вопросы по тегам