База данных в памяти для JSON с вложенными словарями (Python) - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь поддерживать очень изменчивую базу данных в памяти (диск будет слишком медленным), постоянно обновляясь, поскольку я слушаю сотни потоков веб-сокетов JSON.

В настоящее время я использую redis,но он не имеет поддержки словаря, только массивы.Вы можете записать строку JSON в базу данных Redis, но Redis не будет знать, что это JSON.Таким образом, вы не можете получить доступ или изменить значение определенного ключа;Вы должны загрузить всю строку JSON, отредактировать ее и затем сбросить обратно в Redis.Это, конечно, очень медленно, и я бы хотел прекратить это делать.

Есть библиотека reJSON, которая позволяет redis распознавать JSON и редактировать словари JSON, но мне придется переписать большую часть моегокод для его использования.Однако, если бы я использовал reJSON, я мог бы напрямую получать доступ и редактировать значения определенных ключей вместо загрузки и выгрузки всей строки JSON.

В настоящее время я занимаюсь объединением имен ключей, поскольку они содержат словари.Проблема здесь в том, что в словаре есть словарь;Мне придется объединить во 2-й раз, и это приведет к -тонну ключей.Я не думаю, что это оптимальный подход.

Мне также рекомендовали использовать команды и хэши Redis вместо простого хранения строк JSON, но хэши, похоже, не поддерживают словари, а только массивы.

Что касается самих данных, я слушаю потоки веб-сокетов, где каждое обновление дает мне такие данные: https://api.binance.com/api/v1/klines?symbol=XRPBTC&interval=5m&limit=1

Это «свеча» для торгового рынка «XRPBTC», иСвеча завершается каждые "5 минут".Я хочу продолжать создавать новый ключ каждый раз, когда изменяется первый элемент этих данных API (то есть прошло 5 минут, и теперь появилась новая свеча. Это значение - эпоха миллисекунд).Если он не изменился, текущая свеча не является новой, но другие элементы массива изменились, и эти изменения необходимо внести в базу данных redis.

Допустим, я получил обновление веб-сокета, где4-й элемент массива текущей свечи изменен.Скорее всего, это произойдет, поскольку это «цена закрытия» или текущая рыночная цена.

У меня сейчас есть ключ под названием candles_XRPBTC5MINUTE.Значение этого ключа - словарь словарей.https://pastebin.com/rAYs0TaN

Значение "close" в redis находится здесь: candles_XRPBTC5MINUTE["1554792300000"]["close"]

Я хочу отредактировать значение в redis, чтобы оно было тем, которое я получил в новом обновлении websocket.candles_XRPBTC5MINUTE содержит вложенные словари и составляет 0,1 мегабайта.В настоящее время я загружаю candles_XRPBTC5MINUTE из redis как JSON, обновляю candles_XRPBTC5MINUTE["1554792300000"]["close"] до того, что есть в обновлении websocket, а затем возвращаю его обратно в redis как JSON.Как вы можете сказать, это большая обработка старых, ненужных данных, когда я сосредотачиваюсь на новейшем ключе 1554792300000.

Мои параметры кажутся такими:

A.Используйте reJSON

B.Продолжайте использовать ванильный Redis, но снова объединяйте имена ключей, создавая десятки тысяч ключей (candles_XRPBTC5MINUTE_1554792300000, candles_XRPBTC5MINUTE_1554792600000, candles_XRPBTC5MINUTE_1554792900000 и т. Д. Для 1MINUTE, 3MINUTE, 15MINUTE, для сотен других рынков)

C.Попытайтесь сохранить данные, которые я получаю из веб-сокетов, в виде хэшей Redis вместо строк JSON

Каков наилучший вариант и почему?Есть ли другие варианты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...