【发布时间】:2019-10-02 22:25:07
【问题描述】:
我创建了一个缓存 (nosql),它获取 graphQL json 对象并将它们展平。这意味着所有子对象都被引用替换并单独存储。例如给定以下输入:
{
"users": [
{"type": "user", "id": 1, "name": "bob"}, {"type": "user", "id": 1, "name": "bill"}
]
}
存储为:
{
"users": ["ref-user-1", "ref-user-2"],
"ref-user-1": {"type": "user", "id": 1, "name": "bob"},
"ref-user-2": {"type": "user", "id": 1, "name": "bill"}
}
这种方法的好处是,如果另一个包含user-1 信息的请求,我们可以更新我们的本地数据存储。然后,如果通过 id 向用户发出请求,我们可能会获得所有必需的信息。
问题来自缓存失效。我们如何知道缓存条目是否是最新的?为了这篇文章,我们可以说一个对象是有效的,如果它的所有字段都在 2 小时内被缓存。如果另一个请求带有user-1,我们希望更新该请求返回的字段的本地时间戳。
如何以高效的方式保存每个字段的时间戳?
考虑的选项:
-
每个值都有自己的时间戳。所有查找都是 O(1),但我们会有大量重复的时间戳数据。
"ref-user-1": {"type": "user", "id": {"val": 1, "ts": "1557941674"}, "name": {"val": "bob" "ts": "1557941674"}} -
将属性时间戳存储为属性集,每组有一个时间戳。查找会很慢,但会减少数据。更新也可能很慢。如果我们可以将字段转换为哈希,并检查较大的哈希是否包含较小哈希中的所有字段,那就太好了。
"ref-user-1": {"type": "user", "id": 1, "name": "bob", "field_sets": ["ts": "1557941674", "fields": ["id", "name"]] } 我没有考虑过的花哨的数据结构......
【问题讨论】:
标签: algorithm caching data-structures hash graphql