Подтвердить что ты не робот

Ограничить длину списка в redis

Я использую списки redis и нажатие на новые элементы в списке. Проблема в том, что мне действительно нужны только самые последние 10 элементов в списке.

Я использую lpush для добавления элементов в список и lrange, чтобы получить последние 10.

Есть ли какие-либо вещи, чтобы удалить элементы после определенного числа? Я получаю списки, которые могут содержать 1000 элементов и могут вызывать проблемы с производительностью с задержкой.

Спасибо!

4b9b3361

Ответ 1

После каждого lpush вызовите ltrim, чтобы обрезать список до 10 элементов

См. http://redis.io/commands/ltrim

Ответ 2

Вы можете использовать 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, сохраняя ваши усилия быстро.

Ответ 3

Следующий код

  • подталкивает элемент к списку,
  • сохраните размер, равный 10,
  • и возвращает последние 10 элементов

в транзакции .

MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC

Ответ 4

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

Ответ 5

Никто не дает точного решения для хранения только самых последних 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"