与Redis / NoSQL数据库的用例有关的问题

时间:2011-08-14 20:49:51

标签: spring nosql redis

我正在建立一个网站,我将拥有两种用户--X和Y.X将是少数(数百),Y将是很多(数百万)。基本上对于每个X,都会有一些Y. Y会在他们的网络中添加好友。 X将发布一条消息,该消息可以在特定的Y集中看到,并且那些人可以将该消息转发给他们的朋友。朋友可以看到该消息,可以转发给他们的朋友或回复给发件人。

所以这是我的用例,我正在探索不同类型的数据库,主要是NoSQL数据库,因为我正在考虑系统的可扩展性和性能作为我网站的主要问题。我已经开始使用Spring Data Redis API,发现它对我的用例非常有用。我的问题是我们如何执行'更新'在Redis中专门在NoSQL数据库中操作。假设我想更新存储在Redis中的用户信息。另一个问题是如何执行操作,例如让我所有30岁以下的用户,只要我们已经在Redis中存储了用户信息,这些用户信息已经达到了30岁。字段。

我是NoSQL世界的新手,对它的经验非常少。我还想听听有经验的人关于我的用例的正确数据库的消息。我之前使用Spring,Hibernate与MySQL结合作为数据库,并且在系统负载很重时对系统的性能不满意。

谢谢, 萨钦

2 个答案:

答案 0 :(得分:2)

  

我的问题是我们如何在NoSQL中执行'更新'操作   数据库专门用于Redis。让我们说我想更新用户   存储在Redis中的信息。

这取决于您存储用户的结构。 A fifteen minute introduction to Redis data types教程可以帮助您更全面地了解这些数据结构。通常使用SET操作进行更新,因此如果我在hash结构中存储了用户信息并想要更新某个字段,我将使用HSET命令。

  

另一个问题是如何执行操作,比如让我全部   30岁以下的用户提供了我们存储的用户   Redis中有“年龄”字段的信息。

Redis是一个高级键/值数据存储,它不支持ad hoc查询您可能习惯于SQL世界的数据。如果您需要这种查询功能,您应该查看支持它的其他NoSQL解决方案,例如,尝试查看MongoDBthis列表中的其他一些。

答案 1 :(得分:2)

检查Redis是否可以执行所需操作的最佳方法是将其安装在开发计算机中并尝试redis-cli。此内置客户端具有命令完成功能和帮助(只需点击help <TAB>即可查看类别),并且http://redis.io/commands还提供了一份很好的文档。

至于您的请求,您应该研究sorted set数据结构,以存储用户的信息。这比单独sets更好,因为它 允许您进行一些基本形式的查询,如您所见:

假设您希望能够在数据库中查询18到30年之间的所有用户,其中包含(例如)3个用户:Joe,28岁;鲍勃,17岁;和亚当,50年。

您可以将Redis填充为:

ZADD age 28 Joe
ZADD age 17 Bob
ZADD age 50 Adam

语法为ZADD [key] [score] [member]。该集合位于[key],并且在排序集合中,每个[member]都有[score],其中必须是双重。这意味着你不能使用字符串模式甚至字符串值来查询分数(在这一点上,Mongo应该更好)。

所以,是时候查询了。我现在将粘贴redis-cli个查询:


要列出18到30年之间的所有用户,您可以:

redis> ZRANGEBYSCORE age 18 30
1) "Joe"
redis> ZRANGEBYSCORE age 18 30 WITHSCORES
1) "Joe"
2) "28"

选项WITHSCORES显示结果中每个成员的分数。


列出所有未满18岁的用户:

redis> ZRANGEBYSCORE age 0 (18
1) "Bob"
redis> ZRANGEBYSCORE age 0 (18 WITHSCORES
1) "Bob"
2) "17"

(修饰符允许打开开始或结束间隔。这就像where age >=0 and age < 18


列出30岁以上的所有用户:

redis> ZRANGEBYSCORE age 30 +inf
1) "Adam"
redis> ZRANGEBYSCORE age 30 +inf WITHSCORES
1) "Adam"
2) "50"

+inf是无穷大,因此结果没有上限,例如where age >= 30

等等。


这真的只是一个开始。您可以非常快速地在排序集中执行交叉,联合和select count(*)操作,特别是如果您使用优化库(如phpredis)。希望你现在得到一个好印象。