2011-10-31 69 views
5

我想存储一些信息如下(注意,我不是执着于这种数据结构可言,但是这表明你的基本信息要存储):简单的按价值搜索?

{ user_id: 12345, page_id: 2, country: 'DE' } 

在这些记录,user_id是唯一字段,但page_id不是。

我想转换成Redis的数据结构这一点,我想能够运行有效的搜索如下:

  • 对于USER_ID 12345,找到相关的国家。
  • 对于page_id 2,找到所有相关的user_ids及其国家。

是否真的有可能在Redis中做到这一点?如果是这样,我应该使用什么样的数据结构,以及当我插入时应该如何避免重复记录的可能性?

回答

4

这听起来像你需要两种密钥类型:一个HASH密钥存储您的用户数据,以及包含相关用户列表的每个页面的LIST。下面是一个如何工作的例子。

加载数据:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

提取数据:

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

删除用户从页面:在排序

> LREM page:2:users 0 12345 

重复GET来为用户检索附加价值。

我希望这可以帮助,让我知道如果有什么你想澄清或如果你需要进一步的援助。我还建议阅读redis web site上提供的命令列表和文档,特别是有关SORT操作的文档。

+0

谢谢 - 实际上我结束了使用HASH和SET,而不是列表 - 但很好的答案! – Richard

1

由于user_id是唯一的,country也是唯一的,因此请将它们保存在简单的键值对中。在这种情况下为用户查询是O(1)...然后,保留一些Redis sets,其中关键的page_id和成员的所有user_ids ..

+0

谢谢。我对此的担心是:如果您将新用户插入到键值中,那么*之前*可以添加设置条目,数据库就会关闭?当它回来时,你会留下讨厌的半信息。 – Richard

+1

在这种情况下,您有两种选择:在客户端代码中保留某种状态,换句话说,检查每次操作后redis返回的结果,并在出现故障时采取相应措施,或者使用http:// redis。 IO /命令#交易; – hymloth

+1

我认为[Pipelining](http://redis.io/topics/pipelining)是不错的选择 –