【问题标题】:Redis and DB communicationRedis 和 DB 通信
【发布时间】:2014-02-28 16:23:08
【问题描述】:

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

我决定通过使用存储过程来使用 DB,“一次拍摄,获取所有内容”知道照片 ID(它们已编入索引)。 “从 Redis 获取 id,从 DB 获取详细信息”是正确的方法吗?遇到这种情况你会怎么做?

【问题讨论】:

  • 把所有细节放在redis中,在hash类型的键中有什么问题?
  • Redis 没有搜索功能。我可以说“从 ownerid=1000 的照片中选择 *”来获取包含所有必需字段的特定照片集吗?
  • 这不是你的做法。您创建具有多种用途的多个密钥。例如,一个键保存给定所有者的所有照片。然后另一个键保存每张特定照片的详细信息。
  • 所以我从 user:1000:photos 密钥中获得了 100 个照片 ID,该密钥保留了用户的所有照片 ID。我如何从照片::dtls hash 中获取这 100 张照片详细信息?我必须为每个照片 ID 运行 100 次,对吗?这是我在问题中提到的主要问题。

标签: java sql database architecture redis


【解决方案1】:

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

现在,如果您想将所有内容都存储在 Redis 中,这也是可能的,前提是您可以预测数据的所有访问路径。

使用 Redis,如果您将这些命令捆绑在同一个往返行程中,则运行多个命令来获取一些数据非常有效。 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

如果您有兴趣通过检索给定用户的所有照片属性(即像 select * from ...),它有点复杂。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 2018-02-18
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多