Redis中怎么实现数据库查询?有哪些新进展和挑战?

文章导读
Redis 实现数据库查询主要依赖其丰富的数据结构,如 String、List、ZSet 和 Hash 等。对于基础查询,通过 Key 直接获取 Value;对于分页和排序,常用 ZSet 的 score 机制或 List 的索引范围;对于复杂多条件及模糊查询,原生支持有限,需借助 RediSearch 模块或客户端二次处理。新进展方面,RediSearch 提供了全文索引、布尔查询及地理过滤等功
📋 目录
  1. Redis 高级玩法:从分页到多条件查询,这一篇全搞定!_redis 按条件分页查询-CSDN 博客
  2. 换掉 ES!Redis 官方搜索引擎来了,性能炸裂!
  3. Redis 如何实现分页 + 多条件模糊查询?答案来了
  4. 【Redis】利用 Redis List 实现数据库分页快速查询
  5. 使用 Redis 实现一个轻量级的搜索引擎,牛逼啊 !
  6. FAQ
A A

Redis 实现数据库查询主要依赖其丰富的数据结构,如 String、List、ZSet 和 Hash 等。对于基础查询,通过 Key 直接获取 Value;对于分页和排序,常用 ZSet 的 score 机制或 List 的索引范围;对于复杂多条件及模糊查询,原生支持有限,需借助 RediSearch 模块或客户端二次处理。新进展方面,RediSearch 提供了全文索引、布尔查询及地理过滤等功能,性能显著优于传统方案。挑战在于内存成本控制、复杂查询的逻辑实现以及数据一致性维护,特别是在高并发场景下需权衡缓存与持久化数据库的配合使用。

Redis 高级玩法:从分页到多条件查询,这一篇全搞定!_redis 按条件分页查询-CSDN 博客

Redis 是一个高效的内存数据库,它支持包括 String、List、Set、SortedSet 和 Hash 等数据类型的存储,在 Redis 中通常根据数据的 key 查询其 value 值,Redis 没有模糊条件查询,在面对一些需要分页、排序以及条件查询的场景时 (如评论,时间线,检索等),只凭借 Redis 所提供的功能就不太好不处理了。默认你了解 Redis 的特性,这里不做过多的描述了。由于之前基于业务问题需要实现基于 Redis 的条件查询和分页功能,在百度上查询了不少文章,基本不是只有分页功能就是只有条件查询功能的实现,缺少两者组合的解决方案。1、Redis 的分页实现 我们通常习惯于在 Mysql、Oracle 这样持久化数据库中实现分页查询,但是基于某些特殊的业务场景下,我们的数据并未持久化到了数据库中或是出于查询速度上的考虑将热点数据加载到了缓存数据库中。因此,我们可能需要基于 Redis 这样的缓存数据库去进行分页查询。Redis 的分页查询的实现是基于 Redis 提供的 ZSet 数据结构实现的,ZSet 全称为 Sorted Set,该结构主要存储有序集合。下面是它的指令描述以及该指令在分页实现中的作用:ZADD:SortedSet 的添加元素指令 ZADD key score member [[score,member]…]会给每个添加的元素 member 绑定一个用于排序的值 score,SortedSet 就会根据 score 值的大小对元素进行排序。我们为通常习惯于将数据的时间属性当作 score 用于排序,当然大家也可以根据具体的业务场景去选择排序的目标。ZREVRANGE:SortedSet 中的指令 ZREVRANGE key start stop 可以返回指定区间内的成员,可以用来做(来自 2025 年 10 月 22 日的资料)

换掉 ES!Redis 官方搜索引擎来了,性能炸裂!

