Redis:何时使用哈希与ReJSON?

时间:2020-05-25 21:21:10

标签: json redis hashmap redisjson

我现在可以在Redis中将资源存储为 hash ReJSON 。在这种情况下,我的特殊数据是临时数据对象,每个对象都由几个字符串和数字字段组成。用户将调用一个创建如下结构的过程:

{
    'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
    'amount': 3.00042
    'timestamp': 1590440708,
    'user1_status': 'pending',
    'user_2_status': 'completed'
}

这实际上是客户端用户处理的队列(该队列由单独的Redis stream 处理),其中每个 object 都将保持使用状态(作为哈希或rejson对象)平均约1小时。在任何给定时间,队列中都会有成千上万个这些 object 。在队列中时,对象的字段(例如user1_statususer2_status)将被更新几次。

每个 object 完成处理后,我可以将其保留在Redis中,也可以将每个 object 移至冷存储数据库中进行日志保存,然后从Redis中删除。我不确定是应该这样做还是只保留它。

哪种Redis数据类型(哈希或ReJSON)更适合我的任务?在决定这两种类型时,有哪些一般注意事项?

注意:我意识到,如果我想做这样的事情:

{
    'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
    'amount': 3.00042
    'timestamp': 1590440708,
    'user1_status': 'pending',
    'user_2_status': 'completed'
    'parent': {
        'item1': 1,
        'item2': [1, 2, 3, 4]
        'item3': {
            'one': 1,
            'two': 2
        }
    }
}

ReJSON可能是正确的选择,因为在将对象存储为哈希之前,必须先将其弄平。出于这个问题,假设我已经知道了,所以我不需要这样做。

1 个答案:

答案 0 :(得分:6)

正如您已经提到的,平面对象与嵌套对象是使用RedisJSON的主要原因之一。另一个原因是,如果您关心JSON特定的类型(例如数字与字符串),因为Redis哈希值始终是字符串。

最后,如果需要根据特定条件查询对象,则RedisJSON支持JSONPath,这很方便。

关于性能:尽管RedisJSON相当高效,但由于需要存储JSON密钥并进行序列化/反序列化,因此与纯Redis哈希相比确实有一些开销。

总结:如果数据是结构化的或嵌套的,并且具有特定的架构,则可以充分利用RedisJSON。如果只是纯键/值对,而您不关心值的类型,那么纯Redis哈希就可以了。