V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fuxinya
V2EX  ›  程序员

反向查询问题

  •  
  •   fuxinya · 2019-01-26 14:45:24 +08:00 · 2170 次点击
    这是一个创建于 2126 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现有一个需求,根据某用户的信息反过来匹配宿主。
    现要根据用户的个人资料来匹配这些宿主,将个人资料符合宿主规则的所有宿主查询出来

    例如:宿主 A 设置了匹配规则:性别为男的,且年龄小于 20,宿主 B 匹配规则:性别为女的,且年龄小于 20
    用户张三性别为女,年龄 18,则搜索结果: [宿主 B]

    PS:这个查询很频繁,使用 sql 查询是否还可行?我目前把宿主存在 redis 缓存里面,但是查询时遇到瓶颈,平时都是正着查,现在反着来不知道怎么办了
    匹配规则还有很多,上面只是举例两个
    8 条回复    2019-01-26 15:55:40 +08:00
    lhx2008
        1
    lhx2008  
       2019-01-26 14:49:44 +08:00 via Android
    规则存的时候存规范一点可以直接用 mysql 查,效率应该还凑合吧
    momocraft
        2
    momocraft  
       2019-01-26 14:55:01 +08:00
    宿主...第一眼看到以爲是星際

    如果簡單對 M 個用戶各用(N 個宿主)的規則查一遍 就需要 M*N 嗎?
    fuxinya
        3
    fuxinya  
    OP
       2019-01-26 14:58:00 +08:00
    @momocraft 是的啊,因为用户自己设置的信息不全相同,匹配出来结果列表也不一样
    lincanbin
        4
    lincanbin  
       2019-01-26 15:11:30 +08:00 via Android
    看量级和一致性要求了,规则复杂的话用 elasticsearch 比较好。
    如果量级不大、对实时性没有很高要求、表的写操作也不频繁,可以再维护一个 memory 引擎的 mysql 表,所有查询在里面做。
    fuxinya
        5
    fuxinya  
    OP
       2019-01-26 15:17:53 +08:00
    @lincanbin 感谢回复,数据量级不大,但实时性要求高,我试试 memory 引擎效果怎么样。
    Immortal
        6
    Immortal  
       2019-01-26 15:39:09 +08:00   ❤️ 1
    其实我觉得 mysql 就可以了
    但给你另外一个思路 -- Redis 集合交集
    每种规则一个 redis 的集合,集合内是用户唯一 id
    比如 性别女是规则 A 年龄 20 以下是 B
    然后需要查询 20 岁以下的女性: SINTER A B
    Immortal
        7
    Immortal  
       2019-01-26 15:43:18 +08:00
    仔细看了下不就是个差集问题么
    宿主 A 和 B 的匹配项都筛选出唯一 id 然后取交集就好了
    没必要想纯粹用 sql 解决 结果用代码处理下很快的
    fuxinya
        8
    fuxinya  
    OP
       2019-01-26 15:55:40 +08:00
    @Immortal 感谢回复,SINTER 是个解决办法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:16 · PVG 23:16 · LAX 07:16 · JFK 10:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.