1、介绍 RediSearch 是一个 Redis 模块,为 Redis 提供查询、二次索引和全文搜索。要使用 RediSearch,首先要在 Redis 数据上声明索引。然后可以使用重新搜索查询语言来查询该数据。RedSearch 使用压缩的反向索引进行快速索引,占用内存少。RedSearch 索引通过提供精确的短语匹配、模糊搜索和数字过滤等功能增强了 2、实现特性 基于文档的多个字段全文索引 高性能增量索引 文档排序 (由用户在索引时手动提供) 在子查询之间使用 AND 或 NOT 操作符的复杂布尔查询 可选的查询子句 基于前缀的搜索 支持字段权重设置 自动完成建议 (带有模糊前缀建议) 精确的短语搜索 在许多语言中基于词干分析的查询扩展 支持用于查询扩展和评分的自定义函数 将搜索限制到特定的文档字段 数字过滤器和范围 使用 Redis 自己的地理命令进行地理过滤 Unicode 支持 (需要 UTF-8 字符集) 检索完整的文档内容或只是 ID 的检索 支持文档删除和更新与索引垃圾收集 支持部分更新和条件文档更新 对比 Elasticsearch 如下图所示,RediSearch 构建索引的时间为 221 秒,而 Elasticsearch 为 349 秒,快了 58%。索引构建测试 我们模拟了一个多租户电子商务应用程序,其中每个租户代表一个产品类别并维护自己的索引。对于此基准测试,我们构建了 50K 个索引 (或产品),每个索引最多存储 500 个文档 (或项目),总共 2500 万个文档。RediSearch 仅用了 201 秒就构建了索引,平均每秒运行 125K 个索引。然而,Elasticsearch 在 921 个索引后崩溃了,显然它不是为应对这种负载而设计的。查询性能测试 一旦数据集被索引,我们就使用在专用负载生成器服务器上运行的 32 个客户端启动两个单词的搜索查询。如下图所示,RediSearch 吞吐量达到了 12.5K 操作/秒,而 Elasticsearch 为 3.1K 操作/秒,速度提高了 4 倍。此外,RediSearch 延迟稍好一些,平均为 8 毫秒,而 Elasticsearch 为 10 毫秒。(资料日期为 2024 年 3 月 26 日)

Redis 如何实现分页 + 多条件模糊查询?答案来了

Redis 是一个高效的内存数据库,它支持包括 String、List、Set、SortedSet 和 Hash 等数据类型的存储,在 Redis 中通常根据数据的 key 查询其 value 值,Redis 没有模糊条件查询,在面对一些需要分页、排序以及条件查询的场景时 (如评论,时间线,检索等),只凭借 Redis 所提供的功能就不太好不处理了。本文不对 Redis 的特性做过多赘述。由于之前基于业务问题需要实现基于 Redis 的条件查询和分页功能,在百度上查询了不少文章,基本不是只有分页功能就是只有条件查询功能的实现,缺少两者组合的解决方案。因此,本文将基于 Redis 提供条件查询 + 分页的技术解决方案。注:本文只提供实现思路,并不提供实现的代码 本文将从四个部分进行说明:分页实现 模糊条件查询实现 分页和模糊条件查询的组合实现 优化方案 大家可以直接跳到自己需要的部分进行阅读。Redis 的分页实现 我们通常习惯于在 Mysql、Oracle 这样持久化数据库中实现分页查询,但是基于某些特殊的业务场景下,我们的数据并未持久化到了数据库中或是出于查询速度上的考虑将热点数据加载到了缓存数据库中。因此,我们可能需要基于 Redis 这样的缓存数据库去进行分页查询。Redis 的分页查询的实现是基于 Redis 提供的 ZSet 数据结构实现的,ZSet 全称为 Sorted Set,该结构主要存储有序集合。下面是它的指令描述以及该指令在分页实现中的作用:ZADD:SortedSet 的添加元素指令 ZADD key score member [[score,member]…]会给每个添加的元素 member 绑定一个用于排序的值 score,SortedSet 就会根据 score 值的大小对元素进行排序。我们为通常习惯于将数据的时间属性当作 score 用于排序,当然大家也可以根据具体的业务场景去选择排序的目标。ZREVRANGE:SortedSet 中的指令 ZREVRANGE key start stop 可以返回指定区间内的成员,可以用来做分页。ZREM:SortedSet 的指令 ZREM key member 可以根据 key 移除指定的成员,能满足删评论的要求。所以 SortedSet 用来做分页是非常适合的。下面是分页实现的演示图,包含插入新记录后的查询情况。事实上,Redis 中的 List 结构也是可以实现分页,但 List 无法实现自动排序,并且 Zset 还可以根据 score 进行数据筛选,取出目标 score 区间内数据。所以在实现上,ZSet 往往更加适合我们。当然如果你需要插入重复数据的情况下,分页就可能就需要借助 List 来实现了。具体使用那种结构来实现分页还是需要根据实际的业务场景来进行选择的。(该信息的时间戳是 2024 年 6 月 5 日)

【Redis】利用 Redis List 实现数据库分页快速查询

