Redis:何时使用哈希表而不是RedisJSON?

7

我现在可以将一个资源存储在Redis中,使用哈希表或者RedisJSON。对于我的数据来说,它们是由几个字符串和数字字段组成的临时对象。当用户调用此过程时,会创建如下结构:

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

这实际上是一个客户端-用户处理队列(排队由单独的Redis流处理),其中每个对象将作为哈希或RedisJSON对象使用,平均使用时间约为1小时。在任何给定时间,队列中会有数万个这些对象。在队列中,对象的字段(例如user1_status和user2_status)将被多次更新。
一旦每个对象完成处理,我可以将其留在Redis中,也可以将每个对象移动到冷存储数据库以进行日志记录,并从Redis中删除。我不确定我应该这样做还是只是将其保留在Redis中。
对于我的任务,Hash或RedisJSON哪种Redis数据类型更合适?在选择这两种类型之间,有哪些常规考虑因素?
注意:我意识到如果我想做这样的事情:
{
    '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
        }
    }
}

如果你需要将对象存储为哈希表,那么RedisJSON可能是正确的选择,因为你必须在存储之前将任何对象展平。针对这个问题,假设我已经了解了此过程,不需要再次展平。

1个回答

13

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

最后,如果您需要根据特定条件查询对象,则RedisJSON支持用于此目的的JSONPath,这可能很方便。

至于性能:虽然RedisJSON相当高效,但与普通的Redis哈希相比,它确实具有一些开销,因为需要存储JSON键和进行序列化/反序列化。

总之:如果您的数据是结构化或嵌套的,并且具有特定的模式,则可以充分利用RedisJSON。如果只是简单的键/值对,并且您不关心值的类型,则普通的Redis哈希就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接