Redis和DB通信

时间:2014-02-04 15:46:15

标签: java sql database architecture redis

我正在开发相册系统并决定使用Redis。我在Redis中保留用户的照片数据(谁有哪些照片)。例如:照片:1000:pid [1,24,525,12,42,62,56]表示ID为1000的用户在列表中有照片(ids)。我感到困惑的一点是,当我得到[1,24,525,12,42,62,56]时,我怎么能得到照片细节?我想用Redis再次获取照片细节。但是,当一个用户拥有150张照片时,逐个获取它们(从循环中使用jedis的java),花费100-150毫秒,这不适合我的情况。我必须管理高流量。响应不应超过100毫秒。

我决定使用存储过程来使用数据库,“一次性,获取所有内容”知道照片ID(它们被编入索引)。 “从Redis获取ID,从DB获取详细信息”是一种正确的方法吗?你会为这种情况做些什么?

1 个答案:

答案 0 :(得分:2)

我不建议使用两个不同的商店。把事情简单化。考虑一下数据的一致性。如果您对关系数据库更熟悉,那么使用它(对于您的所有数据)没有任何问题。

现在,如果您想将所有内容存储在Redis中,只要您可以预测数据的所有访问路径,也可以将其存储起来。

使用Redis,如果将这些命令捆绑在同一个rountrip中,则运行几个命令来获取一些数据非常有效。 Redis服务器(和大多数客户端)完全支持pipelining。假设您使用Jedis,您可以找到一些示例here

实际上,有多种方法可以解决您的问题。

假设您有以下型号:

photos:<userid> -> set of photo IDs for a given user ID
photo:<photoid> -> hash of photo properties for a give photo ID

如果您有兴趣检索给定用户的特定照片属性(例如名称和大小)(例如选择名称,大小来自......),可以使用单个SORT命令完成。

 SORT photos:<userid> by nosort get # get photo:*->name photo:*->size

如果您有兴趣检索所有给定用户的照片属性(例如,从...中选择*),则会有点复杂。

一种解决方案是使用流水线操作并执行两次往返:

  • 首次往返获取照片ID(使用SMEMBERS)
  • 第二次往返以管道所有HGETALL命令(每张照片一个)

另一种解决方案是使用server-side Lua scripting在服务器端执行所有聚合。复杂性更高,但成本只是一次往返。