[转]MySQL+HandlerSocket = MySQL的功能+NoSQL的性能

下文转自国内某PHP大牛的博客,原文链接:http://www.dualface.com/index.php/archives/1124

最近看到一篇博客,用8核服务器跑MySQL达到了每秒750,000次PK(主键)查询。原文网址:http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html(翻墙)。

文章首先分析了MySQL查询时的瓶颈(SQL分析、数据表的打开关闭等),然后介绍了HandlerSocket插件。HandlerSocket插件让MySQL达到了近两倍于memcached的查询性能,灰常的niubi!

                           approx qps     server CPU util
MySQL via SQL                105,000      %us 60%  %sy 28%
memcached                    420,000      %us  8%  %sy 88%
MySQL via HandlerSocket      750,000      %us 45%  %sy 53%

MySQL+HandlerSocket的架构如下图(来自原文):

mysql_handlersocket_thumb.png

从图中可以看到,HandlerSocket开了9998和9999端口,分别用于读写操作。对于基于主键的CRUD操作,客户端通过HandlerSocket进行,省略了SQL分析、数据表的打开关闭等操作。而其他查询仍然通过MySQL的3306端口进行。

相比常见的memcached+MySQL的架构,MySQL+HandlerSocket架构有两个最明显的优势:

  • 节约内存:由于MySQL InnoDB本身就会缓存数据,所以没必要在memcached多保存一份。
  • 避免数据不一致性:引入memcached后,一个很头痛的问题就是保证数据的一致性。而去掉memcached后,由于所有的数据库操作都是直接达到InnoDB引擎,所以完全消除了此问题。

相对于其他NoSQL解决方案,MySQL+HandlerSocket也有优势:

  • 降低应用开发难度:由于SQL提供了丰富的查询功能,相当于大多数NoSQL来说,开发应用时更简单。
  • 降低风险:NoSQL各有特色,选择不慎会造成深远的影响。而且能够完全掌握NoSQL的技术人员也不够普遍,出了问题不一定能够马上解决。

不过,HandlerSocket虽然省掉了一些步骤,但要是内存不足以缓存大部分常用数据。那么HandlerSocket带来的优势就荡然无存了。因此在使用HandlerSocket时,服务器一定要具备足够的内存空间用于InnoDB的Buffer Pool。此外对PHP开发者来说,HandlerSocket目前还没有可用的PHP扩展。

作者说他们已经将HandlerSocket用于了生产环境,取得了很好的效果。作者目前就职于日本最大的社会化游戏平台提供商DeNA

最后,附上HandelrSocket的仓库地址,这是一个开源项目:http://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL

发布一个jQuery插件-Xslider – 令我着迷的jQuery(二)

算是自己写的第一个jQuery插件,js代码很早就写好了,但是因为一个css问题被困住了,直到今天才重新想起。

Xslider:基于jQuery的拉样片特效插件,也可以用作jQuery Tab选项卡,目前支持四种切换特效:X轴、Y轴、渐变和基本,这里是Demo
使用方法很简单:

$("#slider1").Xslider();

自定义选项:

$("#slider1").Xslider({
    affect: 'scrollx', //效果  有scrollx|scrolly|fade|none
    speed: 800, //动画速度
    space: 5000, //时间间隔
    auto: true, //自动滚动
    trigger: 'mouseover', //触发事件 注意用mouseover代替hover
    conbox: '.conbox', //内容容器id或class
    ctag: 'a', //内容标签 默认为a
    switcher: '.switcher', //切换触发器id或class
    stag: 'a', //切换器标签 默认为a
    current:'cur', //当前切换器样式名称
    prebtn: '.pre', //TODO 前一张按钮
    nextbtn:'.next', //TODO 下一张按钮
    recycle:true, //TODO 是否循环
    rand:false //TODO 是否随机指定首张幻灯图片
});

最后说一句,IE6很邪恶,但我爱它的盒子模型。

我常用的gVim配置和插件

这几天一直在Linux底下折腾,免不了怀着一颗装B的心,把gVim打造成一个“接近IDE的编辑器”,再怀着一颗媚俗的心,来这里写一篇《我常用的gVim配置和配置》。但本人确确实实是体会到了gVim的高效,尤其是在使用笔记本键盘的情况下,号称“让你的双手不离开打字区”,这真是个伟大的设计思路。

