- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在做一个清单,在那里项目可以再次点击一段时间后。每个用户(可能高达100万,但可能介于10000到100000之间)的清单上最多有200个项目(可能在不同的ajax选项卡上分成不到20个的小部分),这些项目都会在不同的时间间隔后更新-有的在2分30秒,有的在1小时,有的在20小时,有的以及在特定时间而不是间隔重置的棘手问题(我认为是针对特定时间项的cronjob)。
我的数据库行将类似于:
---------------------------------------------
| UserID | D1 | D2 | D3 | D4 | D150 |
---------------------------------------------
| 345 | time | time | time | time | time |
| 7294 | time | time | time | time | time |
| 2385 | time | time | time | time | time |
---------------------------------------------
mysql_query ("INSERT INTO checklists (D1)
VALUES ((SYSDATE() + INTERVAL 20 HOUR))")
or die (mysql_error());
SELECT * FROM checklists WHERE D1 < NOW()
on pageload来限制搜索,还是在pageload上使用某种php脚本,或者一分钟运行几次cronjob(我怀疑这是一种合适的方法,但我认为无论如何都应该包含它)?
----------------- ----------------- -----------------
| UserID | D1 | | UserID | D2 | | UserID | D10 |
----------------- ----------------- -----------------
| 345 | time | | 345 | time | | 345 | time |
| 7294 | time | | 7294 | time | | 7294 | time |
| 2385 | time | | 2385 | time | | 2385 | time |
----------------- ----------------- -----------------
最佳答案
“当他们重新加载选项卡时,它将显示是否有任何检查表项准备好再次单击。”——让我们从改进开始。让我们去掉重新加载标签。每个检查表项目的“剩余时间”可以逐页加载到页面上。一个相当简单的javascript函数可以每秒钟唤醒一次,遍历项目(即使是200个项目),检查哪些项目已经“超时”,并将项目从红色更改为绿色(或者您希望指示“现在是时候了!”)。同时,每个项目甚至可以有一个倒计时显示在上面。另外,请注意,将负担推到用户的浏览器上会使服务器减轻很大的负担。
一旦用户单击该项,然后返回到服务器,服务器返回到mysql以重置该计时器。
所以,回到数据库设计。
A计划:每个用户一行;200列,每个项目一列。UPDATE tbl SET item123 = ... WHERE user_id = 9876;
但是,您必须“构造”sql,因为需要构造列名:item123
。
方案B:每个用户每项一行。UPDATE tbl SET next = ... WHERE user_id = 9876 AND item_num = 123
这两个计划都是“有效的”;每分钟处理超过5公里的更新应该很容易。计划B会占用更多的磁盘空间。
但是,还有一个查询需要担心:加载页面。据我所知,这包括:给定一个用户id,获取200(或者仅仅20?)那个用户的计时器。SELECT * FROM tbl WHERE user_id = 9876;
计划a(如上所定义):select将获取一个宽行。
方案B:选择将获取200(或20)行。
不过,两者都是“有效的”,但有一个条件是:
A计划表需要PRIMARY KEY(user_id)
B计划的桌子需要PRIMARY KEY(user_id, item_num)
请记住,cronjob无法访问web页面。因此,这种设计是“扭转”。
现在来看一些数字。如果你有1000个用户在任何时候“在线”,他们平均每分钟点击一个“项目”……这是1K更新,1K选择构建重新加载的页面。2公里/分钟在我提到的5公里以内。然而,它正在突破限制——想想交通高峰,等等。所以,在如何实现方面可能需要格外小心。如果这些数字有意义的话,我们就可以做到这一点。
编辑
由于并非所有用户都拥有所有项目,让我们讨论不需要的项目占用(或不占用)空间的情况。
计划A:每个空列都有一个小的开销。
计划B:你甚至不需要有未使用的行。也就是说,一个用户最多有200行。因此,没有“浪费”空间。
增加“200”怎么样?
计划A:停机做修改表。这是A计划的一大缺点。
计划B:不需要更改架构。
RAM大小和数据集大小?
如果所有的东西都可以缓存在ram中,那么惟一的i/o就是用于写入事务日志(innodb)并最终将数据持久化到磁盘。即使活动用户的数量使得他们的行可以缓存在ram中,直到他们注销,关于i/o的评论也是正确的。
如果有更多的活动用户无法有效缓存,则进程将成为I/O绑定的,并且您将无法跟上。这可以通过(a)增加ram(和增加innodb_buffer_pool_大小)或(b)“分片”(sharding)——在多台机器上分散用户来解决。
1GB虚拟机意味着innodb_buffer_pool_的大小应该只有100M,但这可能足够大,可以处理您的预计活动负载。(正如你所说,数字是模糊的。)
多个数据库?
一个数据库中有一个表,没有分区。按数据库、表或分区进行拆分(据我所见)没有任何优势。如果你长得多,切块(上面提到的)可能会有用。不过,我还是会先强化一个服务器:两个硬件改进:更多的ram和带有写缓存的raid条带。(这些还不需要。在决定何时/是否增强硬件之前,最好先获取活动用户的指标、点击率等。)
200个连接限制?
最大连接数是200吗?或者最大用户连接?你使用的云服务不会让你增加吗?
建议您立即断开连接,而不是挂在连接上,用户在接下来的一分钟内都不会再打这个连接。您可以通过设置wait_timeout(或者它是交互式的wait_timeout?)比如说,10秒。
在添加“实例”之前,让我们尝试在这个级别解决问题。
关于php - 页面加载,MYSQL或cronjob上的PHP - 用于检查时间是否已过去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29324392/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!