我正在尝试在内存中维护一个非常易失的数据库(磁盘速度太慢),并在侦听数百个JSON Websocket流时始终进行更新。
当前我正在使用redis,但它不支持字典,仅支持数组。您可以将JSON字符串转储到redis数据库,但是redis不会知道它是JSON。因此,您无法访问或更改某个键的值。您必须加载整个JSON字符串,对其进行编辑,然后将其转储回Redis。这当然很慢,我想停止这样做。
有一个名为reJSON的库,该库允许redis识别JSON并编辑JSON字典,但是我必须重写很多代码才能使用它。但是,如果使用reJSON,则可以直接访问和编辑特定键的值,而不必加载和转储整个JSON字符串。
当前我正在做的是串联键名,因为它们包含字典。这里的问题是字典中是否有字典。我必须串联第二次,这会产生-ton-键。我认为这不是最佳方法。
还建议我使用Redis命令和哈希表,而不是仅存储JSON字符串,但哈希表似乎不支持字典,而仅支持数组。
关于数据本身,我正在侦听websocket流,其中每次更新都会为我提供如下数据: https://api.binance.com/api/v1/klines?symbol=XRPBTC&interval=5m&limit=1
这是交易市场“ XRPBTC”的“蜡烛”,蜡烛每“ 5分钟”完成。我想每次API数据的第一个元素更改时都继续创建一个新密钥(这意味着5分钟过去了,现在有一个新的蜡烛。该值是一个毫秒的纪元)。如果未更改,则当前蜡烛不是新的,但数组的其他元素已更改,并且这些更改需要在redis数据库中进行。
比方说,我得到了一个websocket更新,其中当前蜡烛数组的第4个元素发生了变化。这很可能发生,因为它是“收盘价”或当前市场价格。
我现在拥有的是一个名为candles_XRPBTC5MINUTE
的钥匙。此键的值是字典的字典。
https://pastebin.com/rAYs0TaN
redis中的“关闭”值如下:
candles_XRPBTC5MINUTE["1554792300000"]["close"]
我想将redis中的值编辑为新websocket更新中的值。 candles_XRPBTC5MINUTE
包含嵌套字典,大小为0.1 MB。目前,我将candles_XRPBTC5MINUTE
从redis加载为JSON,将candles_XRPBTC5MINUTE["1554792300000"]["close"]
更新为websocket更新中的内容,然后将其作为JSON转储回redis。如您所知,当我关注最新的密钥1554792300000
时,这会处理很多不必要的旧数据。
我的选择似乎是:
A。使用reJSON
B。继续使用香草Redis,但再次串联键名称,为candles_XRPBTC5MINUTE_1554792300000
,candles_XRPBTC5MINUTE_1554792600000
创建数以万计的键(candles_XRPBTC5MINUTE_1554792900000
,1MINUTE
,3MINUTE
等15MINUTE
,用于其他数百个市场)
C。尝试将我从WebSocket检索到的数据存储为Redis哈希而不是JSON字符串
这里最好的选择是什么,为什么?还有其他选择吗?