先上一张我的gVim截图:

怎么样,还行吧,自我感觉挺酷的:-)

下面是我的gVim配置,都写了注释的:

"gVim启动窗口位置 大小
winpos 173 162
set lines=25 columns=108 

"设定文件编码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

syntax on

"配色风格
colorscheme desert

"文本缩进设置
set tabstop=4
set softtabstop=4
set shiftwidth=4
set autoindent
set cindent
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set nu

"如果没有下面这段就拷贝进来吧 虽然不知道干什么的
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif

"设定折叠方式
"set foldmethod=indent

"以下字符将被视为单词的一部分 (ASCII):
"set iskeyword+=33-47,58-64,91-96,123-128

"打开文件自动跳转到上次编辑的行
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

"Get out of VI's compatible mode..
set nocompatible

"Sets how many lines of history VIM har to remember
set history=400

"文件在外部被修改则自动保存
set autoread

" vim用户界面

"Turn on WiLd menu
set wildmenu

"Always show current position
set ruler

"The commandbar is 2 high
set cmdheight=2

"Show line number 显示行号
set nu

"Set backspace
set backspace=eol,start,indent

"Bbackspace and cursor keys wrap to
set whichwrap+=<,>,h,l

"show matching bracets
set showmatch

"How many tenths of a second to blink
set mat=2

filetype plugin on

"同样适用于jQuery的js语法高亮
au BufRead,BufNewFile *.js set syntax=jquery

map  :NERDTreeToggle

nmap   :TlistToggle
let Tlist_Use_Right_Window=1
set tags=tags;/

"对NERD_commenter的设置
let NERDShutUp=1
"支持单行和多行的选择,//格式
map  ,c

" phpDocumentor for VIM
inoremap  :call PhpDocSingle()
nnoremap  :call PhpDocSingle()
vnoremap  :call PhpDocRange()

"对.vimrc配置文件的修改立即生效
autocmd! bufwritepost _vimrc source %

然后是我使用的插件:
NERDTreeToggle :用于导航和打开文件,在上面截图的左边区域
TlistToggle :用于导航代码中的类、变量以及函数(方法)
OmniComplete :代码的自动补全,快捷键是Ctrl+x Ctrl+o,支持很多种语言
NERDCommenter :用于给代码加注释
phpDocumentor :用于给php类和函数加文档 按下alt+/时

非常Cool的滑块导航菜单-令我着迷的jQuery(一)

As is known to us,jQuery是一个短小精悍的javascript library。它以”Write less,do more”的宗旨,以及提供许多成熟的插件及实现,俘获了无数爱偷懒的Programmers的心。今天和大家分享我在项目中使用jQuery编写的一处页面特效,我姑且自顾自的把它称作滑块导航菜单,是一种类似LavaLamp的特效,菜单按钮的背景会有鼠标跟随、以及弹簧动画的特效,很有意思(ps:大家如果有更好的命名方式,荒淫指出,哈哈)。
全部源代码如下,此外Demo地址,荒淫指教:
javascript(除了jQuery,还使用了easing扩展):

$(function(){
	$('#nav_btn_bg').fadeIn(0.2);
	$('#nav_btn').mouseover(function(e){ //这里用到了比事件绑定更高级的事件委托机制
		if(e.target.id=='home') {
			var ml = -5;
		}else if(e.target.id=='sk') {
			var ml = 145;
		}else if(e.target.id=='lottery') {
			var ml = 290;
		}
		$('#nav_btn_bg').stop(true).animate({marginLeft:ml},{easing: 'easeOutBack'});
	});
	$('#nav_btn').mouseleave(function(){
		$('#nav_btn_bg').stop(true).animate({marginLeft:[290,'easeOutBounce'],duration: 800}); //jQuery1.4以后才能这么写
	});
});

HTML(How To Make Love):

CSS样式:

