- 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/
我需要根据需要动态设置文本区域,但它不想正常工作。 JQuery 会自行检查,但无法检查是否已检查。但是当您在第二个单选框内单击时,始终需要文本区域。我尝试了很多次让它工作,但它仍然有问题。我添加了“
我需要在 Django 中进行 API 调用(某种形式),作为我们所需的自定义身份验证系统的一部分。用户名和密码通过 SSL 发送到特定 URL(对这些参数使用 GET),响应应该是 HTTP 200
我将在我的可移植 C 代码中使用 #warning 来生成编译时警告。但并非所有平台都支持 #warning。有什么方法可以找到该平台是否支持 #warning。 #ifdef warning
我编写了一个函数来检查某个数字是否存在于某个区间内。停止搜索的最佳方法是什么?这个: for (i = a; i <= b; i++) { fi = f(i); if (fi == c) {
我想知道在 c 中是否有一种方法可以检查,例如在 for 函数中,如果变量等于或不等于某些字符,而不必每次都重复进行相等性检查。如果我没记错的话,以这种方式检查相等性是不正确的: if (a == (
我有如下日志功能 void log_error(char * file_name, int line_num, int err_code) { printf("%s:%d:%s\n", fil
使用 ssh-keygen 生成的 key 对在 macOS 上可以有不同的格式。 macOS 可读的标准 PEM ASN.1 对象 SecKey API 带有文本标题的 PEM OpenSSH ke
我正在尝试编写一个 excel if 语句。我不熟悉使用 Excel 具有的所有额外功能。我正在使用一个名为 importXML() 的函数.我正在尝试检查我正在使用的函数是否生成“#VALUE!”错
有没有办法检查是否没有 AIO 写入给定文件?我在我的 Unix 类(class)上制作了一个项目,该项目将是一个上下文无关(基于 UDP)的国际象棋服务器,并且所有数据都必须存储在文件中。应用程序将
我有一个如下所示的函数: public Status execute() { Status status = doSomething(); if (status != Stat
我正在使用 Composer,我不希望 PhpStorm 在 vendor 文件夹上运行任何错误检查或检查,因为它对 vendor/中的某些代码显示误报composer/autoload_static
Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么? 我能看到的最好的方法是检查 D1==D2和 D1.dist==D2.di
在我的 JavaScript 函数中,我为所有输入、文本区域和选择字段提供实际值作为 initial_value: $('input, textarea, select').each(function
我正在编写一个分解为几个简单函数的 PHP 类。在构造函数中,它调用另一个名为 processFile 的函数。该函数调用 5 个私有(private)函数并进行检查。如果检查失败,它会将消息分配给
这个问题已经有答案了: How to detect if user it trying to open a link in a new tab? (2 个回答) 已关闭 7 年前。 我认为 JavaS
我正在浏览我们的代码库并看到很多这样的测试: declare @row_id int = ... declare @row_attribute string select @row_attribu
我正在声明一个用作比较的函数。我的问题是: 为什么条件充当语句? 为什么第 4 行可以工作,而第 5 行却不行? 我知道这段代码不切实际且未使用,但为什么编译器允许这种语法? 谷歌没有找到答案。但话又
到目前为止,我有一个带有空文本字段的 PHP Kontaktform,并使用以下命令检查了所需的字段: $name = check_input($_POST['name'], "请输入姓名。"); 现
目前,我能想到的合理检查的唯一方法没有臃肿的逻辑: if ( $value > 0 ) { // Okay } else { // Not Okay } 有没有更好的办法? 最佳答案
我正在尝试运行一个脚本,如果 i 存在(意味着存在 i 值,任何值)或其他部分,我希望运行其中的一部分如果i没有值就运行,有人可以启发我吗? 我说的是 for 循环,比如 for (var i=0;
我是一名优秀的程序员,十分优秀!