在大规模数据存储和查询的应用中,数据库分页查询是一个常见的需求。传统的数据库分页查询可能会因为数据量大而导致性能下降,为了解决这个问题,我们可以借助 Redis 的 List 数据结构,实现高效的数据库分页查询。本文将介绍如何利用 Redis List 来提升数据库分页查询的性能,以及具体的实现步骤和注意事项。一、背景介绍:数据库分页查询是在大量数据中提取出部分数据显示在页面上的常见操作。然而,在数据量庞大的情况下,传统的数据库分页查询可能会变得效率低下。为了解决这个问题,我们可以引入 Redis,一款高性能的缓存数据库,通过其 List 数据结构来加速分页查询。二、Redis List 简介:Redis List 是一个简单的链表数据结构,它允许我们在链表的两端进行快速的插入和删除操作。这种特性使得 List 非常适合用来存储分页数据,同时提供了快速访问第一页和最后一页的能力。三、利用 Redis List 实现分页查询:数据存储结构设计:在 Redis 中,我们可以使用一个 List 来存储整个数据集,每个元素表示数据库中的一条记录。同时,为了实现分页查询,我们可以维护一个有序集合 (Sorted Set) 来存储记录的索引信息,例如每条记录的 ID。这样,我们可以通过有序集合来快速定位记录在 List 中的位置。分页查询算法:客户端请求分页数据。通过有序集合快速获取分页的记录 ID 范围。使用 List 的命令获取相应 ID 范围的记录。将查询结果返回给客户端。四、实现步骤:数据存储:将数据存储在 Redis 的 List 中,并在有序集合中存储记录的索引。分页查询:根据用户请求的页码和每页数量,计算出在有序集合中的索引范围,然后通过 List 命令获取相应的记录。例如,如果我们想要获取第 21 到第 30 条记录,我们可以执行以下命令:这将返回指定范围内的数据,而不需要执行昂贵的偏移操作。(2024 年 2 月 21 日的资料)

Redis中怎么实现数据库查询?有哪些新进展和挑战?

使用 Redis 实现一个轻量级的搜索引擎,牛逼啊 !

大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不用说了 (不知各位有没有这种感受呢~)。下面以一个例子开始,这是某购物网站的搜索条件,如果让你实现这样的一个搜索接口,你会如何实现?(当然你说借助搜索引擎,像 Elasticsearch 之类的,你完全可以实现。但我这里想说的是,如果要你自己实现呢?) 必备技能!聊聊二维码扫码登录的原理 从上图中可以看出,搜索总共分为 6 大类,每大类中又分了各个子类。这中间,各大类条件之间是取的交集,各子类中有单选、多选、以及自定义的情况,最终输出符合条件的结果集。好了,既然需求很明确了,我们就开始来实现。实现 1 率先登场是小 A 同学,他是写 SQL 方面的“专家”。小 A 信心满满的说:“不就是一个查询接口吗?看着条件很多,但凭着我丰富的 SQL 经验,这点还是难不倒我的。”于是乎就写出了下面这段代码 (这里以 MYSQL 为例): 代码语言:javascript AI 代码解释 selectfrom table_1 left join table_2 left join table_3 leftjoin(selectfrom table_x where)tmp_1whereorder bylimit m,n 代码在测试环境跑了一把,结果好像都匹配上了,于是准备上预发。这一上预发,问题就开始暴露出来。预发为了尽可能的逼真线上环境,所以数据量自然而然要比测试大的多。所以这么一个复杂的 SQL,它的执行效率可想而知。测试同学果断把小 A 的代码给打了回来。实现 2 总结了小 A 失败的教训,小 B 开始对 SQL 进行了优化,先是通过了 explain 关键字进行 SQL 性能分析,对该加索引的地方都加上了索引。同时将一条复杂 SQL 拆分成了多条 SQL,计算结果在程序内存中进行计算。伪代码如下:代码语言:javascript AI 代码解释 $result_1=query('select from table_1 where ');$result_2=query('select from table_2 where ');$result_3=query('select from table_3 where ');$result=array_intersect($result_1,$result_2,$result_3,);(撰于 2023 年 4 月 4 日)

FAQ

Redis 原生支持模糊查询吗?

不支持,Redis 原生主要基于 Key 查询,模糊查询需借助 RediSearch 模块或客户端二次处理。

Redis中怎么实现数据库查询?有哪些新进展和挑战?

如何实现高效分页?

推荐使用 ZSet 结构基于 score 排序分页,或结合 List 与 Sorted Set 实现快速定位。

RediSearch 相比 Elasticsearch 有何优势?

索引构建更快,查询吞吐量更高,延迟更低,且内存占用更少,适合高性能场景。