@charset "utf-8";
/* CSS Document */
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,
form,fieldset,input,textarea,p,blockquote,th,td {
padding: 0;
margin: 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
fieldset,img {
border: 0;
}
address,caption,cite,code,dfn,em,strong,th,var {
font-weight: normal;
font-style: normal;
}
ol,ul {
list-style: none;
}
caption,th {
text-align: left;
}
h1,h2,h3,h4,h5,h6 {
font-weight: normal;
font-size: 100%;
}
q:before,q:after {
content:”;
}
abbr,acronym { border: 0;
}
#header{
	width:100%;
	height:175px;
	background:url('head_bg.jpg') repeat-x;
}
#nav{
	width:960px;
	margin:0 auto;
	position:relative !important;
}
#logo{
	display:inline-block;
	width:325px;
	height:70px;
	margin-top:15px;
	float:left;
}
#nav_btn{
	height:60px;
	width:420px;
	float:left;
	margin-top:35px;
	margin-left:45px;
	background:url('nav_btn_bg_06.gif') no-repeat;
	position:relative;
}
#nav_bar{
	position:absolute;
	z-index:2;
}
#nav_btn a{
	display:inline-block;
	width:133px;
	height:55px;
}
#nav_btn_bg{
	width:120px;
	height:55px;
	background:#cccccc;
	-webkit-border-radius:5px;
	-moz-border-radius:5px;
	border-radius:5px;
	position:absolute;
	z-index:1;
	left:0px;
	top:2px;
	opacity:0.2;
	filter:alpha(opacity=20);
	margin-left:290px;
	display:none;
}

如何将删除的Ubuntu面板找回来

刚才因为淘气,把Ubuntu的上下面板都给删除鸟~

在网上搜索到了恢复面板到默认状态的方法如下

打开终端,终端窗口打开之后,立即在提示符后面输入下列命令:
gconftool –recursive-unset /apps/panel
(注意:每个斜杠 “/” 后面没有空格)
接下来输入下列命令:
rm -rf ~/.gconf/apps/panel

最后 重启Gnome,方法是:

Ctrl+Alt+F1登录到终端后

/etc/init.d/gdm restart

不要迷信IETester

今天由于部门唯一的美工Yang请假回家,下面这个页面的头部的切图任务就理所当然的就由我临时客串美工来完成。在做到导航按钮的时候,需要在鼠标移过的时候,背景会出现切换的效果。本来只要在a标签的:hover伪类中把背景图片换成另一张,而我觉得这样的切换太普通,没有什么挑战性。于是我决定试试自己实现类似LavaLamp的效果。

我在按钮下面加了个div作为背景,颜色是#cccccc,并设置透明度是20%。于是在chrome、Firefox和ie7+下,均能正常显示(ie8以下版本浏览器不能显示出圆角),而使用IETester模拟的IE6的下,却出现了不透明度的bug。尝试很多了方法,包括使用jQuery兼容的.css({‘opacity’:0.2})和ie6下的filter:alpha(opacity=20),均是一样的ugly。。如下图:

最后尝试使用原版IE6打开,发现一切正常,哇哈哈。。如果没亲自遇到,实在不敢相信,原先我是迷信ietester的,现在看来只有春哥和曾哥,才值得你信赖。

在JS控制台中使用jQuery

在有些时候,比如你正在浏览我的博客http://x1989.com,并且你想通过浏览器的js console控制台对页面进行调试,而你又不愿放弃熟悉的jQuery语法而使用原生的javascript,这时候只要地址栏中输入以下代码:

javascript:void((function(){var e=document.createElement('script');e.setAttribute('src','http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js');document.body.appendChild(e);})())

以下是在各种浏览器中调出javascript console的快捷键:

IE : F12

Chrome & Opera:Ctrl+Shift+i

FireFox : F12 (必须预装Firebug)

由此,你想到了什么……

Android Layout中使用include标签实现UI布局重用

1、创建一个独立的布局文件作为共享布局,common_layout.xml



  

2、在主布局中使用标签进行包含



    

Javascript中的事件委托(转)

事件的冒泡与捕获

如果不是动态绑定事件,事件委托是可能的。早期的web开发,浏览器供应商都会面临一个严肃的问题,就是当你点击网页中一个区域 什么元素是你实际想要触发的。这个问题伴随着页面元素交互的定义问题,点击任意一个元素的内部边界是模糊的。
点击一个按钮看看,你实际点击在一个按钮元素的内部,也是body元素内部,还是html元素的内部。

