3

我正在将基于 MySQL 的旧用户管理系统转换为 Redis,并且遇到了一些问题......

我使用 HASH 和 SET 的组合作为系统的基础。

只是一些伪代码

let uid=incr user_id_counter

    hset joe@dom.com user user:uid
    hset user:uid email joe#dom.com
    hset user:uid gender m
    hset user:uid year_of_birth 1972
    hset user:uid fav_band acdc
    sadd maleUsers uid
    sadd born1972Users uid

此时一切都很好,我可以使用 sinter 进行搜索,例如:

sinter maleUsers born1972
or
sinter femaleUsers born1980

这是假设我为每一年的出生做一个单独的集合

sad bornXXXX uid

这是我可以忍受的 - 但我将如何处理最喜欢的乐队?当然,我不会为所有可能的乐队制作一套吗?

最终我希望能够进行详细的搜索,例如,

sinter maleUsers born1980 genreRock genreMetal homeTownSydney

有没有更复杂的方法来进行关系查询?

4

2 回答 2

3

我是 Redis 的忠实粉丝。但我担心你的方法是完全错误的。您的用户凭据的主要存储仍然应该是传统的 RDBMS,并且坚持使用 MySQL 是一个很好的方法。

NoSQL 数据库,尤其是 Redis,旨在做其他事情。

Redis 是基于内存的。是的,您可以将所有内容保存到硬盘驱动器,但是当您的机器启动时,它会将所有内容从硬盘驱动器加载到内存中。而且 - 您的存储上限是您机器的内存。因此,除非您指望的用户不多,否则我不会推荐 Redis 作为主要的存储来源。您仍然可以利用 Redis 对用户进行辅助访问(例如二级缓存),但不能作为主要来源。

您可以将基于磁盘的 NoSQL 数据库(MongoDB、CouchDB、Cassandra 等)用于您的用户数据库,这是比 Redis 更好的选择,但我仍然强烈推荐使用传统的 RDBMS。您希望将最关键的数据保存在可靠的基于事务的系统中。

于 2013-02-16T11:07:54.910 回答
0

但是我将如何处理最喜欢的乐队?当然,我不会为所有可能的乐队制作一套吗?

嗯,这正是你应该做的。使用 Redis,这种关系由对波段的引用、用户定义的一部分以及与包含对所有用户的引用的波段关联的集合来表示。

这种关联必须手动保存,但您可以利用 MULTI/EXEC 块来保证并发环境中的数据一致性。

有没有更复杂的方法来进行关系查询?

是的,通过使用关系数据库而不是 Redis。如果您正在寻找关系查询,为什么不使用 RDBMS?MySQL有什么问题?

于 2013-02-16T10:13:06.523 回答