设计原理:
1、起因:
Discuz!X系列中,使用了SELECT * FROM pre_forum_thread WHERE fid=x AND displayorder IN ORDER BY xxx LIMIT x 这样的sql语句获取当前页的主题列表的。主题越多,翻页的数字越大,在mysql中就越容易出现慢查询,影响性能。表中只对回帖时间字段进行了索引,所以当使用发帖时间、回帖数、查看数排序查看翻页的时候,很容易出现慢查询。
由于上述原因,论坛中做了限制翻页的页数。官网上目前是能翻500页,一般论坛默认设置能翻1000页。
3、设计:
在redis中我为每个板块创建了一组sorted set。包括发帖时间集合、回帖时间集合、回帖数集合、浏览数集合。tid为值,排序条件为分数。每次翻页的时候,就在板块的对应集合中取得一组tid。然后再使用SELECT * FROM pre_forum_thread WHERE tid IN () 获取到帖子的其他数据。
(结构如附件图)
另外因为置顶数据的要求,在板块的每组集合中还加了一个一级置顶集合。在整个系统中加了一个fid集合。