Redis:何时使用哈希与 RedisJSON?
Redis: When to use hashes vs RedisJSON?
我现在可以在 Redis 中将资源存储为 hash 或 RedisJSON。在这种情况下,我的特定数据是临时数据 objects,每个都由几个字符串和数字字段组成。用户将调用创建如下结构的进程:
{
'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
'amount': 3.00042
'timestamp': 1590440708,
'user1_status': 'pending',
'user_2_status': 'completed'
}
这实际上是一个客户端-用户处理的队列(队列由单独的 Redis stream 处理),其中每个 object 将保持使用(作为哈希或 RedisJSON 对象)平均约 1 小时。在任何给定时间,队列中都会有数以万计的 objects。在队列中时,对象的字段(如user1_status
和user2_status
)将被更新多次。
每个 object 完成处理后,我可以将其留在 Redis 中或将每个 object 移动到冷存储数据库以供从 Redis 中记录和删除。我不确定我是应该这样做还是就此放弃。
哪种 Redis 数据类型(Hash 或 RedisJSON)更适合我的任务?在这两种类型之间做出决定时,一般需要考虑哪些因素?
注意:我意识到如果我想做这样的事情:
{
'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 可能是正确的选择,因为您必须在将任何对象存储为散列之前将其展平。为了这个问题,假设我不需要这样做,因为我已经知道了。
正如您已经提到的,平面对象与嵌套对象是使用 RedisJSON 的主要原因之一。另一个原因是,如果您关心 JSON 特定类型,例如数字与字符串,因为 Redis 哈希值始终是字符串。
最后,如果您需要根据特定条件查询对象,RedisJSON 支持 JSONPath 可以很方便。
至于性能:虽然 RedisJSON 非常高效,但由于需要存储 JSON 键和 serializing/deserializing,与普通 Redis 哈希相比,它确实有一些开销.
总结:如果您的数据是结构化或嵌套的,并且具有特定的架构,则可以充分利用 RedisJSON。如果它只是普通的 key/value 对并且您不关心值的类型,那么普通的 Redis 哈希就可以了。
我现在可以在 Redis 中将资源存储为 hash 或 RedisJSON。在这种情况下,我的特定数据是临时数据 objects,每个都由几个字符串和数字字段组成。用户将调用创建如下结构的进程:
{
'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
'amount': 3.00042
'timestamp': 1590440708,
'user1_status': 'pending',
'user_2_status': 'completed'
}
这实际上是一个客户端-用户处理的队列(队列由单独的 Redis stream 处理),其中每个 object 将保持使用(作为哈希或 RedisJSON 对象)平均约 1 小时。在任何给定时间,队列中都会有数以万计的 objects。在队列中时,对象的字段(如user1_status
和user2_status
)将被更新多次。
每个 object 完成处理后,我可以将其留在 Redis 中或将每个 object 移动到冷存储数据库以供从 Redis 中记录和删除。我不确定我是应该这样做还是就此放弃。
哪种 Redis 数据类型(Hash 或 RedisJSON)更适合我的任务?在这两种类型之间做出决定时,一般需要考虑哪些因素?
注意:我意识到如果我想做这样的事情:
{
'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 可能是正确的选择,因为您必须在将任何对象存储为散列之前将其展平。为了这个问题,假设我不需要这样做,因为我已经知道了。
正如您已经提到的,平面对象与嵌套对象是使用 RedisJSON 的主要原因之一。另一个原因是,如果您关心 JSON 特定类型,例如数字与字符串,因为 Redis 哈希值始终是字符串。
最后,如果您需要根据特定条件查询对象,RedisJSON 支持 JSONPath 可以很方便。
至于性能:虽然 RedisJSON 非常高效,但由于需要存储 JSON 键和 serializing/deserializing,与普通 Redis 哈希相比,它确实有一些开销.
总结:如果您的数据是结构化或嵌套的,并且具有特定的架构,则可以充分利用 RedisJSON。如果它只是普通的 key/value 对并且您不关心值的类型,那么普通的 Redis 哈希就可以了。