使用 Redis 进行复合查询

2024-02-25

出于学习目的,我尝试在 Redis 中编写一个简单的结构化文档存储。在我的示例应用程序中,我正在对数百万个文档建立索引,这些文档看起来有点像下面这样。

<book id="1234">
    <title>Quick Brown Fox</title>
    <year>1999</year>
    <isbn>309815</isbn>
    <author>Fred</author>
</book>

我正在编写一种查询语言,可以让我说YEAR = 1999 AND TITLE="Quick Brown Fox"(再次强调,只是为了我的学习,我不在乎我在重新发明轮子!)并且这应该返回匹配文档的 ID(1234在这种情况下)。这AND and OR表达式可以任意嵌套。

对于每个文档,我生成密钥如下

BOOK_TITLE.QUICK_BROWN_FOX = 1234
BOOK_YEAR.1999 = 1234

我在用着SADD http://redis.io/commands/sadd将这些文档放入以下形式的一系列集合中KEYNAME.VALUE = { REFS }.

当我进行查询时,我将表达式解析为 AST。一个简单的表达式,例如YEAR=1999直接映射到SMEMBERS http://redis.io/commands/smembers命令让我返回一组匹配的文档。但是,我不确定如何最有效地执行 AND 和 OR 部分。

给定一个查询,例如:

(TITLE=Dental Surgery OR TITLE=DIY Appendectomy)
    AND
(YEAR = 1999 AND AUTHOR = FOO)

我目前向 Redis 提出以下请求来回答这些查询。

-- Stage one generates the intermediate results and returns RANDOM_GENERATED_KEY3
SUNIONSTORE RANDOMLY_GENERATED_KEY1 BOOK_TITLE.DENTAL_SURGERY BOOK_TITLE.DIY_APPENDECTOMY
SINTERSTORE RANDOMLY_GENERATED_KEY2 BOOK_YEAR.1999 BOOK_YEAR.1998
SINTERSTORE RANDOMLY_GENERATED_KEY3 RANDOMLY_GENERATED_KEY1 RANDOMLY_GENERATED_KEY2

-- Retrieving the top level results just requires the last key generated
SMEMBERS RANDOMLY_GENERATED_KEY3

当我遇到一个AND I use 辛特商店 http://redis.io/commands/sinterstore基于两个子键(类似地OR I use 新联商城 http://redis.io/commands/sunionstore)。我随机生成一个密钥来存储结果(并设置一个短的 TTL,这样我就不会在 Redis 中填满垃圾)。在这一系列命令结束时,返回值是一个键,我可以用它来检索结果SMEMBERS http://redis.io/commands/smembers。我使用存储功能的原因是我不想将所有匹配的文档引用传输回服务器,因此我使用临时密钥将结果存储在 Redis 实例上,然后仅在以下位置返回匹配结果结束。

我的问题很简单,这是使用 Redis 作为文档存储的最佳方式吗?


我使用类似的方法和排序集来实现全文索引。总体方法很好,尽管您可以进行一些相当简单的改进。

  • 您可以使用查询(或其简短形式)作为密钥,而不是使用随机生成的密钥。这使您可以重用已计算的集合,如果您对通常以类似方式组合的两个大型集合进行查询,则可以显着提高性能。
  • 将标题作为完整字符串处理将导致大量的单个成员集。如果您确实需要的话,最好对标题中的各个单词进行索引并过滤最终结果以获得完全匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Redis 进行复合查询 的相关文章

  • 针对存储在 java.util.List 中的键/值对运行一系列论坛

    假设我有一个包含如下组件的列表 id 1 name Displacement value 200 id 2 name Time value 120 id 3 name Mass value 233 id 4 name Acceleratio
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • 是否有一个 nosql 存储也允许存储实体之间的关系?

    我正在寻找 nosql 键值存储 它还提供存储 维护存储实体之间的关系 我知道 Google App Engine 的数据存储允许实体之间拥有和不拥有的关系 任何流行的 nosql 商店都提供类似的东西吗 尽管它们中的大多数都是无模式的 但
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 字典键有字符限制吗?

    在 NET 中我可以使用任何字符串作为字典键吗 这是模板引擎的一部分 我计划允许用户添加他们的自定义标头和值 标题将类似于 X 的值 或 分析和 XYZ 报告摘要 我担心他们是否会在罕见字符或类似内容中遇到异常 我假设存在大小限制 但希望它
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 是否可以在 app.config 键值中包含超链接?

    是否可以将超链接作为 app config 键值对中文本的一部分 电子邮件正文文本作为值 我想从 app config 键值生成电子邮件正文 例如
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 使用 TypeScript / Angular2 循环对象的键/值[重复]

    这个问题在这里已经有答案了 如何使用 TypeScript 迭代对象并能够访问键和值 我的 json 对象看起来像这样 clients 123abc Forename Simon Surname Sample 456def Forename
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git

