其他
使用 Redis 实现一个轻量级的搜索引擎
顶级架构师后台回复 1024 有特别礼包
作者:jasonGeng88
来源:github.com/jasonGeng88/blog
上一篇:国产最强开源 API 网关,没有之一,不接受任何反驳!
场景
实现1
率先登场是小A同学,他是写 SQL 方面的“专家”。小A信心满满的说:“不就是一个查询接口吗?看着条件很多,但凭着我丰富的 SQL 经验,这点还是难不倒我的。”
于是乎就写出了下面这段代码(这里以 MYSQL 为例):
select ... from table_1
left join table_2
left join table_3
left join (select ... from table_x where ...) tmp_1
...
where ...
order by ...
limit m,n
explain
关键字进行SQL性能分析,对该加索引的地方都加上了索引。同时将一条复杂SQL拆分成了多条SQL,计算结果在程序内存中进行计算。$result_1 = query('select ... from table_1 where ...');
$result_2 = query('select ... from table_2 where ...');
$result_3 = query('select ... from table_3 where ...');
...
$result = array_intersect($result_1, $result_2, $result_3, ...);
这种方案从性能上明显比第一种要好很多,可是在功能验收的时候,产品经理还是觉得查询速度不够快。
小B自己也知道,每次查询都会向数据库查询多次,而且有些历史原因,部分条件是做不到单表查询的,所以查询等待的时间是避免不了的。
子类单选:直接根据条件 key,获取对应结果集; 子类多选:根据多个条件 Key,进行并集操作,获取对应结果集; 最终结果:将获取的所有子类结果集进行交集操作,得到最终结果;
ZRANGEBYSCORE
命令,根据分数(价格)区间,获取相应结果集。扩展
分页
ZINTERSTORE
命令,赋结果集权重为0,商品时间结果为1,取交集而得的结果集赋予创建时间分值的新有序集合。对新结果集的操作即能得到分页所需的各个数据:页面总数为: ZCOUNT
命令当前页内容: ZRANGE
命令若以倒序排列: ZREVRANGE
命令
数据更新
性能优化
MULTI
命令,开启一个事务,将 Redis 的多次操作放在一个事务中,最后通过EXEC
来进行原子性执行(注意:这里所谓的事务,只是将多个操作在一次连接中执行,如果执行过程中遇到失败,是不会回滚的)「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。
扫描添加好友邀你进架构师群,加我时注明【姓名+公司+职位】
版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
猜你还想看
建设微服务API网关的一些实践
详解MQ消息队列及四大主流MQ的优缺点
阿里技术专家:一文教你高效画出技术架构图
推荐 18 个终端命令行工具