Redis 和关系

标签 redis associations

我打算为我的应用程序使用缓存层。我不确定定义 1..N 和 self 参照关系的正确策略是什么。

例如,如果我必须代表类(class)和学生,一门类(class)可以注册 1..N 名学生。我还必须维护彼此相关的不同类(class)之间的关系(一门类(class)可以链接到其他类似类(class))。

我想我有两个选择:

  1. 我可以拥有一个包含学生 ID 和相关类(class) ID 列表的类(class)模型。我现在将类(class)作为散列存储在 redis 中。每当将学生添加到列表中时,我都可以从缓存中获取类(class),进行更改并将其放回缓存中。

  2. 我可以对仅具有类(class)基本属性的类(class)进行建模。我现在可以使用 Redis 列表表示与学生和其他类(class)的关系。

哪种方法更好?为什么?

如果删除类(class),我必须删除所有关联关系。我怎样才能做到这一点?

最佳答案

我认为如果您要使用 Redis,您需要重新考虑您的解决方案。避免像在关系数据库中那样考虑关系。

在 Redis 中,您既可以将完整的对象存储为 JSON 或任何其他序列化格式,也可以存储在列表、集合、排序集合和哈希等数据结构中。

整个关联不会由 Redis 执行,而是由您的应用程序层执行,但我再次建议您应该重新考虑如何在 Redis 中存储数据。

例如,如果您有类(class)和学生,您可以以不相关的方式将两者存储在 redis 中:

  • 学习中心:类(class):123
  • 学习中心:学生:1129

如果您需要将学生添加到给定类(class),您将创建一个集合类型的键:

  • 学习中心:类(class):123:学生

...您将存储学生唯一标识符的位置,例如:

sadd learningcenter:course:123:students 1129

归根结底,course 有 N 个students,但这在 Redis 中无法很好地表示:这是您的代码在整个 Redis 中存储数据的方式数据库。

关键是拥有这样的一组唯一标识符,以确保您将它们分布在整个数据库中,而不会有添加对某些数据的不存在引用的风险。

当您需要添加新学生并将其关联到一门或多门类(class)时,您需要自己执行整个 sadd 命令,而当您想要删除学生时,您您需要确保从任何集合中删除它的 key 。

Redis 支持事务

You should take a look at how Redis handles transactions,因为您需要以原子方式执行此类写入操作以避免数据损坏。

关于Redis 和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24470861/

相关文章:

python - 如何使用 pyarrow 将 Pandas 数据帧设置/获取到 Redis

redis - Jedis 存储困惑,这个问题是 Redis 还是 Jedis?

redis - 无法使用 PooledRedisClientManager

python - 由于回复 pidboxes,Redis 在用作 Celery 代理时会占用大量内存

javascript - Sequelize onDelete 不工作

mysql 将一张表中的数据拆分为两张表并保留映射(关联)

ruby-on-rails-4 - 在每个用户级别将最常访问的项目存储在 redis 中

node.js - NodeJS Sequelize : Association with alias [alias] does not exist on [model]

java - 如何过滤 Play Framework CRUD 模块中的关联

ruby-on-rails - 创建新记录时如何传递current_user?