Code For Colorful Life
多表数据分页方案
通常情况下,只需要对单表的数据进行分页:
SELECT …… LIMIT ($CURRENT_PAGE - 1) * $PAGE_SIZE, $PAGE_SIZE ORDER BY ……
然而,在比较复杂的业务场景下,数据来自多张表(并非水平分割的表),这时就要考虑多张表的情况下,数据聚合到一起后如何分页了。
这里给出一个参考方案:
假设数据来自A、B表,分页规则按照记录的创建时间排序,再定义一个分页的状态变量time(记录时间):
- 当获取第1页数据时:
SELECT …… FROM A WHERE …… LIMIT 0, $PAGE_SIZE ORDER BY ……
和SELECT …… FROM B WHERE …… LIMIT 0, $PAGE_SIZE ORDER BY ……
,将这两份数据在代码层面合并到一起后取出前$PAGE_SIZE
条记录items,并且记下第$PAGE_SIZE
条记录的创建时间为time,再记下items中最后一条A记录的id为aid和最后一个B记录的id为bid; - 当获取第2页数据时:
SELECT …… FROM A WHERE …… AND created <= time AND id != aid LIMIT $PAGE_SIZE * 1, $PAGE_SIZE ORDER BY ……
和SELECT …… FROM B WHERE …… AND created <= time AND id != bid LIMIT $PAGE_SIZE * 1, $PAGE_SIZE ORDER BY ……
,将这两份数据在代码层面合并到一起后取出前$PAGE_SIZE
条记录items,同时更新aid和bid。 - 之后数据的获取以此类推。
之所以记录aid和bid是考虑到同一张表里可能有created相同的记录,并且处于分页的边缘。
MySQL 主从复制添加slave
在已有的MySQL主从复制下添加slave的方法:
方法一:
1、在已有的slave上,执行stop slave io_thread;
,等待Slave_open_temp_tables为0时,执行stop slave sql_thread
;
2、然后执行flush tables with read lock;
和flush logs
;
3、拷贝整个datadir(bin-log、relay-log等信息也要在这里面)内容到new-slave的datadir下;
4、在new-slave上启动mysql后执行start slave;
即可。
Read more...
nginx rewrite
参考ngx_http_rewrite_module,对各种rewrite情况进行了实验,总结一下。
rewrite、location、if的context如下:
- rewrite:server、location、if
- location:server、location
- if:server、location
location匹配规则:
- =:完整的字符串匹配
- ~:大小写敏感的正则匹配
- ~*:大小写不敏感的正则匹配
- ^~:如果最长的前缀匹配有这个修饰符,那么将不再检查正则表达式匹配
location匹配顺序:
- 检查前缀匹配,记录下最长前缀匹配,如果有^~修饰符,则停止搜索;
- 检查正则匹配,第一个匹配到正则后停止搜索,如果没有任何正则匹配,那么将使用步骤1中记录的最长前缀。
Read more...
Laravel service providers/service container/facades
控制反转(IOC)
为了实现应用中组件的配置与使用分离。
例如,我们有一个应用程序叫Text Editor,它有一个组件叫Spell Checking,那么我们的代码可能会像如下:
1
2
3
4
5
6
7
8
9
<?php
class TextEditor
{
private SpellChecker checker;
public __construct() {
checker = new SpellChecker();
}
}
?>
这样的话,TextEditor与SpellChecker就耦合在一起了,TextEditor->checker的实例化完全被TextEditor控制。
Read more...
Zero Copy
学习自Zero Copy I: User-Mode Perspective
什么是zero copy
让我们了解下一个作为通过存储在文件中的数据提供服务的服务器守护进程在传输给客户端时,守护进程的简单处理过程:
1
2
read(file, tmp_buf, len);
write(socket, tmp_buf, len);
在这两个系统调用发生的复制:
Read more...