当这个问题出现的时候,有两个主要的浏览器:Netscape和IE。他们各自决定以不同的方式解决这个问题。网景公司定义的方法称为事件捕捉,一旦事件触发最先影响到DOM树最顶层对象(document),然后一直影响到事件源。因此,在这个例子中,单击事件的事件捕获最早由document处理,然后在<HTML>元素,然后是<body>,最后是<button>元素。

在IE中处理方式正好相反。 IE团队定义了一个方法称为事件冒泡。事件冒泡说的是,事件源元素的事件应该第一个被触发,那么它的父元素应该接收事件,然后它的父元素的父元素,等等,直到最后document对象接收事件。虽然document没有一个独特的视觉表现从<html>分开,但仍然被认为是<html>的父元素,从而继续冒泡DOM结构顶端。前面的例子可以看<button>首先接收到事件,然后就到<body>,再后到<html>,最后到达document对象。

当定义DOM标准时,W3C组织显然发现了事件的捕获机制与冒泡机制的优点,因而在DOM 2事件制定中支持这两种机制。首先,document对象接收一个事件,然后在捕获期间找到最具体的事件影响的元素,一旦这个元素绑定这个事件,事件将以冒泡的形式返回到document对象。DOM addEventListener() 函数接受三个参数,分别是事件名、事件句柄、支持事件冒泡还是捕获机制布尔值,绝大部分的web开发者会把这个最后那个参数设置为false,以期在IE中能有attachEvent()函数一样功能。

通过一个附加属性来进行事件与事件句柄绑定(element.onclick = function(){}),事件将被自动作为冒泡机制来处理(这是为了向后兼容),几乎每一款浏览器除了IE(即便是IE8)都支持DOM 2事件处理捕获与冒泡机制,而IE仍然只支持冒泡。

在冒泡机制中使用事件委托

事件委托在关键在于使用冒泡处理最顶层元素(通常是document对象),并非所有的事件都会冒泡,但是但鼠标和键盘事件会,也是也我们感兴趣的事件。回顾早先的事例,你可以为document对象绑定一个click事件,然后判断事件源,根据事件源不同来执行不同函数。

document.onclick = function(event){
    //IE doesn't pass in the event object
    event = event || window.event;

    //IE uses srcElement as the target
    var target = event.target || event.srcElement;    

    switch(target.id){
        case "help-btn":
            openHelp();
            break;
        case "save-btn":
            saveDocument();
            break;
        case "undo-btn":
            undoChanges();
            break;
        //others?
    }
};

使用事件委托,可以把众多的事件处理缩减到一个,当前所有click事件都被一个根据事件源不同进行不同操作的函数处理,你还可以以同样的方式创建mousedown, mouseup, mousemove, mouseover, mouseout, dblclick, keyup, keydown,  keypress事件处理程序。还有一句忠告,mouseover、mouseout因为它们的特性决定了他们通过事件委托很难处理。

注:你也可以使用事件捕获机制来建立事件委托,但是它将不能在IE浏览器中运行。

好处:

1,更少的函数管理
2,使用更少内存
3,更少的DOM处理Javascript代码
4,改变DOM元素的innerHTML时不必担心事件绑定被删除

从传统的事件处理转移到事件委托改善了世界各地大型web应用的性能。这项目工作十分重要,YUI与JQuery 已经把事件委托提炼为核心接口。只要花很小的代价实现事件委托,但性能有十分明显的提升。当你把几十个事件处理转化为一个事件处理程序好处显尔益见。进行事件委托的尝试吧,或许你将再也不会使用传统的事件处理方式了。

原文地址http://hzjavaeyer.group.javaeye.com/group/blog/720926 (译)

PHP5.3配置:一定要记得把短标签开起来

要不…就over啦,会直接输出php源代码,discuz ecshop之类的程序都会出现这种状况,唯独只有我自己基于thinkphp开发的程序正常。。估计是tp出于兼容性考虑把模板中的短标签<? ?>处理成兼容的<?php ?>标签了,话说tp的开发者们真是经验丰富哈