网站首页的随机文章虽然很妙,却是在数据运营和产品质量的一种权衡

前两天写了一篇文章《伪原创也能受到百度的青睐,只要做到这一点!》,讲的是海量伪原创文章网站怎么做SEO流量。

就在刚才,花了一点时间又给这个站做了一个小的迭代:在首页增加了一个随机展示的区域,展示的是数据库里随机的若干条文章。

有这么个迭代需求是因为:我在那篇文章里也提到了,当网站上线时数据库就通过爬虫已经有了3万条数据,虽然也提交了全站的网站地图(包含了网站全部链接),文章详情相互也有链接等,但是对于那些排序靠后的文章,搜索引擎也许是没有什么机会可以爬到。

而且从收录之后的表现来看,确实也仅仅是收录最新的、首页有展示过的文章。如果不能收录历史文章,那势必会白白占用大量的数据库空间,也失去海量的长尾关键词流量。

如此来看,是很有必要在首页留出一个区域从数据库里随机的展示历史的文章,以便这些文章也有一定的几率能被收录。

实际代码层面的编写是很简单的,我使用的是Sequelize这个ORM,随机的写法示例代码如下:

const Sequelize = require('equelize')
ArticleModel.findAll({
    order: [Sequelize.fn('RAND')],
    limit:5
})

而其实它等同于sql语句:

select * from table order by rand() limit 5

注意,这条sql语句是最佳实践里极力反对的写法,效率很低,具体优化这里就不表了。

代码编写完成,首页确实能随机的显示数据了。然而这就完了?并没有。

其实刚刚也提到了,随机查询的操作会严重影响数据库执行效率,尤其是网站单表数据过万时(对于个人网站算是中型表了),从这个量级的数据库随机查询记录肯定会遇到不少性能瓶颈。

所以我们有必要对其进行一定的性能优化,除了刚刚提到的sql语句的优化外,针对随机结果不得不做的就是缓存。

最常见的做法是将随机的sql语句查询结果存储在redis等缓存数据库中以提高web性能。因为这个网站采用的技术栈并没有redis,所以我是利用页面的静态化缓存来保证不会有大量的请求打到web服务器以及数据库,保证了我的迷你服务器的稳定性(单核1G512M,承载10多个web服务器)

如此完成迭代开发后,爬虫除了有机会顺着首页爬到大量的历史文章外,还能提升首页快照的时间(因为随机展示的文章会让爬虫认为网站的首页频繁在更新)。

文章的最后不得不说的是,从另一个角度,单纯的随机展示文章并不是一个好的用户体验。对于大量的新闻性质的文章,一旦过了新闻的时效性,旧闻展示在首页会降低网站的权威性和用户的信任度,所以我将其放置在网站的底部偏僻处并且仅仅显示5条。所以总的来说,这是针对搜索引擎而不针对用户的一种迭代,实操中要衡量好利弊得失。