DiscuzRedis 分页扩展 轻松快速分页 避免分页瓶颈

discuz-redis 扩展 轻松快速分页 避免分页瓶颈

设计原理:

1、起因:

Discuz!X系列中,使用了SELECT * FROM pre_forum_thread WHERE fid=x AND displayorder IN ORDER BY xxx LIMIT x 这样的sql语句获取当前页的主题列表的。主题越多,翻页的数字越大,在mysql中就越容易出现慢查询,影响性能。表中只对回帖时间字段进行了索引,所以当使用发帖时间、回帖数、查看数排序查看翻页的时候,很容易出现慢查询。 由于上述原因,论坛中做了限制翻页的页数。官网上目前是能翻500页,一般论坛默认设置能翻1000页。

2、目标:

在使用redis特性的前提下解决如下2个问题:

1)、支持多种排序模式的翻页,不产生性能问题

2)、不限翻页数量,不产生性能问题。

3)、不会改动和破坏论坛mysql中的数据,实现相互兼容。

3、设计:

在redis中我为每个板块创建了一组sorted set。包括发帖时间集合、回帖时间集合、回帖数集合、浏览数集合。tid为值,排序条件为分数。每次翻页的时候,就在板块的对应集合中取得一组tid。然后再使用SELECT * FROM pre_forum_thread WHERE tid IN () 获取到帖子的其他数据。

(结构如附件图)

另外因为置顶数据的要求,在板块的每组集合中还加了一个一级置顶集合。在整个系统中加了一个fid集合。

4、代码实现: 工具:因为redis数据库需要初始化,所以单独提供了初始化工具

1)、初始化工具php版

2)、初始化工具py版

新增类:

1)、redis底层驱动类

2)、redis类

修改类:

1)、table_forum_thread 类 通过上述新增2个数据库类和修改一个主题表类就能实现设计中的功能。

五、结论: 目前通过测试能达到目标中的三项要求。

1)、四种主题列表排序方式,不管翻页到多少也,速度均在0.0x秒。

2)、在保证性能的前提下,可翻所有页。

3)、和mysql实现无缝兼容。不影响mysql中正式数据,在redis服务未启动的情况下自动切换到老的分页方式。

一、结构
init_tools 初始化程序
init_php.php
在使用discuz-redis扩展的时候,需要使用上述程序进行初始化redis数据库一次。php版、py版都行。
upload 需要上传到web目录的文件

二、使用前提
1、redis服务器,http://http://redis.io/
2、php-redis扩展,https://github.com/nicolasff/phpredis
3、DXEXTEND1.1.2beta以上,http://www.discuz.net/thread-3334048-1-1.html

三、安装步骤
1、上传upload文件夹中的文件到论坛根目录
2、在 config/config_global.php 中增加如下配置
// -----------------------  CONFIG DISCUZ_REDIS  ------------------------ //
$_config[‘extend‘][‘discuz_redis‘][‘on‘] = 1;
$_config[‘discuz_redis‘][‘server‘] = ‘127.0.0.1‘;
$_config[‘discuz_redis‘][‘port‘] = 6379;
$_config[‘discuz_redis‘][‘pconnect‘] = 1;
$_config[‘discuz_redis‘][‘auth‘] = ‘‘;
$_config[‘discuz_redis‘][‘db‘] = ‘0‘;

3、上述配置好后,修改init_php.php文件分别填写:
$mhost = ‘127.0.0.1‘; mysql服务器地址
$muser = ‘root‘; mysql 用户名
$mpw = ‘‘;
mysql密码
$mdb = ‘x25redis‘;
mysql中discuz数据库名
$rhost = ‘127.0.0.1‘; redis地址
$rport = 6379;  redis端口
$_max_num_per_forum = 100000; 此项设置每个板块最多显示多少主题。如服务器内存足够,可填写较大的值,显示所有主题。

4、在服务器上执行init_php.php同步redis数据,例如/usr/local/php/bin/php /usr/local/src/init_php.php
按数据量大小大概遇到几十秒到几分种时间。建议在数据库服务器负载低的时候运行。

5、在Linux服务器上设置计划任务,每天半夜运行一次init_php.php文件保证redis数据同步。时间点可以自定,建议凌晨3点或者4点。

四、关闭与启动
$_config[‘extend‘][‘discuz_redis‘][‘on‘] = 1;  1为启动,0为停止

代码下载 https://github.com/rikioy/DiscuzTools/tree/master/DiscuzRedis-dxextend

原文发在 http://www.discuz.net/thread-3340731-1-1.html

时间: 2024-10-12 18:09:43

DiscuzRedis 分页扩展 轻松快速分页 避免分页瓶颈的相关文章

mybatis常用分页插件,快速分页处理

在未分享整个查询分页的执行代码之前,先了解一下执行流程. 1.总体上是利用mybatis的插件拦截器,在sql执行之前拦截,为查询语句加上limit X X 2.用一个Page对象,贯穿整个执行流程,这个Page对象需要用java编写前端分页组件 3.用一套比较完整的三层entity,dao,service支持这个分页架构 4.这个分页用到的一些辅助类 注:分享的内容较多,这边的话我就不把需要的jar一一列举,大家使用这个分页功能的时候缺少什么就去晚上找什么jar包即可,尽可能用maven包导入

