当前位置:首页 > 问答 > 正文

用Redis缓存网站导航条,提升访问速度和响应效率的那些事儿

用Redis缓存网站导航条,提升访问速度和响应效率的那些事儿

这事儿还得从一个最常见的网站问题说起,你有没有遇到过这种情况:打开一个网站,首页内容唰一下就出来了,但顶上的导航菜单,首页”、“产品介绍”、“关于我们”这些栏目,却要转一会儿圈圈才能显示?或者在购物网站上,筛选商品分类时,感觉页面卡顿了一下?很多时候,问题的根源就出在导航条数据的获取上。

用Redis缓存网站导航条,提升访问速度和响应效率的那些事儿

导航条看着简单,不就是几个链接吗?但背后的逻辑可能不简单,根据《大型网站技术架构》一书中的分析,一个成熟的网站导航栏往往不是硬编码在页面里的静态文字,它可能是动态生成的:需要从数据库里查询栏目的名称、链接地址、排序号;可能要根据用户的登录状态,显示“登录/注册”或者个人中心;在电商网站里,商品分类树可能非常复杂,层层嵌套;甚至还需要考虑多语言、不同终端(PC、手机)显示不同导航的需求,每一次有用户访问页面,服务器都要重复执行这些数据库查询和逻辑计算,数据库的压力可想而知,尤其是在访问量大的时候,这就成了拖慢网站速度的“瓶颈”。

这时候,Redis就该登场了,Redis是什么?简单说,它是一个速度极快的“内存数据库”,顾名思义,它把数据直接放在服务器的内存里进行读写,这比从传统的硬盘数据库(如MySQL)里读数据要快得多,速度的提升是指数级的,根据Redis官方文档的基准测试,在普通硬件上,Redis每秒可以处理几十万甚至上百万次的读写请求,我们正好可以利用它这个“快”的特点,来解决导航条的性能问题。

用Redis缓存网站导航条,提升访问速度和响应效率的那些事儿

具体是怎么做的呢?思路其实很直接:“缓存”,就是把那些不经常变动、但又需要频繁读取的数据,从慢速的硬盘数据库里搬出来,放到高速的Redis内存里。

当网站程序第一次需要生成导航条时,它还是会去数据库里把需要的数据都查出来,在返回给用户浏览器之前,程序会多做一个动作:把这些已经加工好的导航条数据(比如转换成JSON格式的字符串),作为一个键值对,存放到Redis里,会给这个数据设置一个“过期时间”,比如10分钟或者1小时。

用Redis缓存网站导航条,提升访问速度和响应效率的那些事儿

接下来的一段时间里(在数据过期之前),再有用户来访问网站的任何页面,需要导航条数据时,程序就不再傻乎乎地每次都去查询数据库了,它会首先直奔Redis,问一句:“哥们儿,有当前导航条的缓存吗?” Redis瞬间就能把数据返回,程序拿到这现成的数据,直接塞到网页模板里,一个完整的页面就快速生成了,这个过程避免了耗时的数据库查询,大大减轻了数据库的压力,页面响应速度自然就上去了。 万一要更新怎么办?比如管理员在后台新加了一个“活动专区”的栏目,这就是设置过期时间的好处了,到了设定的时间(比如10分钟后),Redis会自动删除这个缓存数据,下一次用户请求时,缓存失效,程序会重新去数据库查询最新的数据,然后再次缓存到Redis中,如果等不及自动过期,也可以在后台更新栏目后,程序主动发一个命令,立刻把旧的缓存删除掉(这叫做“主动失效”),这样就能保证用户马上看到最新的导航条。

除了这种基本的缓存模式,为了进一步提升效率,还可以玩些“小花样”,Redis设计与实现》中提到,对于导航条这种结构化的数据,可以使用Redis的Hash(哈希)数据结构来存储,而不是简单地把整个导航条打包成一个字符串,这样如果只想修改导航条里某一个栏目的名称,可以直接更新Hash里的单个字段,更灵活也更节省网络传输。

用了Redis缓存导航条,效果是立竿见影的,最直观的感受就是网站“变快了”,页面加载时间显著缩短,用户体验提升,对于网站服务器来说,数据库的负载被大大分摊,单个服务器能支撑的并发访问量更高了,网站的稳定性和扩展性也更强,这意味着在同样的硬件条件下,网站可以服务更多的用户,或者在访问高峰(比如促销活动)时,不至于轻易崩溃。

引入Redis也带来了一些需要考虑的事情,因为数据存在内存里,所以成本会比硬盘存储高一些,需要合理规划内存大小,要做好Redis服务本身的高可用,防止缓存服务宕机导致网站全面雪崩,对于绝大多数追求性能和用户体验的网站来说,用Redis来缓存导航条这类公共数据,是一项投入产出比极高的技术优化,是实实在在提升网站访问速度和响应效率的“利器”。