例如京东,当当,前台是如何处理缓存搜索的

madbooker 发布于 2015/05/13 21:44
阅读 1K+
收藏 6
诸如china-pub,当当,京东,前台的数据都是从缓存里面获取的吧,可是如何处理客户的搜索呢?诸如memcached或者redis ,无法进行搜索吧,那么网站是如何处理的?难道一定要连接数据库进行查询?不能再缓存里面直接查找吗?
加载中
1
eechen
eechen
如果你使用了数据库提供的全文搜索功能,比如MySQL MyISAM/InnoDB 的FullText或者SQLite的FTS3/FTS4虚拟表,那当然要查询数据库,全文搜索会根据词建立索引,性能要比like这种模糊搜索快得多:

SQLite官方测试中,50多万条数据用LIKE '%keyword%'模糊搜索耗时22.5秒,用MATCH 'keyword'全文搜索仅耗时0.03秒,比模糊搜索快749倍.如果担心SQLite大量读写影响磁盘性能的话,可以把数据库放到内存里:/run /shm/data.db3

另外,还可以采用专业的全文搜索引擎来进行全文搜索,比如Sphinx和国人开发的XunSearch。
开源中文搜索引擎XunSearch:
【性能劲爆】XunSearch 单库最多支持 40 亿条数据,在 5 亿网页大约 1.5TB 的数据中检索时间不超过 1 秒(非缓存)。
【简单易用】前端是使用脚本语言 PHP 编写的开发工具包。API 简单清晰,开发难度极低,提供全中文的示例代码、文档、辅助脚本工具等。
【功能丰富】除支持基础的自定义分词、字段检索、布尔搜索外,还直接支持用户急需的相关搜索、拼音搜索、搜索建议等专业功能。
XunSearch作者同时是中文分词SCWS的作者hightman。

XunSearch作者还为PHP开发了SCWS中文分词PECL扩展,并且提供了14MB的字典。

XunSearch搜索建议和纠错(比如拼音搜索):
http://www.xunsearch.com/doc/php/guide/search.fix

XunSearch索引更新是异步行为:
http://www.xunsearch.com/doc/php/guide/index.overview
出于性能优化设计,所有的索引操作(包含添加、删除、修改文档)均是异步的行为。也就是说在 PHP-SDK 的相关 API 返回后,只是说明已经将索引变动提交到操作队列中,而并不是已经立即更新到磁盘上的索引数据库文件。因此,搜索结果将不能立即体现出您的变动。但请放心, 这个时间差我们已经控制在非常合理的范围内,通常是若干秒。特别说明,索引清空是同步操作,立即生效。如果确实有必要,您可以使用 Indexer的 --flush 选项来强制刷新索引。
1
cnDavidChen
cnDavidChen

搜索会用到搜索引擎,比如lucene或sphinx(中文版的叫coreseek)。

1、在空闲时,或每隔一段时间,搜索引擎会先接入数据库,对每个商品进行索引(索引中可以保存商品的ID和标题,简介等等)。

2、用户搜索时,调用搜索引擎的接口,搜索到(搜索关键字与索引进行匹配)相关的商品,可以获取到这些商品的id。

3、根据这些ID,到redis等缓存中去取完整的商品信息。(缓存如果没有,那么就到数据库中取完整的信息,并且填充到缓存中,这样下一次就在缓存直接取了。)

难道一定要连接数据库进行查询?不能再缓存里面直接查找吗?
这样,只有在缓存中没有商品信息时才会去数据数据,也没有在缓存中查找,是在搜索引擎中查找的。

0
_________0
_________0
全文检索功能,把商品名称进行全文检索,查询速度很快
0
公孙二狗
公孙二狗

可以看看现在很流行的Solr

Ryan-瑞恩
Ryan-瑞恩
ES也不错。
0
madbooker
madbooker
@eechen 还是要在数据库处理啊,不能直接在缓存里面查找吗?
eechen
eechen
Memcached/Redis这些K/V缓存的功能就是你给它个Key,它帮你从内存找到这个Key对应的内容. 比如你在MySQL中进行全文检索,找到了那些包含关键词的Key集合,那么就可以根据这些Key在Memcached/Redis找缓存了. 单凭Memcached/Redis,是不可能完成全文搜索的功能的,K/V缓存只能作为MySQL的辅助.
0
Tuesday
Tuesday

京东用的是主动缓存.... 大企业有用被动缓存的?

0
madbooker
madbooker
@Tuesday 主动缓存我百度了下,是自动更新缓存而非客户访问查库式?我想知道前端页面搜索的时候是怎么处理的。
0
Tuesday
Tuesday

引用来自“madbooker”的评论

@Tuesday 主动缓存我百度了下,是自动更新缓存而非客户访问查库式?我想知道前端页面搜索的时候是怎么处理的。

说白了, 京东就是一个读写分离架构. 100%的写库都是由公司内部触发. 后台管理触发.

添加一个产品, 这时就开始对缓存进行更新了(主要也就是产品关键字, 没人会在京东搜索"如何泡奶茶妹妹", 所以明白这点就简单多了.)

写库一完成, 然后它才会同步去读库.

0
宏哥
宏哥

看到楼上那么多SB堆叠在一起, 

靠自己浅薄的理解去猜测那些他们无法理解的东西

就觉得, 坚持两个凡是非常必要

0
madbooker
madbooker
@宏哥 久仰大名,还望不吝赐教。
返回顶部
顶部