开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情
从表面上看,Redis 哈希与用于数据存储的 Javascript 对象非常相似。您有一个键、字段和值。以下是 Redis 和 Javascript 之间以大致相同的方式表示的一些数据:
HSET “a-test” “name” “Kyle Davis”
HSET “a-test” “address” “123 Main Street”
var
aTest = {
name : ‘Kyle Davis’,
address : ‘123 Main Street’
};
当您增加 Javascript 对象的复杂性时,它会变得更加复杂。以这个稍微复杂一点的对象为例:
var
aTest = {
name : { first : 'Kyle', family : 'Davis'},
address : '123 Main Street'
}
现在,尝试用 Redis 哈希表示它。去吧,我会等。
你不能,至少不能直接。有时您会看到人们将另一种数据交换格式强加到字符串值中。我真的认为这是个坏主意。
您可能想知道为什么我还没有在这篇文章中提到术语JSON。主要是因为我认为它在这里没有合法的位置。图书馆尝试这种策略是很常见的。最终,它有问题。
#bad - don't do this
HSET "a-test" "name" "{"first":"Kyle","family":"Davis"}"
HSET "a-test" "address" "123 Main Street"
虽然我一直在选择 JSON,但几乎所有其他格式(XML 或其他格式)也是如此。
您可以手动转换您的数据,但这涉及大量关于数据现在和将来如何的知识。另外,我没有时间,我打赌你也没有
两全其美
那么,除了禁止嵌套对象之外,您如何才能两全其美呢?
进入,平坦。Flat 是一个小型 npm 模块,可将您的嵌套对象转换为单个平面键/值。回到我们之前的例子,通过使用 flat 你可以将你的嵌套对象转换成类似这样的东西:
var
aTest = {
"name.first" : 'Kyle',
"name.family" : 'Davis',
"address" : '123 Main Street'
}
有了这个,您可以通过执行以下操作将其简单地存储在 Redis 中:
HSET “a-test” “name.first” “Kyle”
HSET “a-test” “name.family” “Davis”
HSET “a-test” “address” “123 Main Street”
现在,如果您只想获取姓氏,您可以:
HGET "a-test" "name.family"
您还可以做一些很酷的事情,例如:
sort myTestList BY *->name.first ALPHA DESC GET *->address GET *->name.first
用 JSON 试试看!
好的,坏的,丑陋的
平坦并不完美。我对它如何处理数组并不着迷。您会遇到与 JSON 相同的情况——Redis 并不真正了解正在发生的事情,因此无法直接检索和操作它。对于如何处理这种情况,我没有答案,但它并不完美。
Flat 也有一些问题,变量不能很好地放入字符串中——所以偶尔你会得到一个 'undefined' 的散列值,而不是你知道的,甚至不在散列中的东西。确保使用 flat 全面测试数据并相应地进行调整。
最后,就性能而言,Flat 可能不是最好的。JSON.parse和JSON.stringify是内置函数,因此它们很难被击败,但您可以灵活地只获取一个值而不是整个 JSON 块来弥补它。