Я пытаюсь поддерживать очень изменчивую базу данных в памяти (диск будет слишком медленным), постоянно обновляясь, поскольку я слушаю сотни потоков веб-сокетов 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
Каков наилучший вариант и почему?Есть ли другие варианты?