yii2分页扩展之实现跳转到具体某页

先上图看效果,样式虽然有点丑,这都不重要,我相信拿到代码的你们更注重的是这功能怎么实现的! 从上图中不难看出,我们制定跳转到某页的功能是基于linkpager之上的扩展,这根我们之前实现的分页扩展明显不同,之前的明显就是重写了!当然,这都不重要,我们看看GoLinkPager的具体实现!名字起的有点lower,不重要! 1.在frontend\components目录新建GoLinkPager类文件 2.该类继承yii\widgets\LinkPager;,如下: namespace front

C# 表达式树分页扩展(三)

一.前言 前面我们知道了表达树的基本知识,也明白了怎么遍历和修改一个表达式,这里我们就一个实际的场景来进行功能开发. 表达式系列目录 C# 表达式树讲解(一) C# 表达式树遍历(二) 二.分页扩展 在实际的开发中,肯定会遇到这样的应用场景,一个数据源需要在页面上进行分页显示,并且页面上需要对该数据源有一个排名.本来分页可以在数据库层面完成,但是因为这里有一个排名功能,所谓的排名,就是需要查询出所有满足条件的数据,然后按照某个算法升序或者降序排列,然后按照进行排名.排名之后,然后根据分页信息,将

Django内置分页扩展

url文件 urlpatterns = [ path('admin/', admin.site.urls), path('index1.html/', views.index1), ] views文件 from django.shortcuts import render from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # Create your views here. USER_LIST = []

【知了堂学习笔记】JSP页面数据分页实现(一)——分页概念以及主流数据库的分页查询

一.分页简介 1.分页,就是一种将数据库里的数据一部分展示给用户的技术.为什么要这样做呢?因为一般来说用户在查询时数据是非常多的,当一个页面不能显示所有数据时,我们就要对查询的数据进行分页,就像我们的书本分成一页一页一样.最简单的例子就是百度,当你百度时,成千上万的数据,并不是呈现在一个页面的. 2.分页的实现方式 1)假分页(不推荐):什么是假分页呢?假分页就是一次性将数据库里的数据全部取出来,存储在页面中,然后再将数据分别展示出来.这种假分页在数据少的还可以玩玩,当数据多起来的时候,这种方式

操作系统——存储管理:分区、分页、分段、请求式分页和虚拟内存

操作系统——存储管理:分区.分页.分段.请求式分页和虚拟内存 1. 综述 突然把这么多概念弄到一起,让人有点儿困惑.自己的一些理解: 分区式管理:最简单直观的方式,在内存中分配一个区,将整个进程放入这个区.缺点是会产生外碎片,即时间长了会在分区之间产生难以被利用的小空间. 分页式管理:将内存分成固定大小的页,分配若干页将整个进程载入.页面可以不连续是其重要优点,不会产生外碎片,更有效地利用了内存,不过会产生一些内碎片,即分配给进程的最后一个页往往不能正好用完,不过在页面大小不是很大的时候可以接受

详谈javaWeb分页的实现(模拟百度分页)

本文出自 http://blog.csdn.net/tjpu_lin/article/details/41050475 最近在开发一个项目,项目中有很多数据展示的模块,所以要用到分页,网上搜了很多分页的例子,但是很多实现的方法和自身的代码实例耦合度太高,导致直接拿来用根本不行. 于是自己只能亲自上阵了,关于分页实现大体逻辑是前台需要和后台相互传递页面参数(例如当前页面,页面大小,总共页数等),后台主要接受前台穿过来的pageNum(当前页码),进行数据查询,然后查完数据后返回给前台的同时也要将页

C# 如何处理Word文档分页——插入、删除、阻止分页

本篇文章将介绍C#编程如何来处理Word分页的方法.操作Word中的分页这里分为几种情况的来介绍: 插入分页1.1在指定段落末尾插入分页1.2 在指定字符后插入分页 删除分页3.阻止表格分页 处理工具:Spire.Doc for .NET 6.1安装该类库后,在程序中引用Spire.Doc.dll文件即可(如下图),dll文件在安装路径下Bin文件夹中获取. [示例1]插入分页(在指定段落末尾插入分页) [C#] using Spire.Doc; using Spire.Doc.Document

SQL Server2012 创建定时作业——图文并茂,教你轻松快速创建

原文:SQL Server2012 创建定时作业--图文并茂,教你轻松快速创建 SQL Server2012 如何创建定时作业?有兴趣的可以来看下,图文并茂哦! 1.首先我们打开SQL Server代理,里面选择作业 2.右键作业,选择新建作业 3.填写一些相应的内容,名称和说明自填即可. ***需要注意的是 已启用这个勾要勾选上. 类别我们这里默认即可,按照你的需求可以进行更改. 4.选择步骤 ,点击新建 5.填写步骤名称和所运行的数据库 ***需要注意的是  命令行就是执行你的存储过程 直接