java - Redis与数据库通信

标签 java sql database architecture redis

我正在开发一个相册系统,决定使用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 获取 ids,从 DB 获取详细信息”是正确的方法吗?对于这种情况你会怎么做?

最佳答案

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

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

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

一种解决方案是使用管道并执行两次往返:

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

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

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

相关文章:

php - Mysql PHP 在文本中查找名称

sql - 根据列的结果查询添加列

MySQL(涉及数组)需要表建议

java - 如何在 C# 或 Java 中找到每个 Switch Case 项的值?

mysql - MySQL 查询出现问题

java - Hibernate 根据条件从数据库中检索结果

用于大型数据库表的 JavaFx TableView CRUD

php - 我使用 str_replace 在没有逗号分隔符和小数点的情况下将值获取到数据库。现在,如何以旧格式从数据库返回?

java - java中删除文本文件中的某个字符

java - Java 中的正则表达式模式不起作用