gpt4 book ai didi

java - Redis与DB通信

转载 作者:IT王子 更新时间:2023-10-29 06:05:42 27 4
gpt4 key购买 nike

我正在开发一个相册系统,决定使用Redis。我将用户的照片数据(谁有哪些照片)保存在 Redis 中。例如:photos: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 获取详细信息”是否是一种正确的方法?对于这种情况,你会怎么做?

最佳答案

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

现在,如果您想将所有内容都存储在 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

如果您有兴趣检索给定用户的所有照片属性(即像 select * from ...),它会稍微复杂一些。

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

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

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

关于java - Redis与DB通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21556898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com