如何快速实现高并发短文检索
原文地址:http://mp.weixin.qq.com/s/uCx0VUKzvagPVTpjy7Co1w
一、需求缘起
某并发量很大,数据量适中的业务线需要实现一个“标题检索”的功能:
(1)并发量较大,每秒20w次
(2)数据量适中,大概200w数据
(3)是否需要分词:是
(4)数据是否实时更新:否
二、常见潜在解决方案及优劣
(1)数据库搜索法
具体方法:将标题数据存放在数据库中,使用like来检索
优点:方案简单
缺点:不能实现分词,并发量扛不住
(2)数据库全文检索法
具体方法:将标题数据存放在数据库中,建立全文索引来检索
优点:方案简单
缺点:并发量扛不住
(3)使用开源方案将索引外置
具体方法:搭建lucene,solr,ES等开源外置索引方案
优点:性能比上面两种好
缺点:并发量可能有风险,系统比较重,为一个简单的业务搭建一套这样的系统成本较高
三、58龙哥的建议
问1:龙哥,58同城第一届编程大赛的题目好像是“黄反词过滤”,你是冠军,当时是用DAT来实现的么?
龙哥:是的
画外音:什么是DAT?
普及:DAT是double array trie的缩写,是trie树的一个变体优化数据结构,它在保证trie树检索效率的前提下,能大大减少内存的使用,经常用来解决检索,信息过滤等问题。(具体大伙百度一下“DAT”)
问2:上面的业务场景可以使用DAT来实现么?
龙哥:DAT更新数据比较麻烦,不能增量
问3:那直接使用trie树可以么?
龙哥:trie树比较占内存
画外音:什么是trie树?
普及:trie树,又称单词查找树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。(来源:百度百科)
例如:上面的trie树就能够表示{and, as, at, cn, com}这样5个标题的集合。
问4:如果要支持分词,多个分词遍历trie树,还需要合并对吧?
龙哥:没错,每个分词遍历一次trie树,可以得到doc_id的list,多个分词得到的list合并,就是最终的结果。
问5:龙哥,还有什么更好,更轻量级的方案么?
龙哥:用trie树,数据会膨胀文档数*标题长度这么多,标题越长,文档数越多,内存占用越大。有个一个方案,内存量很小,和标题长度无关,非常帅气。
问6:有相关文章么,推荐一篇?
龙哥:可能网上没有,我简单说一下吧,核心思想就是“内存hash + ID list”
索引初始化步骤为:对所有标题进行分词,以词的hash为key,doc_id的集合为value
查询的步骤为:对查询词进行分词,对分词进行hash,直接查询hash表格,获取doc_id的list,然后多个词进行合并
=====例子=====
例如:
doc1 : 我爱北京
doc2 : 我爱到家
doc3 : 到家美好
先标题进行分词:
doc1 : 我爱北京 -> 我,爱,北京
doc2 : 我爱到家 -> 我,爱,到家
doc3 : 到家美好 -> 到家,美好
对分词进行hash,建立hash + ID list:
hash(我) -> {doc1, doc2}
hash(爱) -> {doc1, doc2}
hash(北京) -> {doc1}
hash(到家) -> {doc2, doc3}
hash(美好) -> {doc3}
这样,所有标题的初始化就完毕了,你会发现,数据量和标题的长度没有关系。
用户输入“我爱”,分词后变为{我,爱},对各个分词的hash进行内存检索
hash(我)->{doc1, doc2}
hash(爱)->{doc1, doc2}
然后进行合并,得到最后的查找结果是doc1+doc2。
=====例子END=====
问7:这个方法有什么优点呢?
龙哥:存内存操作,能满足很大的并发,时延也很低,占用内存也不大,实现非常简单快速
问8:有什么不足呢?和传统搜索有什么区别咧?
龙哥:这是一个快速过度方案,因为索引本身没有落地,还是需要在数据库中存储固化的标题数据,如果不做高可用,数据恢复起来会比较慢。当然做高可用也是很容易的,建立两份一样的hash索引即可。另外,没有做水平切分,但数据量非常非常非常大时,还是要做水平切分改进的。
真实用户反馈:“龙哥指点一二,受益终身”
如何快速实现高并发短文检索相关推荐
- 如何快速实现高并发短文检索-转
2016-06-02 58沈剑 架构师之路 一.需求缘起 某并发量很大,数据量适中的业务线需要实现一个"标题检索"的功能: (1)并发量较大,每秒20w次 (2)数据量适中,大概 ...
- 友盟+消息推送U-Push为无他相机 提供快速、高并发的推送服务
在"颜值即正义"的今天,相机类App已经成为让人变美的刚需类应用工具.自拍分享.假日游玩.美食推荐......相机类App已经深入到用户的生活点滴.瘦脸,拉腿,换滤镜,加贴纸,一张 ...
- 高并发限流:8个步骤快速解决高并发问题!
现在很多公司的招聘信息,都会有这这么一条要求:有分布式.高并发.高负载.高可用系统设计.开发和调优经验者优先. 写这个岗位描述的HR,恨不得把自己知道的所有看上去高大上的词全都堆砌上,恨不得让别人一看 ...
- 如何快速获得高并发编程经验?PCC性能挑战赛作品简介及源代码
PCC 是 Performance Challenge Championship (性能挑战杯)的缩写,是高可用架构后花园会员在线上组织的一个活动,由于反响热烈,考虑到线下进行可以更好的加深对高并发编 ...
- java php python 高并发_关于php如何调用Python快速发送高并发邮件的示例代码
1 简介 在PHP中发送邮件,通常都是封装一个php的smtp邮件类来发送邮件.但是PHP底层的socket编程相对于python来说效率是非常低的.CleverCode同时写过用python写的爬虫 ...
- Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
前言 为了帮助初级开发者快速掌握高并发.网络编程.微服务.海量数据的处理这些实用技术,本文以"理论+范例"的形式对各个知识点进行了详细的讲解,力争让读者在实践中快速掌握相关知识. ...
- 揭秘淘宝双11,亿级流量高并发是怎么抗住的?
前言 为了帮助初级开发者快速掌握高并发.网络编程.微服务.海量数据的处理这些实用技术,本文以"理论+范例"的形式对各个知识点进行了详细的讲解,力争让读者在实践中快速掌握相关知识. ...
- 友盟+高吞吐、极速高并发智能推送服务,赋能值得买科技的精准化用户运营
数据智能产业创新服务媒体 --聚焦数智 · 改变商业 经过多年的发展,我国消费电商总体上处于商品溢出.内容溢出的状态.如何提升C端(消费者)和B端(品牌与商家)的连接效率,成为消费电商企业亟需解 ...
- 阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
前言 有人调侃我们说: 程序员不如送外卖.送外卖是搬运食物,自己是搬运代码,都不产出新的东西-- 透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险-- 想跳槽,但是更高的平台难进,同 ...
- 大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问
目录 一.问题源起 二.HDFS优雅的解决方案 (1)分段加锁机制 + 内存双缓冲机制 (2)多线程并发吞吐量的百倍优化 (3)缓冲数据批量刷磁盘 + 网络的优化 四.总结 五.参考文章 一.问题源起 ...
最新文章
- 数据量很大,分页查询很慢,怎么破?
- 判断android应用程序是否已安装
- 【ASM 翻译系列第二弹:ASM 12C 版本新特性】
- 无法访问python官网_python写的网站,云服务器经常无法访问
- linux下的五种io模型,Linux下的五种IO模型
- ip_forward
- 数据挖掘——相似文章推荐
- 在Oracle DG Standby库上启用flashback database功能
- matlab 查找字符串中第一个不为空格的_替换空格(剑指offer第三题)
- C#调用Microsoft.DirectX.DirectSound问题记录及解决
- iphone11返回上一级手势怎么设置_华为手机的这五种导航方式,你更习惯哪一种?怎么切换?...
- Mysql源代码分析系列(1): 编译和调试--转载
- 探针台常见问题—如何减少LHe制冷剂消耗
- HBase Rowkey的散列与预分区设计
- 未越狱苹果设备抓包方法
- 网页木马攻防实战学习笔记一
- 电工知识:常用电子元件名称及其对应图片实用大全
- 移动营业厅前台设备如何安装+新手引导
- php stripslashes和addslashes的区别
- 实现win 10 电脑版微信双开
热门文章
- echarts设置地图大小比例,大小设置
- 屎上最详细最生动的TFT液晶显示屏原理介绍
- 免费预约!百度全面开放北京地区自动驾驶出租车服务
- VS2019的C++项目如何查看源文件(.h,.cc.cpp等)所在的工程
- Operator ‘==‘ cannot be applied to operands of type ‘byte[]‘ and ‘string‘
- 企业研发人员配备比例_……企业职工人数、学历结构以及研发人员占企业职工比例说明...
- jenkins测试人员的使用
- lfs库下载_Git上传大文件夹LFS
- 慧之声科技-巨量资料市场下的卖与买
- linux下部署maven的web项目