原文地址: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索引即可。另外,没有做水平切分,但数据量非常非常非常大时,还是要做水平切分改进的。

真实用户反馈:“龙哥指点一二,受益终身”

如何快速实现高并发短文检索相关推荐

  1. 如何快速实现高并发短文检索-转

     2016-06-02 58沈剑 架构师之路 一.需求缘起 某并发量很大,数据量适中的业务线需要实现一个"标题检索"的功能: (1)并发量较大,每秒20w次 (2)数据量适中,大概 ...

  2. 友盟+消息推送U-Push为无他相机 提供快速、高并发的推送服务

    在"颜值即正义"的今天,相机类App已经成为让人变美的刚需类应用工具.自拍分享.假日游玩.美食推荐......相机类App已经深入到用户的生活点滴.瘦脸,拉腿,换滤镜,加贴纸,一张 ...

  3. 高并发限流:8个步骤快速解决高并发问题!

    现在很多公司的招聘信息,都会有这这么一条要求:有分布式.高并发.高负载.高可用系统设计.开发和调优经验者优先. 写这个岗位描述的HR,恨不得把自己知道的所有看上去高大上的词全都堆砌上,恨不得让别人一看 ...

  4. 如何快速获得高并发编程经验?PCC性能挑战赛作品简介及源代码

    PCC 是 Performance Challenge Championship (性能挑战杯)的缩写,是高可用架构后花园会员在线上组织的一个活动,由于反响热烈,考虑到线下进行可以更好的加深对高并发编 ...

  5. java php python 高并发_关于php如何调用Python快速发送高并发邮件的示例代码

    1 简介 在PHP中发送邮件,通常都是封装一个php的smtp邮件类来发送邮件.但是PHP底层的socket编程相对于python来说效率是非常低的.CleverCode同时写过用python写的爬虫 ...

  6. Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF

    前言 为了帮助初级开发者快速掌握高并发.网络编程.微服务.海量数据的处理这些实用技术,本文以"理论+范例"的形式对各个知识点进行了详细的讲解,力争让读者在实践中快速掌握相关知识. ...

  7. 揭秘淘宝双11,亿级流量高并发是怎么抗住的?

    前言 为了帮助初级开发者快速掌握高并发.网络编程.微服务.海量数据的处理这些实用技术,本文以"理论+范例"的形式对各个知识点进行了详细的讲解,力争让读者在实践中快速掌握相关知识. ...

  8. 友盟+高吞吐、极速高并发智能推送服务,赋能值得买科技的精准化用户运营

    ‍ ‍数据智能产业创新服务媒体 --聚焦数智 · 改变商业 经过多年的发展,我国消费电商总体上处于商品溢出.内容溢出的状态.如何提升C端(消费者)和B端(品牌与商家)的连接效率,成为消费电商企业亟需解 ...

  9. 阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF

    前言 有人调侃我们说: 程序员不如送外卖.送外卖是搬运食物,自己是搬运代码,都不产出新的东西-- 透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险-- 想跳槽,但是更高的平台难进,同 ...

  10. 大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

    目录 一.问题源起 二.HDFS优雅的解决方案 (1)分段加锁机制 + 内存双缓冲机制 (2)多线程并发吞吐量的百倍优化 (3)缓冲数据批量刷磁盘 + 网络的优化 四.总结 五.参考文章 一.问题源起 ...

最新文章

  1. 数据量很大,分页查询很慢,怎么破?
  2. 判断android应用程序是否已安装
  3. 【ASM 翻译系列第二弹:ASM 12C 版本新特性】
  4. 无法访问python官网_python写的网站,云服务器经常无法访问
  5. linux下的五种io模型,Linux下的五种IO模型
  6. ip_forward
  7. 数据挖掘——相似文章推荐
  8. 在Oracle DG Standby库上启用flashback database功能
  9. matlab 查找字符串中第一个不为空格的_替换空格(剑指offer第三题)
  10. C#调用Microsoft.DirectX.DirectSound问题记录及解决
  11. iphone11返回上一级手势怎么设置_华为手机的这五种导航方式,你更习惯哪一种?怎么切换?...
  12. Mysql源代码分析系列(1): 编译和调试--转载
  13. 探针台常见问题—如何减少LHe制冷剂消耗
  14. HBase Rowkey的散列与预分区设计
  15. 未越狱苹果设备抓包方法
  16. 网页木马攻防实战学习笔记一
  17. 电工知识:常用电子元件名称及其对应图片实用大全
  18. 移动营业厅前台设备如何安装+新手引导
  19. php stripslashes和addslashes的区别
  20. 实现win 10 电脑版微信双开

热门文章

  1. echarts设置地图大小比例,大小设置
  2. 屎上最详细最生动的TFT液晶显示屏原理介绍
  3. 免费预约!百度全面开放北京地区自动驾驶出租车服务
  4. VS2019的C++项目如何查看源文件(.h,.cc.cpp等)所在的工程
  5. Operator ‘==‘ cannot be applied to operands of type ‘byte[]‘ and ‘string‘
  6. 企业研发人员配备比例_……企业职工人数、学历结构以及研发人员占企业职工比例说明...
  7. jenkins测试人员的使用
  8. lfs库下载_Git上传大文件夹LFS
  9. 慧之声科技-巨量资料市场下的卖与买
  10. linux下部署maven的web项目