AIn*_*tel 8 nosql composite-primary-key redis
我是nosql数据库的新手,所以请原谅我的sql思想,但我希望存储可以通过2个键之一“查询”的数据。结构如下:
{user_id, business_id, last_seen_ts, first_seen_ts}
Run Code Online (Sandbox Code Playgroud)
如果这是一个sql DB,我将使用user_id和business_id作为主组合键。我正在寻找的查询类型是
1.'获取所有在business_id = x的地方'
2.'在user_id = x的所有地方获取'
有小费吗?我认为我无法根据上述2种检索类型创建简单的二级索引。我调查了诸如“ zadd”和“ zrange”之类的命令,但这里实际上并没有涉及任何排序。
对于我来说,Redis的用例是减轻SQL数据库上的读写操作,同时该程序计算(将其存储在redis中)最终将写入SQL DB的内容。
注意:鉴于OP的自称经验,出于教育目的,有意简化了此答案。
(之一)您需要了解有关Redis的第一件事是,您应该设计数据,以便每个查询都将成为您惯常认为是通过主键进行访问的查询。从这种意义上讲,将Redis的键空间(全局字典)想象成这样的关系表是很方便的:
CREATE TABLE redis (
key VARCHAR(512MB) NOT NULL,
value VARCHAR(512MB),
PRIMARY KEY (key)
);
Run Code Online (Sandbox Code Playgroud)
注意:在Redis中,值当然可以不仅仅是一个字符串。
请记住这一点,与其他使用规范化数据的数据库模型不同的是,您希望Redis准备好有效地处理两个查询。这意味着您将保存两次数据:一次是在允许按ID搜索业务的主键下,另一次是根据用户ID查询的时间。
要回答第一个查询(“'get all where business_id = x'”),您需要为每个x
保存相关数据的键(在Redis中,根据惯例,我们使用冒号':'作为分隔符) )-因此对于x = 1,您可能会调用密钥business:1
,对于x = a1b2c3 business:a1b2c3
,依此类推。
每个这样的business:x
键可以是一个Redis集,其中每个成员代表其余的元组。因此,如果数据是这样的:
{user_id: foo, business_id: bar, last_seen_ts: 987, first_seen_ts: 123}
Run Code Online (Sandbox Code Playgroud)
您将使用Redis将其存储为以下内容:
SADD business:bar foo
Run Code Online (Sandbox Code Playgroud)
注意:您可以使用所需的任何序列化,Set成员只是Strings。
有了这个功能,回答第一个查询只是一个问题SMEMBERS business:bar
(或SSCAN
针对更大的Sets对其进行查询)。
如果您已完成操作,则已经知道如何提供第二个查询。首先,为您要访问的每个用户(例如user:foo
)使用Set SADD user:foo bar
。然后SMEMBERS
/ SSCAN
,您快要回家了。
您需要做的最后一件事是另一组键,但是这次您可以使用哈希。每个这样的哈希将存储元组的附加信息,即时间戳。我们可以使用由业务和用户ID组成的“主键”(反之亦然),如下所示:
HMSET foo:bar first 123 last 987
Run Code Online (Sandbox Code Playgroud)
从第一个查询或第二个查询获得结果后,您可以获取相关哈希的内容以完成查询(假设查询也返回时间戳)。
归档时间: |
|
查看次数: |
3979 次 |
最近记录: |