Redis里用小蚂蚁搞复杂条件查找,真没想到这么灵活还能这么简单
- 问答
- 2025-12-30 05:31:09
- 1
(根据“小蚂蚁架构笔记”公众号文章内容整理)
那天看同事在那折腾Redis的查询,眉头皱得能夹死苍蝇,我凑过去一看,好家伙,他正在试图用Redis的原生命令实现一个挺复杂的用户筛选功能,要找出“最近一周内登录过、年龄在20到30岁之间、且标签包含‘篮球’和‘科技’的所有用户”,这要是在关系型数据库里,一句SQL的WHERE条件就搞定了,但在Redis这种键值存储里,他得不停地取交集、并集,还要处理各种临时键,代码写得又长又容易出错。
他抱怨说:“Redis做这种复杂查找真是太麻烦了,要不是图它快,真不想这么折腾。”我当时就乐了,跟他说:“你这是还用着石器时代的工具干信息时代的活儿啊,试试用蚂蚁集团开源的Redis模块,叫RedisSearch,人家内部都管这叫‘小蚂蚁’,专门治你这毛病。”
他一脸怀疑:“Redis还能装模块?复杂查询?不可能吧,不就是个缓存吗?”
我给他解释,此一时彼一时了,现在的Redis早就不是简单的Key-Value存储了,这个RedisSearch模块,相当于给Redis装上了一颗强大的搜索引擎心脏,它允许你像创建数据库表一样,在Redis里定义索引(Index),告诉你哪些字段需要被检索,是数字型的还是文本型的。
具体怎么玩呢?非常简单,你不用再像以前那样,费尽心思去设计复杂的键名了,比如存用户信息,以前你可能得弄成user:123:profile这样的键,值里面存个JSON,你可以直接把这个JSON文档(或者Hash结构)往Redis里一扔,只要这个文档的结构跟你事先定义好的索引对得上,RedisSearch就会自动为里面的指定字段建立索引。
针对他那个需求,我们可以先创建一个索引,告诉RedisSearch:请帮我索引“last_login_time”(最后登录时间,数字类型,用于范围查询)、“age”(年龄,数字类型)还有“tags”(标签,文本类型,支持多标签),创建索引的命令也很直白,就是FT.CREATE,后面跟着索引名和字段定义。
索引建好了,接下来就是往Redis里存数据了,这个和平时没啥两样,还是用HSET命令往Hash里写用户的各个字段值。
最神奇的部分来了——查询,当你想做那种复杂的多条件筛选时,再也不用手动计算集合的交并差了,RedisSearch提供了一条强大的查询命令FT.SEARCH,你可以像写搜索引擎的查询语句一样,写一个很直观的查询字符串。
要解决我同事的那个难题,查询语句大概会长这样:“@last_login_time:[1696982400 +inf] @age:[20 30] @tags:{篮球} @tags:{科技}”,我来稍微“翻译”一下:
@last_login_time:[1696982400 +inf]意思是最后登录时间大于等于某个时间戳(这里1696982400代表一周前)。@age:[20 30]就是年龄在20到30岁之间。@tags:{篮球} @tags:{科技}表示标签必须同时包含“篮球”和“科技”。
你把这条查询语句扔给FT.SEARCH命令,它瞬间就能把符合所有条件的结果给你返回回来,又快又准,这简直就像是在Redis里用上了SQL的WHERE子句,而且还是带倒排索引加速的,速度比很多关系型数据库的模糊查询快得多。
我同事听完,眼睛都亮了:“这不就是我想要的吗?这也太简单了!原来‘小蚂蚁’这么给力!”他之前那些繁琐的代码一下子就可以扔掉了。
除了这种精确匹配和范围查询,RedisSearch还支持很多高级功能。
- 模糊查询和前缀查询:你想找名字里带“张”的用户,可以写
@name:张*。 - 全文检索:可以对文本字段进行分词搜索,比如搜索“苹果手机”,它能帮你找到包含“苹果”和“手机”的文档,就跟百度搜索一样。
- 排序和分页:查询结果可以按照某个字段排序,并且轻松实现分页效果。
- 聚合统计:还能对结果进行分组统计,比如统计每个年龄段的用户有多少人。
所以说,觉得Redis只能做简单Key-Value查询,那真是老黄历了,通过RedisSearch这个“小蚂蚁”模块,我们完全可以在享受Redis极致速度的同时,获得堪比专业搜索引擎的复杂查询能力,它把复杂的索引维护和查询逻辑都封装在了模块内部,给我们暴露出来的却是极其简单易用的API,这种“内核强大,接口简单”的设计,让处理复杂业务场景变成了一件轻松愉快的事情,以后再遇到在Redis里做复杂查找的需求,可别再吭哧吭哧地手动操作集合了,试试这只灵活的“小蚂蚁”,你会发现新大陆的。

本文由盈壮于2025-12-30发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/71081.html
