列车检索
车票搜索为什么用Redis而不是ES
ElasticSearch 是一款非常强大的开源搜索及分析引擎
而Redis是一个开源的内存数据结构存储系统
从实时性能来说,Redis 将数据存储在内存中,因此具有极低的读取延迟,可以快速响应实时查询请求。这对于需要即时更新的列车数据非常重要,确保用户能够获取到最新的车票信息。
从部署成本来说,Redis是一款轻量级的数据库,内存占用相对较低,可以在较小的硬件配置上运行。相比之下,ElasticSearch集群通常需要更多的资源投入,包括更高的硬件配置和更大的存储空间。
从搜索条件来说,虽然页面上有很多如车次类型、车次席别、出发车站、到达车站等检索条件,但这些都是在前端进行检索的。真正的查询条件只有出发地、目的地和出发日期,而Redis 的数据模型相对简单,这使得 Redis 适合存储一些搜索条件,如出发地、目的地,可以便快速筛选结果。
有没有提供检索功能,比如北京到杭州,要有北京西到杭州西,北京东到杭州东,北京西到杭州东?
前端传到后端的请求数据是出发城市,到达城市,及出发日期。
前请求数据先会经过责任链,检查相关数据是否为空或空的字符串,然后检查出发日期是否正确,出发到达地点是否存在
缓存中用Hash结构储存了两个城市的所有车次
key是火车号-出发站点-达到站点,比如1-北京南-杭州东,代表了由北京南站驶向杭州东站的1号火车。
value是这个车次的具体信息。
这个Hash结构的key是出发城市-到达城市
因此我们可以把北京(出发城市)杭州(到达城市)拼接在一起,然后在缓存中找这个Key对应的Hash结构,就能得到所有由北京(出发城市)驶向杭州(到达城市)的车次及车次部分信息。
如果缓存中没有车次集合信息,就要到数据库中找,用双重判定锁保证只有一个线程可以将数据库中相关信息加载到缓存中,避免多次查询给数据库带来巨大压力。
然后根据出发城市和到达城市,可以在火车站点关联表中查询所有相关的车次集合,
比如根据北京-杭州,可以得到1号火车-北京南站-杭州东站,3号火车-北京站-杭州站的两个车次。
然后遍历这个集合,从缓存或数据库中查找相关列车基本信息,并填充到车次集合中。
最后将这个车次集合加载到缓存中。
接下来就是查询列车余票信息并填充到车次基本信息中。
因为列车余票数据是实时变更的,如果存储到基本信息中,就没办法变更了,因此要单独存储。
遍历所有车次。
先在缓存中查这个车次的所有座位种类及对应的价格的集合
然后在缓存中找到所有座位种类对应的数量,然后将这个车次的每个座位种类,数量,价格封装成一个类,并加入集合中,然后将这个集合加入到这个车次基本信息中。
最后返回车次信息集合。