Redis 搜索引擎优化

场景

大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不用说了(不知各位有没有这种感受呢~)。

下面以一个例子开始,这是某购物网站的搜索条件,如果让你实现这样的一个搜索接口,你会如何实现?(当然你说借助搜索引擎,像 Elasticsearch 之类的,你完全可以实现。但我这里想说的是,如果要你自己实现呢?)

从上图中可以看出,搜索总共分为6大类,每大类中又分了各个子类。这中间,各大类条件之间是取的交集,各子类中有单选、多选、以及自定义的情况,最终输出符合条件的结果集。

好了,既然需求很明确了,我们就开始来实现。

实现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

代码在测试环境跑了一把,结果好像都匹配上了,于是准备上预发。这一上预发,问题就开始暴露出来。预发为了尽可能的逼真线上环境,所以数据量自然而然要比测试大的多。所以这么一个复杂的 SQL,它的执行效率可想而知。测试同学果断把小A的代码给打了回来。

实现2

总结了小A失败的教训,小B开始对SQL进行了优化,先是通过了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自己也知道,每次查询都会向数据库查询多次,而且有些历史原因,部分条件是做不到单表查询的,所以查询等待的时间是避免不了的。

实现3

小C从上面的方案中看到了优化的空间。他发现小B在思路上是没问题的,将复杂条件拆分,计算各个子维度的结果集,最后将所有的子结果集进行一个汇总合并,得到最终想要的结果。

于是他突发奇想,能否事先将各个子维度的结果集给缓存起来,这要查询的时候直接去取想要的子集,而不用每次去查库计算。

这里小C采用 Redis 来存储缓存数据,用它的主要原因是,它提供了多种数据结构,并且在 Redis 中进行集合的交并集操作是一件很容易的事情。

具体方案,如图所示:

这里每个条件都事先将计算好的结果集ID存入对应的key中,选用的数据结构是集合(Set)。查询操作包括:

  • 子类单选:直接根据条件 key,获取对应结果集;
  • 子类多选:根据多个条件 Key,进行并集操作,获取对应结果集;
  • 最终结果:将获取的所有子类结果集进行交集操作,得到最终结果;

这其实就是所谓的反向索引。

这里会发现,漏了一个价格的条件。从需求中可知,价格条件是个区间,并且是无穷举的。所以上述的这种穷举条件的 Key-Value 方式是做不到的。这里我们采用 Redis 的另一种数据结构进行实现,有序集合(Sorted Set):

将所有商品加入 Key 为价格的有序集合中,值为商品ID,每个值对应的分数为商品价格的数值。这样在 Redis 的有序集合中就可以通过ZRANGEBYSCORE命令,根据分数(价格)区间,获取相应结果集。

至此,方案三的优化已全部结束,将数据的查询与计算通过缓存的手段,进行了分离。在每次查找时,只需要简单的查找 Redis 几次就能得出结果。查询速度上符合了验收的要求。

扩展

分页

这里你或许发现了一个严重的功能缺陷,列表查询怎么能没有分页。是的,我们马上来看 Redis 是如何实现分页的。

分页主要涉及排序,这里简单起见,就以创建时间为例。

如图所示:

图中蓝色部分是以创建时间为分值的商品有序集合,蓝色下方的结果集即为条件计算而得的结果,通过ZINTERSTORE命令,赋结果集权重为0,商品时间结果为1,取交集而得的结果集赋予创建时间分值的新有序集合。对新结果集的操作即能得到分页所需的各个数据:

  • 页面总数为:ZCOUNT命令
  • 当前页内容:ZRANGE命令
  • 若以倒序排列:ZREVRANGE命令

数据更新

关于索引数据更新的问题,有两种方式来进行。一种是通过商品数据的修改,来即时触发更新操作,一种是通过定时脚本来进行批量更新。这里要注意的是,关于索引内容的更新,如果暴力的删除 Key,再重新设置 Key。因为 Redis 中两个操作不会是原子性进行的,所以中间可能存在空白间隙,建议采用仅移除集合中失效元素,添加新元素的方式进行。

性能优化

Redis 是内存级操作,所以单次的查询会很快。但是如果我们的实现中会进行多次的 Redis 操作,Redis 的多次连接时间可能是不必要时间消耗。通过使用MULTI命令,开启一个事务,将 Redis 的多次操作放在一个事务中,最后通过EXEC来进行原子性执行(注意:这里所谓的事务,只是将多个操作在一次连接中执行,如果执行过程中遇到失败,是不会回滚的)。

总结

这里只是一个采用 Redis 优化查询搜索的一个简单 Demo,和现有的开源搜索引擎相比,它更轻量,学习成本也相应低些。其次,它的一些思想与开源搜索引擎是类似的,如果再加上词语解析,也可以实现类似全文检索的功能。

时间: 2024-10-04 18:20:30

Redis 搜索引擎优化的相关文章

搜索引擎优化优化的年夜前提是了解网站流量的出典

seo是要正在建站之初就理当去搞妥打算的,假如是一度曾经上线了的上网站,要做SEO搜索引擎优化时,那也要先办好搜索引擎优化规划,尔后,遵照妄想形式,过度少的改变网站的问题问题.关头词以及网站的简介,再不让损失踪减到最小.搜索引擎优化是没有能对于网站时常做年夜年夜的行动的.上面是本人拾掇的一些材料指望对于自己有协助 搜索引擎优化优化的年夜前提是体味网站流量的出典 搜索引擎优化优化的年夜前提是熟悉网站流量的出典. 搜索引擎优化优化的年夜前提是了解网站流量的出典.瞄准于没有一样的流量出典选择优化的设计

