利用 MySQL 的计算函数 TRUNCATE 对以某单位分段的区间中的每个区间做数据统计

TRUNCATE 方法

Returns the number X, truncated to D decimal places. If D is 0, the result has no decimal point or fractional part. D can be negative to cause D digits left of the decimal point of the value X to become zero.


2014-08-01 SQL

Chrome 的预连接机制是如何破坏 Haproxy HTTP 请求的

最近使用 Chrom 访问生产环境经常得到 408 错误,经查这样的请求都没有到 nginx, 只请求到了 Haproxy。Google 后找到原因:

chrome 有一个预连接页面中 server 以加速浏览的特性。就是加载页面后对页面里链接中的 server 建立一个 tcp 连接(但不真正发出请求),在用户真正发起请求前完成 TCP 握手,这样就可省掉了另一个往返的延迟,大大提高访问速度。通过访问 chrome://dns 可以看到 TCP 预连接的使用情况。

haproxy 在 socket 建立了之后严格按照调置和 http 协议中的约定,当 sockets 建立之后等待一定时间,没有 http 请求上来就会产生一个 408 错误,这时真正的 http 请求通过这个 socket 上来时就会直接收到 haproxy 发出的这个错误.

将 408 错误重定向到 /dev/null 后,haproxy 将不再对 408 错误做出提示,也就是出现 408 之后不返回错误给 client 而是直接关闭 socket。这时当使用 chrome 真正请求资源时,chrome 的预连接已经被关闭,chrome 只能重新发起一个全新的 tcp 完成一次 http 请求,暂避免这个现象。这是一个变通的解决办法。

Chrome 的这个机制 3 年前就有了,为什么最近各 LB 突然出现这个问题,文章中没有给出原因。


2014-06-27 Chrome, haproxy, HTTP

Rails 的单表继承

Rails 内置了非常棒的单表继承 (Single Table Inheritance, STI) 机制。

单表继承

单表继承就是面向对象的继承关系在关系型数据库中的一种表现方法。当数据库中的表映射到代码中的类时 (ORM),代码中的继承关系的不同类可以保存在同一张数据表中。约定的特定中列的内容可以指示出这条记录属于哪个具体继承的类,在 Rails 中,这个列的名字是 type。

如何在 Rails 中实现单表继承

class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end

很直观,当用上面的类创建数据时, companies 表中的 type 会设置成相应的类名。如果没有 type 列,单表继承不会触发,只是写一条普通并区分不开的记录到 companies 表中。


2014-04-07 Rails, Web

Expire Time of Memcached

Source code from Memcached refers to expire time:

#define REALTIME_MAXDELTA 60*60*24*30

/*
 * given time value that's either unix time or delta from current unix time, return
 * unix time. Use the fact that delta can't exceed one month (and real time value can't
 * be that low).
 */

static rel_time_t realtime(const time_t exptime) {
    /* no. of seconds in 30 days - largest possible delta exptime */
 
    if (exptime == 0) return 0; /* 0 means never expire */
 
    if (exptime > REALTIME_MAXDELTA) {
        /* if item expiration is at/before the server started, give it an
           expiration time of 1 second after the server started.
           (because 0 means don't expire).  without this, we'd
           underflow and wrap around to some large value way in the
           future, effectively making items expiring in the past
           really expiring never */
        if (exptime <= process_started)
            return (rel_time_t)1;
        return (rel_time_t)(exptime - process_started);
    } else {
        return (rel_time_t)(exptime + current_time);
    }
}

2014-02-04 memcached, yii

Bloom Filter

场景

判断某个元素是否已经存在于一个大的集合(亿级)中,并容许少量的误报的情况下使用。

实现

初始化 m 位的位数组,被 0 填充。定义 k 个不同的 hash 函数,每个 hash 函数将一个输入元素映射到位数组的一个位上,一个确定的输入则有 k 个索引。


2014-01-19 algorithm

strace

strace 是 Linux 平台和一些类 Unix 平台调试工具,可以方便的查看程序执行时的系统调用和接收到的信号。它几乎存在于所有的 Linux 系统中并且可以解决非常多的问题。


2014-01-16 debug, system tool