我正在将旧的基于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 maleUsers born1972
or
sinter femaleUsers born1980
这是假设我为每年的birh单独设定
sad bornXXXX uid
这是我可以忍受的 - 但我如何处理收藏乐队? 当然,我不会为所有可能的乐队制作一套?
最终我希望能够进行详细搜索,例如,
sinter maleUsers born1980 genreRock genreMetal homeTownSydney
是否有更复杂的方法来进行关系查询?
答案 0 :(得分:3)
我是粉丝或Redis。但我担心你的方法是错误的。您的用户凭据的主存储应该仍然是传统的RDBMS,并且坚持使用MySQL是一种很好的方法。
NoSQL数据库,特别是Redis,也可以用来做其他事情。
Redis是基于内存的。是的,您可以将所有内容保存到硬盘驱动器中,但是当您启动计算机时,它会将所有内容从硬盘驱动器加载到内存中。并且 - 您的存储空间是您机器的内存。因此,除非您指望的用户不多,否则我不建议将Redis作为主要的存储来源。您仍然可以利用Redis对用户进行二级访问(例如二级缓存),但不能作为主要来源。
您可以为您的用户数据库使用基于磁盘的NoSQL数据库(MongoDB,CouchDB,Cassandra和所有这些数据库),这是比Redis更好的选择,但我仍然强烈建议使用传统的RDBMS。您希望在基于事务的可靠系统中保存最关键的数据。
答案 1 :(得分:0)
但是我如何处理收藏乐队?当然,我不会为所有可能的乐队制作一套?
嗯,这正是你应该做的。对于Redis,此类关系由对波段的引用,用户定义的一部分以及与包含对所有用户的引用的波段相关联的集合表示。
此关联必须手动保留,但您可以利用MULTI / EXEC块来保证并发环境中的数据一致性。
是否有更复杂的方法来进行关系查询?
是的,使用关系数据库而不是Redis。如果您正在寻找关系查询,为什么不使用RDBMS? MySQL出了什么问题?