SEO搜索引擎优化(一)

什么是SEO呢 英文为"Search Engine Optimization",中文名为"搜索引擎优化".SEO是指通过对网站进行站内优化和修复(网站Web结构调整.网站内容建设.网站代码优化和编码等)和站外优化,从而提高网站的网站关键词排名以及公司产品的曝光度.通过搜索引擎查找信息是当今网民们寻找网上信息和资源的主要手段.说白了就是你搜索信息的时候能把你的网站的信息更好的暴露,比如搜索一第条就是你的,有比如搜索关键字什么都有你...增加点击量.感觉国内一些垃圾网站

西安专业搜索引擎优化公司

诺可可是西安北郊一家专门从事搜索引擎优化的高端企业,十多年来诺可可网络积累了成千上万的成功案例.搜索引擎优化顾名思义就是指利用搜索引擎的搜索规则来增加网站在有关搜索引擎内的自然排名的方式.今天诺可可网络小编就给大家讲一讲企业为什么要进行搜索引擎的优化,这究竟对企业有什么有利之处呢? 首先,如果进行正规的搜索引擎优化服务前期的站内优化,可以很好的协助你给网站制作人员留下的一堆问题都解除掉.使你的网站恢复到有利于搜索引擎抓取和收录的良好状态.就算你不进行后期的关键词排名服务,你的网站随着时间的推移,

如何经由搜索引擎优化关键词排名做到首页

一.用户体验是永恒的主题 先举例来说吧,在手机端百度搜索我们的品牌词虎贝尔,首页有个雅森车品网.这个页面本来是排在第二页的,只是有一次我进这个网站修改了一些产品,换句话说,就是在网站里面呆了一段时间,做了一些深入的点击,后来这个贴子就一直排在百度首页了.这说明什么?用户在网页在的行动对网页的排名极为重要. 根据这一判断,我针对搜索关键词的时候的相关品牌,做了一些操作,也产生了较好的效果.每天找不同的人展开相关品牌里我们的LOGO点击.过了大概一个星期,手机端搜索核心关键词儿童安全座椅,我们虎贝尔

搜索引擎优化要存正在的情形有哪些

<p> 我们对于seo常识有初步的密查后,认为自己是一度象样的SEO搜索引擎优化人员,那样的主见是年夜年夜错特错.因为你再有良多搜索引擎优化知识要去进修,因为你那样的不雅概念是差错的.那样旧日我就跟年夜学问说作为一名象样的搜索引擎优化要存正在的情形有哪些?上面我们看看以次若干好多点:一.尖锐的嗅觉. 二.注定要练好根柢功软文剖析上网站对于用户需要的切确区分数据拾掇(譬如:友情链接增添表格.IIS每日的表格.每日的录入数据.牌面的起浮数据.快照复旧数据.以及网站有什么成效)基本课程的磨炼友情链接

基于搜索引擎优化Internet的策略研究

随着Internet技术的迅速发展,使得用户要想在信息海洋里查找目标信息,就如大海捞针一样,搜索引擎技术恰好解决了这一难题.搜索引擎是人们获取网络资源的主要工具,然而搜索引擎在给网络用户带来巨大便捷的同时, 由于其信息检索技术智能水平的限制以及对自然语言理解的制约,在网络信息的检索中存在许多不足.因此,搜索引擎优化(Search Engine Optimization,SEO)技术应运而生. 随着Yahoo.Google等著名搜索引擎的出现,搜索引擎优化技术也逐渐发展起来.从最初意识到网站首字母

搜索引擎优化要领:8条辅助技巧(三)

接上篇:搜索引擎优化要领:8条辅助技巧(二) 六.正确使用重定向 有许多的原因,你可能会重定向的内容: 当移动一个旧网站到一个新的领域 指挥交通从一个网页到另一个 移动通信从过期的页面到现有的页面 要移动到另一个页面上断开的链接 有几种不同的方式来重定向的页??面和你这样做,以避免浪费流量和失去在谷歌的搜索结果中的位置,这是可取的. 七.检查你的内部链接 在你的网站内部链接可以在你的网站的整体搜索引擎优化的一个重要因素.链接不仅是一个很好的导航源的用户,但他们也告诉谷歌,你的网页是非常重要的.

空间服务器因素对搜索引擎优化有哪些影响?

空间服务器作为一个网站必不可少的组成部分,对整个网站起到举足轻重的作用.同样,搜索引擎优化工作也是当前互联网运营的重要部分,那么空间服务器会不会对网站优化工作产生影响呢?这些影响的程度有多深呢? 一个大家都认可的问题是:一个拥有独立IP的网站,会对网站优化产生非常大的影响.而许多网站都共享同一个IP,那么这里面你对自己网站所做的工作会对网 站优化产生的影响有所降低,而他人网站下行动将会对你的网站或多或少的产生影响.所以,可以看出来搜索引擎对IP的识别非常灵敏.这样是不是就说空间主机 对网站优化工

搜索引擎优化(SEO)解决方案

  搜索引擎优化(SEO)解决方案 在此之前,希望大家能重新审视搜索引擎,通俗来讲就是我们日常所用的百度.谷歌.搜狗.雅虎等.磨刀不误砍柴工,知己知彼,百战不殆! 一.搜索引擎是什么? 搜索引擎(Search Engine)是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.搜索引擎包括全文索引.目录索引.元搜索引擎.垂直搜索引擎.集合式搜索引擎.门户搜索引擎与免费链接列表等. 二.搜索引擎如何工作? 第