怎样基于Redis实现模糊查询

发布于 2022-09-02 10:51:13 字数 411 浏览 28 评论 0

问题如题,注意不是指模糊查询Key,是指对值的模糊(关键字)查询。
举个栗子:

$ HMSET user:1 name jack age 18
$ HMSET user:2 name jackson age 21
$ HMSET user:3 name suse age 16

假如有上述用户数据,以哈希形式存储,如果要做排序,可以

# score为#age,value为#userId,以ZSET结构存储
$ ZADD user:rank:age 18 1 21 2 16 3
# 查询有序列表
$ ZRANGE user:rank:age 0 -1

但如果需要既实现根据年龄排序,还要能够实现关键字查询(模糊匹配用户名),应该怎样实现?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

左岸枫 2022-09-09 10:51:13

有一种变通的方法,一定程度上可以实现简单、小数据量的模糊查询:
写入用户信息时,将用户名分拆作为Key,来记录用户ID

SADD user:like:j jack jackson
SADD user:like:ja jack jackson
SADD user:like:jac jack jackson
SADD user:like:jack jack jackson
SADD user:like:jacks jackson
SADD user:like:jackso jackson
SADD user:like:jackson jackson

后面模糊查询时,输入:j,则可以从SET集合中查出jackjackson两项,当然,这两项值可以用用户ID来代替,再根据用户ID来查询用户哈希信息。
此方式仅适用于查询条件单一、且字段长度较短场景,如果:同时模糊匹配帖子标题和帖子文章,就不行了,标题还能试试,内容肯定无法实现的。

当然Redis先天不适合做这件事,所以有别的方案,还是建议用别的方案来实现。

暗喜 2022-09-09 10:51:13

委婉的方式是自己写lua脚本。
或者数据集不大的情况下自己在客户端过滤。
如果模糊查询是硬需求,建议转移到solr或elasticsearch来做。

半世蒼涼 2022-09-09 10:51:13

Redis 没有那么丰富的查询方法, 模糊查询也只能在 key 中进行,并不能满足你这么丰富的需求。如果要高速存储建议使用 Redis, 如果是想进行业务逻辑,要有丰富的查询方式,建议使用MongoDb

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文