使用 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 进行复合查询 的相关文章

  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 使用redis进行树形数据结构

    我需要为基于树的键值开发一个缓存系统 与Windows注册表编辑器非常相似 其中缓存键是字符串 表示树中到值的路径 可以是原始类型 int string bool double 等 或子树本身 例如 key root x y z w val
  • Redis 队列工作程序在 utcparse 中崩溃

    我正在尝试按照以下教程获得基本的 rq 工作 https blog miguelgrinberg com post the flask mega tutorial part xxii background jobs https blog m
  • “应用程序配置”文件中的最大键/值长度

    允许的最大长度是多少MyKey and MyValue在配置文件中
  • 超出 Redis 连接/缓冲区大小限制

    在对我们的应用程序服务器进行压力测试时 我们从 Redis 中得到以下异常 ServiceStack Redis RedisException 无法连接到 redis host 6379 处的 redis 实例 gt System Net
  • 由于配置文件错误,无法启动 Redis 服务器

    我刚刚按照此处的说明安装了 Redis http redis io download http redis io download 当我运行 redis server redis conf 时出现以下错误 FATAL CONFIG FILE
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过
  • 使用 jq 过滤空值和/或 null 值

    我有一个包含 jsonlines 的文件 想找到空值 name Color TV price 1200 available name DVD player price 200 color null 并希望输出空和 或空值及其键 availa
  • 集合成员的 TTL

    Redis 是否可以不为特定键而是为集合的成员设置 TTL 生存时间 我正在使用 Redis 文档提出的标签结构 数据是简单的键值对 标签是包含与每个标签对应的键的集合 例如 gt SETEX id id 1 100 Lorem ipsum
  • 如何通过ARM模板输出返回Redis的primaryKey?

    我正在尝试借助下面列出的 ARM 模板来部署 Redis 然后返回其主密钥 Azure 门户中 Redis 的 访问密钥 gt 主 下可用的秘密字符串 但是 我从管道 AzureResourceManagerTemplateDeployme
  • Redis 是否使用用户名进行身份验证?

    我已经在我的环境中设置了Redis 并且只看到了通过密码授权的部分 有没有办法也设置用户名 还是只能通过密码验证 Redis 6 上有 ACL 这些都有一个用户名 查看https redis io topics acl https redi
  • 检查 Redis 列表中是否已存在某个值

    我想知道是否有办法检查 redis 列表中是否已存在某个键 我无法使用集合 因为我不想强制唯一性 但我确实希望能够检查字符串是否确实存在 Thanks 您的选择如下 Using LREM如果发现则更换它 维护一个单独的SET与您的LIST
  • 使用通配符查找键

    我已经使用分号保存了数据 redis gt keys party 1 party congress president 2 party bjp president 3 party bjp 4 party sena 是否有任何命令可以列出所有
  • redis能完全取代mysql吗?

    简单的问题 我是否可以使用 redis 而不是 mysql 来处理各种 Web 应用程序 社交网络 地理位置服务等 IT 领域没有什么是不可能的 但有些事情可能会变得极其复杂 将键值存储用于全文搜索之类的事情可能会非常痛苦 另外 据我所知
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Redis如何存储关联数组?设置、散列还是列表?

    我对 Redis 的所有可用存储选项有点困惑 我想做一些简单的事情 并且不想过度设计它 我正在与phpredis and Redis v2 8 6 我有一个需要存储的简单关联数组 我还需要能够通过其键检索项目并循环遍历所有项目 a arra

随机推荐

  • 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 中编写一个简单的结构化文档存储 在我的示例应用程序中 我正在对数百万个文档建立索引 这些文档看起来有点像下面这样