随机推荐

  • vue 上下文中的 getElementsByClassName

    在 vue js 的上下文中 getElementsByClassName 是如何工作的 我有下面的代码片段 目标是单击按钮并使用 vue js 方法将 h1 标签的颜色更改为绿色 div h1 class main header mess
  • 在 Spring 中启用 WebSocket 的跨源请求

    我有一个 OpenShift Wildfly 服务器 我正在建立一个网站Spring MVC框架 我的一个网页也使用 WebSocket 连接 在服务器端 我使用了 ServerEndpoint注释和javax websocket 库来创建
  • 无法使用xampp控制面板安装Tomcat

    我按照以下步骤成功安装了 xampp v3 2 1JetBrains 指南 http confluence jetbrains com display PhpStorm Installing and Configuring XAMPP wi
  • 在 JavaScript 中增加变量的其他方法[重复]

    这个问题在这里已经有答案了 可能的重复 为什么在 JavaScript 中避免递增 和递减 运算符 https stackoverflow com questions 971312 why avoid increment and decre
  • 调用deleteRowsAtIndexPaths时,具有自动调整单元格大小的UITableView变得不稳定

    我有一个带有自动调整单元格大小的 UITableView 表包含 1 个部分和一些行 我有一些行说 30 我想在期间删除行didSelectRowAtIndexPath 当我删除 tableview 底部附近的可用行 例如第 28 行 时
  • 为 Ruby 编写模块

    如何为 ruby 编写模块 在Python中你可以使用 module py def helloworld name print Hello s name main py import module module helloworld Jim
  • Dj Rest Auth 自定义注册不起作用

    I am using DJ REST AUTH for user registration API I want the first name and last name to show in the API endpoint howeve
  • 仅在没有错误的情况下编译 TeX 源并启动 PDF 的 Vim 脚本

    我正在改用 Vim 作为我的 LaTeX 编辑环境 我希望能够从 Vim 中解析源文件 并在编译成功时启动外部查看 我了解 Vim Latex 套件 但是 如果可能的话 我宁愿避免使用它 它相当重量级 劫持了lot我的钥匙 并且用大量文件弄
  • mysql 计入 PHP 变量

    假设我们有以下查询 SELECT DISTINCT COUNT users id FROM users table 此查询将返回表中的用户数量 我需要将此值传递给 PHP 变量 我正在使用这个 sql result mysql query
  • C#从串口读取数据

    我正在尝试从串行端口读取数据 数据脱离了规模 我首先发送一个命令来开始读取秤 serialPort Write P 然后等了一段时间后我尝试使用 temp2 serialPort ReadLine 应用程序挂在这行代码处 我也尝试过 Rea
  • Unix 域套接字如何区分多个客户端?

    TCP 具有元组对 IP 地址 端口 类型 来区分一个客户端和另一个客户端 UDP 传递客户端 IP 和端口 unix 域如何跟踪不同的客户端 换句话说 服务器创建一个绑定到某个路径 例如 tmp socket 的套接字 2 个或更多客户端
  • 使用 htaccess 禁止文本文件中的 IP [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我阅读并理解了如何使用 htaccess 阻止 ip order deny allow deny from 111 222 33 44
  • 使用 OAuth 通过本机客户端 (.Net) 访问受保护的 Google Apps 脚本 Web 服务

    我的 Net 客户端应用程序 Winform 允许用户使用浏览器控件在 Google 上进行身份验证 我能够在响应中检索 access token 我按照说明进行操作here https developers google com acco
  • Scala 2.10 中验证和扩展构造函数参数的最佳方法

    我想要一个具有许多字段 例如字符串 布尔值等 的类 并且在构造该类时 我想要一个与每个字段关联的字段名并验证该字段 使用字符串的正则表达式 理想情况下 我只想在构造函数中指定参数需要满足某些条件 一些示例代码 case class Data
  • 我可以在 bash shell 中对变量进行 for 循环吗?

    我正在学习 shell 我希望能够循环一些变量 我似乎找不到任何地方有人这样做过 所以我不确定这是否可能 基本上我只是想通过对每个变量使用相同的 sed 命令来省去自己的麻烦 但是该代码显然不起作用 我的问题是 是否可以循环变量 如果不能循
  • PHPExcel - 图表渲染和加载 Excel 给出错误

    require once PHPExcel 1 7 7 Classes PHPExcel php inputFileName RN Tracker xlsx inputFileType PHPExcel IOFactory identify
  • 将此 cURL 转换为 Guzzle

    我尝试阅读 Guzzle 文档 但我无法解决这个问题 我想使用 Guzzle 而不是 cURL 来执行以下操作 protected url https secure abcdef com cgi xml request server php
  • Javascript AOP 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪个 Javascript AOP 库 它的主要功能是什么 这是我到目前为止发现的 dotvoid
  • Angular 6/C#/MVC 以 Json Array of Array 的形式从控制器动态返回 JsonResult

    我正在尝试在 Angular 6 应用程序中将多个数据集导出到 Excel 为此 我使用 XLSX 和文件保存 如本例中所示 https medium com madhavmahesh exporting an excel file in
  • 使用 Redis 进行复合查询

    出于学习目的 我尝试在 Redis 中编写一个简单的结构化文档存储 在我的示例应用程序中 我正在对数百万个文档建立索引 这些文档看起来有点像下面这样