在这种情况下如何更好地使用redis?

问题描述 投票:0回答:1

背景:

餐桌学校:
3 个字段:
sid(学校编号)
s_name(学校名称)
s_type(学校类型)

表用户:
2 个字段:
user_id(用户 ID)
姓名(用户名)

表school_user_relationship:
3 个字段:
摆脱(关系ID)
sid(学校编号)
user_id(用户id)

解释:

  1. sid和user_id都存在于user表中,用flag来区分学校和普通用户。 sid和user_id来自同一个全局用户系统,由分布式ID算法生成,不被MySQL自增
  2. 学校表是学校信息的扩展表。
  3. 表school_user_关系存在唯一约束联合(sid,user_id)
  4. 关系表中的每条记录表示sid学校有一个user_id用户
  5. 每个sid学校的最大用户数为100000
  6. 学校数量高度不确定

问题:

如何使用Redis优化以下两个需求?

  1. 给定一个代表学校的sid和一个代表学校或学生的user_id,确定user_id属于这所学校(sid)
  2. 给定一个代表一个(学校id或用户id)集合的用户,它判断集合中的所有用户是否属于同一所学校

数据结构: 哈希?放?位集?

不使用任何优化时,查询时间有点长。因此,优化很有可能毕业。但我还没有任何计划。

redis web-applications query-optimization spring-cloud
1个回答
0
投票

你的问题听起来像是你有一个关系数据库(SQL)方法来解决你的问题。另一方面,Redis 的核心是键值存储或关联数组。 Java 开发工具包提供 HashMap 数据类型作为键值存储。 Python 提供字典,Javascript 提供具有属性的对象。 php 和 perl 提供关联数组

让我们把数据结构称为字典(通用的,不是 python)。在所有这些数据结构中,以及在 Redis 中,您可以通过执行类似于此伪代码的操作来存储您的用户数据,将您的用户名放入用户名字典中。 (

<--
是伪代码赋值运算符。)

usernames[user_id] <-- name

然后,如果你知道用户的 id,你可以像这样得到名字

name <-- usernames[user_id]

但是如果你知道用户的名字并且你想要他们的id,你需要一个单独的数据结构

userids[name] <-- user_id

并执行此操作以按名称恢复 ID。

user_id <-- userids[name]

在 SQL 中你可以说

SELECT user_id FROM users WHERE name = whatever
,但字典不是那样工作的(无论如何效率不高)。

字典可以有字典(redis中的HASH)和集合(redis中的SET)作为值。所以你可以有一本字典,每所学校都有一个条目,这是该学校注册人员的一组用户 ID

为 Redis 设计性能良好的一个好方法是弄清楚如何使用带有字典的普通编程语言来实现它。

© www.soinside.com 2019 - 2024. All rights reserved.