• TairSearch:加速多列索引查询


    互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中。如需缓解数据库访问压力,可引入Redis等缓存系统承担热数据的查询,以此提升查询效能。然而业务场景如果是在数据库上做随意多列组合索引查询或者like模糊匹配查询,使用普通的KV缓存系统并不能完全承载住,往往需要引入lua或者外部计算等额外的联合查询匹配过滤机制。TairSearch是一个实时全内存检索服务,其核心的倒排索引机制既能满足词根的模糊匹配查询,且可作为热数据存算一体加速任意多列组合索引的联合查询效率。本文将阐述TairSearch如何支持以上场景。

    KV缓存在多列灵活查询场景的局限性

    设计关系型数据库表时,除可设置主键索引,还可以设置多个二维索引,以及多种联合索引。
    使用KV缓存服务时,以Redis为例,一般使用Hash结构映射关系型数据库字段。
    将数据库表中的行记录导入到Redis的Hash结构中,以行中主键字段的值作为Redis hash的key,其他字段名作为hash的field,行字段的值作为hash的value。如果查询场景只涉及主键索引,在Redis中可以直接通过hmget的方式获取到行中指定字段的信息。但在以下场景中则有明显的局限性:

    1. 查询涉及二维索引,Redis中并不支持按hash中的field内容来查询,只能通过在Redis中再用Hash存储关系型数据库中的二维索引。不仅增加导入行数据的复杂程度,也因为冗余数据造成内存空间的膨胀。
    2. 查询涉及联合索引,Redis中并不支持对Hash类型的多key联合查询,用户侧只能在外部或者lua脚本中实现联合查询过滤规则,涉及到了数据的读取和挪动。

    下文以支撑流量洪峰时期的机票搜索服务为例,讲述如何使用TairSearch加速任意多列组合索引的联合查询效率。

    使用TairSearch加速多列组合索引的联合查询

    以某机票搜索界面为模板,可以看到精准搜索机票涉及到几个关键条件:出发地、目的地、日期、经济/公务/头等舱、带儿童、带婴儿。查询结果带有多个航班信息。在暑期、国庆、春节等中长假期时间内,对热门旅游度假区的航班查询容易造成流量洪峰。

    TairSearch如何支持这类的热门航旅查询需求?

    TairSearch中存储所有待飞的航班信息,已航班的出发地departure 、 目的地destination 拼接作为keydeparture_destination 。因为航班中多个出发地_目的地在搜索航班中并无关联关系,所以key是相互独立的,可直接使用Tair分布式的集群架构存储,进一步提升并行查询能力。

    出发地departure 、目的地destination 、日期date 、经济/公务/头等舱seat 、带儿童/带婴儿with 这几个字段建立索引。同时带有航班号flight_id 、价格price 、起飞时间departure_time 、降落destination_time 。如后期需要加字段,可直接使用tft.updateindex 毫秒级添加索引字段,业务无感知。

    1. tft.createindex zhuhai_hangzhou '{
    2. "mappings":{
    3. "properties":{
    4. "departure":{
    5. "type":"keyword"
    6. },
    7. "destination":{
    8. "type":"keyword"
    9. },
    10. "date":{
    11. "type":"keyword"
    12. },
    13. "seat":{
    14. "type":"keyword"
    15. },
    16. "with":{
    17. "type":"keyword"
    18. },
    19. "flight_id":{
    20. "type":"keyword"
    21. },
    22. "price":{
    23. "type":"double"
    24. },
    25. "departure_time":{
    26. "type":"long"
    27. },
    28. "destination_time":{
    29. "type":"long"
    30. }
    31. }
    32. }
    33. }'

    将航班信息按照以上字段整理成文档写入到TairSearch中。

    1. tft.adddoc zhuhai_hangzhou '{
    2. "departure":"zhuhai",
    3. "destination":"hangzhou",
    4. "date":"2022-09-01",
    5. "seat":"first",
    6. "with":"baby",
    7. "flight_id":"CZ1000",
    8. "price":986.1,
    9. "departure_time":1661991010,
    10. "destination_time":1661998210
    11. }'

    搜索头等舱的航班且按照航班的出发时间排序:

    1. tft.search zhuhai_hangzhou '{
    2. "sort":[
    3. "departure_time"
    4. ],
    5. "query":{
    6. "bool":{
    7. "must":[
    8. {
    9. "term":{
    10. "date":"2022-09-01"
    11. }
    12. },
    13. {
    14. "term":{
    15. "seat":"first"
    16. }
    17. }
    18. ]
    19. }
    20. }
    21. }'

    使用带use_cache的方式访问可以开启query cache的功能,query_cache的有效期是10s,可以对热点航班自带查询结果的热点缓存功能。
    模拟随机写入10天内zhuhai_hangzhou有80个航班,且每个航班有6种配置的价格,压测查询的性能数据:

    1. redis-benchmark -r 1 -n 500000 tft.search zhuhai_hangzhou '{"sort":["departure_time"], "query":{"bool":{"must":[{"term":{"date":"2022-09-01"}},{"term":{"seat":"first"}}]}}}'
    2. 100.00% <= 3 milliseconds
    3. 20592.23 requests per second

    开启query_cache:

    1. redis-benchmark -r 1 -n 500000 tft.search zhuhai_hangzhou '{"sort":["departure_time"], "query":{"bool":{"must":[{"term":{"date":"2022-09-01"}},{"term":{"seat":"first"}}]}}}' use_cache
    2. 100.00% <= 2 milliseconds
    3. 58920.57 requests per second

    结语

    TairSearch集缓存与计算于一体的全内存实时全文检索系统,可加速传统关系型数据多列组合查询效率。欢迎大家使用TairSearch产品,任何产品意见和更多的场景需求均可反馈给我们,TairSearch产品技术服务仍在持续迭代完善,期待您的参与。附TairSearch API文档

    原文链接

    本文为阿里云原创内容,未经允许不得转载。

  • 相关阅读:
    关于前面介绍过的MPCC控制改为使用Yalmip解算器解以及MPC控制的一点想法
    塔罗分析笔记--权杖家族
    【动力节点】最新rabbitmq笔记-1-6章What is RabbitMQ?
    java毕业设计LIS检验系统2021mybatis+源码+调试部署+系统+数据库+lw
    SpringBoot+Redis BitMap 实现签到与统计功能
    Linux常用命令——builtin命令
    Sqoop环境搭建
    初识TOML-配置文件格式
    Linux--基础IO(上)
    flink集群搭建
  • 原文地址:https://blog.csdn.net/yunqiinsight/article/details/126407784