-
个人简介:
PHP开发者,高可用性、分布式集群实践者,伪Python、GAE开发者,伪Linux系统管理员,伪MySQL管理员
2009年8月至今服务于阿里巴巴云计算公司
2008年8月至2009年7月31日服务于博客大巴
-
归档
- 2012 年一月
- 2011 年十一月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年四月
-
杂项
标签归档:BlogbusDEV
无知害死人
最近我接连犯了两个比较重大的失误,非常的低级,低级到我无法原谅我自己。 一个是数据删除操作,因为采用全新的框架,不是很熟悉流程,所以在删除前进行了一些断点测试,查看参数调用情况,一直跟踪到核心代码,最后一次测试的时候,字段名没有传入,事实上这完全是我的故意,因为我想知道,字段名没有传入到底框架会给出什么样的错误提示,写了一个这样的SQL语句 DELETE FROM post WHERE ’123456′ AND ‘ 456789′ 这是执行这个语句花了一份多钟,我还以为发生错误了,因为是周六晚上调试的,周日早上睡大觉,运营的同学打电话给我们系统管理员,很多用户反映日志丢失了,我猜想我完了,就昨天我发布了新的功能,因为周末太闲。在mysql 的bin log中查到一条类似如上的SQL语句,转念一想,这个WHERE根本就没用,没有字段的where查询,后面都是true,相当于: DELETE FROM post WHERE true AND true 执行了之后的结果是,整个表被清空!还好我们采用的是分库分表的策略,我删除的不过几百个表中的一个,丢掉近一万个用户数据,最后劳烦我们万能的系统管理员花开同学 从备份中给找回来了。这其中得到神仙的协助, 虽然没有任何人批评或指责我,我永远记得这个教训。 第二个是关键词匹配系统,主要用来查找包含关键字的垃圾文章(spam)。这个是写的第一个完全不需要模板的程序,说白了,就是命令行运行的东西,但还算不上真正意义上CLI程序,关键字存在一个表的一个字段中,以回车分割每个字符,这个是通过另外的一套WEB界面输入的,我提取关键词的方法是explode(‘\n’, $str),结果运行了好几十次,查到的匹配文章少的可怜,今天晚上(2009-03-10)老魏告诉我,每天的spam远远大于我查找的数量,我查到的几乎可以忽略不计,这下我汗颜了,我一直以为是我们所有的用户都非常纯洁,所以才只有那么几个spam,原来是我程序出问题了,之前我都是直接增加一个常用的词进行测试的,比如“的”,查找非常准确,所以我深信我的程序没有问题,最后在刚哥(我刚到Bus时被指定的师傅,一位做了8年开发的牛人)的排查下,原来是windows下的换行和Linux下的换行根本就不是一回事,windows下是以 \r ,Linux下是\n,在将每个关键字trim一下之后,搜20个表就搜了近千篇垃圾文章。 我应该好好检讨我自己,无知有时候真的会害死人,因为不知道,所以死了也不知道怎么死了!
mysql 删除表中的重复记录,只保留其中一条
MySQL中漏掉了40%左右的数据,寻找这个错误的代价是花了三天,将所有的代码重新检查了一遍,由于代码不是我写的,看得晕头转向,上苍保佑,我还不算太笨,最终找到了原因,不过接着就碰到另外一个问题,找回的数据中存在重复,而且在无法在重复的健上建立唯一,于是我想了一个最笨的方法 SELECT * FROM sub_new WHERE email IN ( SELECT email FROM sub_new GROUP BY email HAVING COUNT(email) > 1 ) 这种算法是最傻也是最没出息的算法,在数量在1W的时候还可以接受,到10W就要两分钟了,到50W就死在那里了,所以告诫那些跟我一样天资不算聪明的人,数据量比较大的时候千万别用这种方法,这种类似冒泡排序的算法复杂度是O(n^2),如果你有10W条记录,你自己乘一下吧 接着又想了另外一个方法,虽然机械了点,不过效率非常之高,分三步走: CREATE TABLE tmp AS SELECT * FROM youtable GROUP … 继续阅读
TCP和UDP的区别
中午吃饭的时候,有位老兄,突然从QQ中跳出来,冒出一句:TCP和UDP的区别是什么?我草草的回答了一句,一个是有连接的一个是无连接的。现具体描述如下: TCP/IP 传输层 OSI 和 tCp/Ip 模型在传输层定义两种传输协议:tCp(或传输控制协议)和 UDp(或用户数据报协议)。 UDP UDp 与 tCp 的主要区别在于 UDp 不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误地到达目的地。UDp 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDp。ICQ 短消息使用 UDp 协议发送消息。 许多程序将使用单独的 tCp 连接和单独的 UDp 连接。重要的状态信息随可靠的 tCp 连接发送,而主数据流通过 UDp 发送。 TCP TCP 的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。TCP在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住,较低的网络层会将每个数据包视为一个独立的单元,因此,数据包可以沿完全不同的路径发送,即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组装数据包的方式非常相似,只是级别更高而已。 为 确保正确地接收数据,TCP 要求在目标计算机成功收到数据时发回一个确认(即 ACK)。如果在某个时限内未收到相应的 ACK,将重新传送数据包。如果网络拥塞,这种重新传送将导致发送的数据包重复。但是,接收计算机可使用数据包的序号来确定它是否为重复数据包,并在必要 时丢弃它。