Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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

Благодарю вас!

21.08.2012

  • Как вы взаимодействуете с Redis? интерфейс командной строки? Питон? С#? 21.08.2012
  • Это должно быть что-то вроде LTRIM list -10 -1, как я подробно ответил ниже. 03.09.2019

Ответы:


1

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

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

21.08.2012
  • Разве получение текущей длины списка и вставка только в том случае, если длина меньше 10, не будет более эффективным решением для больших объектов? 06.01.2016
  • @bornSwift, разве ваше решение не оставило бы 10 самых ранних записей вместо 10 самых последних? 12.02.2016
  • @TerryLewis, да, хорошая мысль. Не увидел самого последнего в вопросе.. упс 22.02.2016

  • 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-операций, сохраняя скорость ваших push-уведомлений.

    17.06.2016
  • Вы почти чувствуете запах, когда совет приходит прямо из чьего-то опыта в производстве;) 24.01.2018
  • Как вы можете быть уверены, что получить случайное число и проверить, является ли оно чем-то, не дороже, чем LTRIM вызов? 26.04.2018
  • @fiatjaf В основном из-за того, что LTRIM является сетевой операцией, однако, если обе операции являются частью одного сценария Lua, нам, возможно, придется провести сравнительный анализ. Однако я твердо уверен, что операция со случайными числами будет проще, чем LTRIM в обоих случаях. 28.04.2018
  • @DhruvPathak Если вы используете язык / библиотеку, поддерживающую конвейерную обработку, то нет необходимости писать сценарий, чтобы сэкономить время на передачу туда и обратно. 30.11.2018

  • 3

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

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

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

    MULTI
    LPUSH list "item1"
    LTRIM list 0 9
    LRANGE list 0 9
    EXEC
    
    09.03.2015
  • @PaulT.Rawkeen, почему? это может быть достигнуто с помощью встроенных команд Reids (обернутых в транзакцию), я не вижу причин делать это lua-скриптом. 15.04.2018

  • 4

    Никто никогда не упоминал реальное решение о хранении только 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"
    
    03.09.2019
  • Это должен быть принятый ответ. 27.05.2021

  • 5

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

    28.11.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..