当前位置: 首页 > 面试题库 >

Redis和查询值

殳睿
2023-03-14
问题内容

Redis在概念上与我使用的传统SQL数据库有所不同,我正在尝试确定它是否适合我的项目…我一直在寻找,但似乎找不到我的问题的答案。

我有一组用户需要存储,每个用户都有一个唯一的ID和与之关联的几个值(例如其名称)。看来我可以简单地将它们存储为哈希:

user:fef982dcfe1a7bcba4849b4c281bba95
"username" "andrewm" "name" "Andrew"

我还有一堆要存储的消息,每个消息都有一些属性,例如发送者和接收者:

message:1a7bcba4849b4c281bfef98a952dcfeb
"sender" "fef982dcfe1a7bcba4849b4c281bba95" "recipient" "82dcfe1a7bcba4849b4c281bba95fef9" "message" "Hi!"

我的问题是,我将如何检索特定用户发送的所有消息(由其哈希指定)。我应该使用传统的关系数据库,还是像MongoDB这样的NoSQL数据库(之前使用过)?如果是这样,那么有人对高性能商店有什么建议吗?我不会做任何真正的搜索(即MySQL
LIKE查询),实际上只是进行键值查找。


问题答案:

当然可以使用Redis对这些数据进行建模,但是您需要考虑数据结构和访问路径。使用Redis时,访问路径不会隐式管理(就像RDBMS /
MongoDB中的索引一样)。

对于提供的示例,您可以具有:

user:<user hash> -> hash of user properties
user:<user hash>:sent -> set of <msg hash>
user:<user hash>:received -> set of <msg hash>
message:<msg hash> -> hash of message properties

添加/删除消息意味着在添加/删除消息对象本身的基础上,维护与发送者和接收者相对应的:sent和:received集。

检索给定用户的已发送或已接收的消息只是SMEMBERS命令,如果要同时检索消息的属性,则也可以是SORT:

# Get a list of message hash codes only in one roundtrip
smembers user:<user hash>:received

# Get a list of message contents in one roundtrip
sort user:<user hash>:received by nosort get message:*->sender get message:*->message

注意1: 使用Redis时,最好将整数用作键而不是UUID或哈希码(尤其是在集合中),因为它们以更有效的方式存储。

注意2:
如果您需要订购消息,则必须使用列表而不是列表。结果是只能删除最旧的消息,并且只能以有效的方式添加新的消息。您可能还会为所有消息添加一个全局列表。



 类似资料:
  • 问题内容: 我一直在学习Node.js,因此我决定制作一个简单的广告网络,但似乎无法决定要使用的数据库。我一直在搞弄Redis,但是我似乎找不到一种通过特定条件查询数据库的方法,相反,我只能获取键或列表的值或在键内进行设置。 我是否缺少某些东西,还是应该使用像MongoDB这样更强大的数据库? 问题答案: 我建议阅读有关Redis的 本 教程,以了解其概念和数据类型。在我读了几篇文章并尝试将Red

  • 对于redis查询返回结果顺序的判断,我有些怀疑,特别是对于hgetall查询 例如,我将一些数据按其枚举的顺序放入数据库: 不带任何其他参数的“keys key:*”命令是否总是按照数据在数据库中出现的顺序返回该数据,还是会尝试以任何方式对数据进行排序?

  • DetachedCriteria 类使你在一个 session 范围之外创建一个查询,并且可以使用任意的 Session 来执行它。 DetachedCriteria query = DetachedCriteria.forClass(Cat.class) .add( Property.forName("sex").eq('F') ); Session session = ...

  • 问题内容: 查询,本机查询,命名查询和类型查询之间有什么区别?“独立”查询是否存在,还是只是缩写?在我看来,本机查询是用简单sql编写的查询,而命名查询与实体(hibernate映射)有关。有人可以简要解释一下吗? 问题答案: 询问 查询是指JPQL / HQL查询,其语法类似于通常用于执行DML语句(CRUD操作)的SQL。 在JPA中,您可以使用创建查询。您可以查看API以获得更多详细信息。

  • 这个问题给出了正确的节点,但是所有的节点都同时给出了。 还有当时,它什么也不返回?

  • 我有两个联合查询,如下所示: 现在,我想在另一个查询中使用此联合。 当我运行它时,我得到ORA-00904:"P"."CUSTOMER_NO":无效的标识符。我需要将h1.customer_no加入到外部查询customer_no。 我看到过一些带有rank的查询,但我不太明白。如何将内部查询与外部查询连接起来? 提前感谢。