Magento搜索结果页缓存策略解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

在给Magento网站规划缓存方案时,很少有人关注到搜索结果页面。有些人可能认为搜索结果页面千变万化(用户可能使用任何词汇来你的网站搜索),所以没法做缓存。另一些人可能认为没有必要为搜索结果页面做缓存,因为搜索只是网站里很小的一部分。真的如此吗?

先来回答第二个问题,有没有必要为搜索结果页面做缓存?缓存的作用分为两方面,一方面是可以明显减少网页的加载时间,提高用户的体验,另一方面因为数据从缓存中获取,避免了读数据库和程序逻辑的运算,可以明显降低服务器的负载压力。针对Magento的情况,只要sku数达到一定量级(也许2000),前台搜索所花时间就会明显上升,某些平台类的Magento站,sku数上万很正常,影响会更明显。服务器方面,每一次的搜索请求都会对catalogsearch_fulltext表做读操作,然后对catalogsearch_query表做更新(写操作),也许同时还更新下catalogsearch_result表,整个流程没有任何防护,直接穿透到数据库层,表面的问题是搜索量大是数据库压力会很大,更进一步的问题是不设防的流程给别有用心的人留下了一个很好的攻击网站的入口。

既然有必要为搜索结果页面做缓存,再来看第一个问题,怎么做?以FPC为例(这里推荐Lesti_Fpc,其他FPC同理),一般FPC会针对四类页面做缓存:首页,CMS页面,商品列表页,商品详情页。如果简单的在此基础上加上对搜索结果页的支持(参数“q”作为cache key的一部分),确实可以无差别的把所有搜索词的结果页都给缓存起来(甚至不管有没有搜到结果),但这样子一方面缓存占据的容量(一般是内存)会大量上升,另一方面这些缓存的命中率会非常低。那么很简单的一个处理思路就是,我只缓存有必要缓存的搜索词带来的结果页,放过那些不必要缓存的词。

首先做一个预测的词库,哪些搜索词你预测用户会经常使用,就放入一个池子里,当前台有用户搜索词包含在词库里时,就把这个词对应的搜索结果页缓存起来,缓存有效期内再次有用户使用同一个搜索词时,就可以直接从缓存中读取数据了。这个词库怎么做,结合Magento的实际情况,可以去根据catalogsearch_query表筛选出预测命中率会比较高的词。比如我是这么筛选的,首先这个词必须是能搜到结果的(num_results >0),其次这个词没有在后台指定跳转(redirect is null),然后这个词最近半个月内被搜索过(updated_at >xxx),最后把符合条件的按流行度排序(popularity desc),取出排前500的词,这500个词就是我要的词库。因为catalogsearch_query表的数据随着时间在改变,所以我每天重新初始化一遍我的词库。

以上是我针对自己网站的例子,每个网站实际情况不同,筛选的条件和参数应该也不同,共同点就是Magento的catalogsearch_query表提供了基础,可以按自己的需求筛出自己要的词。


词库需要一个容器,传统做法是新建一张Mysql的表来保存这些数据,然后通过判断表中是否含有用户请求的词来决定是否缓存页面。非传统做法是使用Nosql做容器,我的建议是Redis。Nosql读写效率高,还可以减轻Mysql主库的压力。

有了词库之后就是要在你的FPC里去做逻辑判断,这个就很简单了,通过Mage::app()->getRequest()->getParam('q')获取前台搜索词,把这个词去词库里匹配,匹配上的走缓存流程,匹配不上的跳出走正常流程。

可能有人会想到,网站搜索不是可以用专业的全文搜索引擎来帮助我们更快更好的做搜索吗?比如经典的Solr或者Sphinx,又或者小鲜肉ElasticSearch。这个想法没错,不过跟本文并不冲突。全文搜索引擎搜索引擎的常规用法(针对B2C)是根据搜索词快速匹配出符合条件的商品ID集合,再根据这些商品id去数据库里取出商品的完整信息(图片,价格等等),而缓存所做的是直接把搜索词和页面做一个K\V对应,命中缓存时绕过所有的检索流程直接返回用户以结果。

关于全文搜索引擎(比如Sphinx)与Magento的结合,是一个单独的大话题,以后有机会可以探讨下。



最后推荐看下高大上的淘宝是怎么玩的:http://www.tao-sou.com/840.html


目录
相关文章
|
23天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
49 0
|
1天前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
16 8
|
2天前
|
存储 缓存 自然语言处理
深度解析ElasticSearch:构建高效搜索与分析的基石
【9月更文挑战第8天】在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。本文将深入解析ElasticSearch的核心原理、架构设计及优化实践,帮助读者全面理解这一强大的工具。
31 7
|
5天前
|
负载均衡 监控 安全
Wi-Fi漫游深入解析:确保设备连接的有效策略
Wi-Fi漫游深入解析:确保设备连接的有效策略
24 9
|
8天前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
29 5
|
18天前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
35 5
|
18天前
|
存储 缓存 前端开发
缓存技术在软件开发中的应用与优化策略
缓存技术在软件开发中的应用与优化策略
|
20天前
|
存储 安全 测试技术
|
7天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
19 0
|
20天前
|
前端开发 Java UED
瞬间变身高手!JSF 与 Ajax 强强联手,打造极致用户体验的富客户端应用,让你的应用焕然一新!
【8月更文挑战第31天】JavaServer Faces (JSF) 是 Java EE 标准的一部分,常用于构建企业级 Web 应用。传统 JSF 应用采用全页面刷新方式,可能影响用户体验。通过集成 Ajax 技术,可以显著提升应用的响应速度和交互性。本文详细介绍如何在 JSF 应用中使用 Ajax 构建富客户端应用,并通过具体示例展示 Ajax 在 JSF 中的应用。首先,确保安装 JDK 和支持 Java EE 的应用服务器(如 Apache Tomcat 或 WildFly)。
27 0

推荐镜像

更多