简介: 互联网及传统行业应用服务的要害数据个别存储在MySQL这类的关系型数据库中。如需缓解数据库拜访压力,可引入Redis等缓存零碎承当热数据的查问,以此晋升查问效力。然而业务场景如果是在数据库上做随便多列组合索引查问或者like含糊匹配查问,应用一般的KV缓存零碎并不能齐全承载住,往往须要引入lua或者内部计算等额定的联结查问匹配过滤机制。TairSearch是一个实时全内存检索服务,其外围的倒排索引互联网及传统行业应用服务的要害数据个别存储在MySQL这类的关系型数据库中。如需缓解数据库拜访压力,可引入Redis等缓存零碎承当热数据的查问,以此晋升查问效力。然而业务场景如果是在数据库上做随便多列组合索引查问或者like含糊匹配查问,应用一般的KV缓存零碎并不能齐全承载住,往往须要引入lua或者内部计算等额定的联结查问匹配过滤机制。TairSearch是一个实时全内存检索服务,其外围的倒排索引机制既能满足词根的含糊匹配查问,且可作为热数据存算一体减速任意多列组合索引的联结查问效率。本文将论述TairSearch如何反对以上场景。KV缓存在多列灵便查问场景的局限性设计关系型数据库表时,除可设置主键索引,还能够设置多个二维索引,以及多种联结索引。应用KV缓存服务时,以Redis为例,个别应用Hash构造映射关系型数据库字段。将数据库表中的行记录导入到Redis的Hash构造中,以行中主键字段的值作为Redis hash的key,其余字段名作为hash的field,行字段的值作为hash的value。如果查问场景只波及主键索引,在Redis中能够间接通过hmget的形式获取到行中指定字段的信息。但在以下场景中则有显著的局限性:查问波及二维索引,Redis中并不反对按hash中的field内容来查问,只能通过在Redis中再用Hash存储关系型数据库中的二维索引。不仅减少导入行数据的复杂程度,也因为冗余数据造成内存空间的收缩。查问波及联结索引,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 毫秒级增加索引字段,业务无感知。 tft.createindex zhuhai_hangzhou '{

"mappings":{    "properties":{        "departure":{            "type":"keyword"        },        "destination":{            "type":"keyword"        },        "date":{            "type":"keyword"        },        "seat":{            "type":"keyword"        },        "with":{            "type":"keyword"        },        "flight_id":{            "type":"keyword"        },        "price":{            "type":"double"        },        "departure_time":{            "type":"long"        },        "destination_time":{            "type":"long"        }    }}

}'将航班信息依照以上字段整顿成文档写入到TairSearch中。tft.adddoc zhuhai_hangzhou '{

"departure":"zhuhai","destination":"hangzhou","date":"2022-09-01","seat":"first","with":"baby","flight_id":"CZ1000","price":986.1,"departure_time":1661991010,"destination_time":1661998210

}'搜寻头等舱的航班且依照航班的登程工夫排序:tft.search zhuhai_hangzhou '{

"sort":[    "departure_time"],"query":{    "bool":{        "must":[            {                "term":{                    "date":"2022-09-01"                }            },            {                "term":{                    "seat":"first"                }            }        ]    }}

}'应用带use_cache的形式拜访能够开启query cache的性能,query_cache的有效期是10s,能够对热点航班自带查问后果的热点缓存性能。模仿随机写入10天内zhuhai_hangzhou有80个航班,且每个航班有6种配置的价格,压测查问的性能数据:redis-benchmark -r 1 -n 500000 tft.search zhuhai_hangzhou '{"sort":["departure_time"], "query":{"bool":{"must":[{"term":{"date":"2022-09-01"}},{"term":{"seat":"first"}}]}}}'
100.00% <= 3 milliseconds
20592.23 requests per second开启query_cache: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
100.00% <= 2 milliseconds
58920.57 requests per second结语TairSearch集缓存与计算于一体的全内存实时全文检索零碎,可减速传统关系型数据多列组合查问效率。欢送大家应用TairSearch产品,任何产品意见和更多的场景需要均可反馈给咱们,TairSearch产品技术服务仍在继续迭代欠缺,期待您的参加。附TairSearch API文档原文链接:https://click.aliyun.com/m/10...本文为阿里云原创内容,未经容许不得转载。