月归档:2011 年二月

面试题

索引设计原则,主从读写分离,垂直分区,水平分区,负载均衡,反向代理,分布式部署,nginx,lighttpd 索引设计原则 http://dev.firnow.com/course/7_databases/mysql/Mysqljs/20090820/168951.html 1. 最合适的索引列是在查询语句中的条件部分经常出现的列。2. 使用唯一值索引。即列值尽可能具有唯一性。3. 使用短索引。如需索引字符串,尽量使用尽可能短的但是能区分列值的长度。较短的列值意味着,缓存中能存放更多的值,也就增加的命中率。4. 利用最左前缀。如果创建了多列索引(n列),则其最作列集也可作为索引来使用。5. 不要过度索引。修改表时数据库需要更新索引,过度的索引不但耗费额外的空间,而且降低了修改更新操作的效率。6. InnoDB中数据按默认顺序存放,尽量设置主键。如果设置了主键,则innodb按主键顺序存放;如果没有,则按唯一索引存放。7. Btree(默认)适合范围搜索,Hash适合单值搜索。   主从读写分离、垂直分区、水平分区 http://itsoul.javaeye.com/blog/777208 1、读写分离:当数据库访问量还不是很大的时候,我们可以适当增加服务器,数据库主从复制的方式将读写分离; (可用mysqlproxy) 2、垂直分区:当写入操作一旦增加的时候,那么主从数据库将花更多的时间的放在数据同步上,这个时候服务器也是不堪重负的;那么就有了数据的垂直分区,数据的垂直分区思路是将写入操作比较频繁的数据表,如用户表_user,或者订单表_orders,那么我们就可以把这个两个表分离出来,放在不同的服务器,如果这两个表和其他表存在联表查询,那么就只能把原来的sql语句给拆分了,先查询一个表,在查询另一个,虽然说这个会消耗更过性能,但比起那种大量数据同步,负担还是减轻了不少; 3、水平分区:但是往往事情不尽人意,可能采取垂直分区能撑一段时间,由于网站太火了,访问量又每日100w,一下子蹦到了1000w,这个时候可以采取数据的进行分离,我们可以根据user的Id不同进行分配,如采取%2的形式,或者%10的形式,当然这种形式对以后的扩展有了很大的限制,当我由10个分区增加到20个的时候,所有的数据都得重新分区,那么将是一个的很庞大的计算量;以下提供几种常见的算法:   哈希算法:就是采用user_id%的方式;   范围:可以根据user_id字符值范围分区,如1-1000为一区,1001-2000则是另一个区等;   映射关系:就是将user_id存在的所对应的分区放在数据库中保存,当用户操作时先去查询所在分区,再进行操作; 对于以上几种扩展方式,读写分离主要是操作上的扩展,垂直分区主要是对写入较频繁数据表的分离,水平分区主要是数据分离; 其他参考: http://fanqiang.chinaunix.net/db/mysql/2006-05-08/4135.shtml   负载均衡:http://wuchengyi.javaeye.com/blog/670260 反向代理:http://baike.baidu.com/view/1165595.htm 可以用apache或者nginx作为反向代理服务器  

发表在 心情随笔 | 标签为 , , | 留下评论

Linux基础

上学时就学了linux,没认真学,前阵子买了本《linux从入门到精通》,做了一些笔记。现在放博客里便于查看。 第5章:shell基本命令.txt shell提示符为”$”,如果是root用户登录,提示符为”#”路径信息格式为:用户名,主机名,当前目录root@ooyue:/var#  如果当前目前为个人用户主目录(root用户为/root,其他用户为/home/xx),当前目录显示为”~”cd /root 后root@ooyue:~# 按Tab可补全命令,如果相同开头的不止一个,连按Tab两次,会显示所有该字符开头的文件 通配符:*,?,[]“*”用于匹配文件名中任意长度的字符串ls *.php “?”类似于”*”,但只能匹配一个字符 “[]“匹配出现在括号内的字符,也可以用”-”指定一个字符集范围,如[1-3] [a-z] [A-Z]ls text[1A]text1  textAls text[1-3]text1 text2 text3 显示当前目录:pwd改变目录:cd (“..”表示当前目录的上一级目录,”.”代表当前目录,空或者”~”代表用户主目录)列出目录内容:ls 默认情况:目录为绿色,普通文件为黑色,可执行文件为草绿色,连接文件为浅蓝色 -F 在目录后加上/,可执行文件加*,连接文件夹@,这个选项在某些无法显示颜色的终端上会比较有用 -a 显示所有文件,隐含文件前面带. -l 详细信息 可组合使用以上参数 ls跟路径名可查看子目录内容 列出目录内容:dir和vdir 比ls功能少,很少用了 vdir相当于ls -l 查看文本文件:cat和more cat可跟多个文件名,-n在每行前显示行号 more 按空格向下翻一页,按enter向下滚动一行 按Q键退出 阅读文件的开头和结尾:head和tail head -n 2 一个或多个文件名 头2行 tail -n 3 一个或多个文件名  尾3行 less 和more类似,比more强大,改进了more的很多细节,并添加了很多特性 less在屏幕底部显示一个冒号,等待用户输入命令,按空格,向下翻一页,按B,向上翻一页,也可以用光标前后左右移动 /内容 高亮显示查找的内容 要继续查找相同的内容,再次输入/ 按回车 -M 可以显示更多的文件信息 … 继续阅读

发表在 Linux | 标签为 , , , , , | 留下评论

php连接oracle的类

php连接oracle需要安装那个啥客户端,现在一般用oci8,linux好像还要编译产生oci8.so,最好把安装时的php压缩包tar.gz 或者tar.bz2留着,以后可能经常要编译扩展so文件,如curl.so等。 dbo_oracle.php: <?class dbo_oracle{ private $username = ‘dw’; private $password = ‘dw’; private $db = “(DESCRIPTION=(ADDRESS=(PROTOCOL =TCP)(HOST=xx.xx.xx.xx)(PORT = 1522))(CONNECT_DATA =(SID=dw)))”; //公网ip通过1522映射到内部1521端口去了  private $conn; private $stid;  public function query( $sql ){  if( !$this->conn )   $this->connect();         $this->stid = oci_parse( $this->conn, $sql );   $res = oci_execute( $this->stid );   return $this->stid; }  public … 继续阅读

发表在 Oracle | 标签为 , , , | 留下评论

【转】HTTP长连接的“服务器推”技术(3) – 讨论

晨:    目前我对comet技术的总体印象是:如果仅限于单向推送数据,那么comet无疑是有效的。 对于双向较频繁交换数据,comet技术会退化成最简单的轮询。 我和方荣的共同想法都认为在双向通讯的时候这样做效率太差。 目前覆盖最广泛的技术里解决这一问题最有效的是Flash AS3中新增的Socket。Socket解决了XMLSocket的一些技术障碍,并且可以使用raw binary data。 理论上可以实现一个通用的Flash长连接组件。

发表在 服务器端 | 标签为 , , , , | 留下评论

【转】HTTP长连接的“服务器推”技术(2) – 转载

基于 Iframe 及 htmlfile 的流(streaming)方式 iframe 是很早就存在的一种 HTML 标记, 通过在 HTML 页面里嵌入一个隐蔵帧,然后将这个隐蔵帧的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。 图 3. 基于流方式的服务器推模型 上节提到的 AJAX 方案是在 JavaScript 里处理 XMLHttpRequest 从服务器取回的数据,然后 Javascript 可以很方便的去控制 HTML 页面的显示。同样的思路用在 iframe 方案的客户端,iframe 服务器端并不返回直接显示在页面的数据,而是返回对客户端 Javascript 函数的调用,如“”。服务器端将返回的数据作为客户端 JavaScript 函数的参数传递;客户端浏览器的 Javascript 引擎在收到服务器返回的 JavaScript 调用时就会去执行代码。 从图3可以看到,每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接, … 继续阅读

发表在 服务器端 | 标签为 , , , , | 留下评论

【转】HTTP长连接的“服务器推”技术(1) – 转载

转载地址:http://www.builder.com.cn/2007/0904/488393.shtml 很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户 端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的“服务器推”方案,着重介绍了 Comet - 使用 HTTP 长连接、无须浏览器安装插件的两种“服务器推”方案:基于 AJAX 的长轮询方式;基于 iframe 及 htmlfile 的流方式。最后分析了开发 Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架-pushlet 构建自己的“服务器推”应用。 “服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求、服务器端响应的方式工作。这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔、LED、温度、电压发生变化; 即时通信系统:其它用户登录、发送信息; 即时报价系统:后台数据库内容发生变化; 这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。“服务器推”技术在现实应用中有一些解决方案,本文将这些解决方案 分为两类:一类需要在浏览器端安装插件,基于套接口传送信息,或是使用 RMI、CORBA 进行远程调用;而另一类则无须浏览器安装任何插件、基于 HTTP 长连接。 将“服务器推”应用在 Web 程序中,首先考虑的是如何在功能有限的浏览器端接收、处理信息: 客户端如何接收、处理信息,是否需要使用套接口或是使用远程调用。客户端呈现给用户的是 HTML 页面还是 Java applet … 继续阅读

发表在 服务器端 | 标签为 , , , , | 留下评论

【转】通过设置P3P头来实现跨域访问COOKIE

欢迎访问火丁笔记:http://huoding.com/ 火丁的订阅地址:http://huoding.com/feed 作者:老王 网上看了别人介绍的一片文章,说使用P3P可以完成跨域COOKIE操作,感觉很COOL,不过没有提供源代码,我胡乱写了一下,大家看看。 实际工作中,类似这样的要求很多,比如说,我们有两个域名,我们想实现在一个域名登录后,能自动完成另一个域名的登录,也就是PASSPORT的功能。 我只写一个大概,为了测试的方便,先编辑hosts文件,加入测试域名(C:WINDOWSsystem32driversetchosts) 127.0.0.1        www.a.com127.0.0.1        www.b.com 首先:创建 a_setcookie.php 文件,内容如下: <?php //header(‘P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘); setcookie(“test”, $_GET['id'], time()+3600, “/”, “.a.com”); ?> 然后:创建 … 继续阅读

发表在 Javascript | 标签为 , | 留下评论

【转】(跨域)JSONP原理 $.getJSON 用法 jquery跨域

简介符合Web2.0特征的众多网站一个明显的特点就是采用Ajax。Ajax提供了在后台提交请求访问数据的功能。其实现主要使用的是XMLHttpRequest函数,这个函数允许客户端的Javascript发送到服务器端的HTTP请求并获得返回数据。Ajax同时也是目前众多的Mashup背后的驱动力量,他们都利用Ajax来聚合不同来源的信息。 理解同源策略的限制同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求地址必须和当前网站的地指相同。同源策略通过隔离来实现对资源的保护。这个策略的历史非常悠久从Netscape Navigator 2.0时代就开始了。 解决这个限制的一个相对简单的办法就是在服务器端发送请求,服务器充当一个到达第三方资源的代理中继。虽然是用广泛但是这个方法却不够灵活。另一个办法就是使用框架(frames),将第三方站点的资源包含进来,但是包含进来的资源同样要受到同源策略的限制。 有一个很巧妙的办法就是在页面中使用动态代码元素,代码的源指向服务地址并在自己的代码中加载数据。当这些代码加载执行的时候,同源策略就不会起到限制。但是如果代码试图下载文件的时候执行还是会失败,幸运的是,我们可以使用JSON(JavaScript Object Notation)来改进这个应用。 JSON和JSONP与XML相比,JSON是一个轻量级的数据交换格式。JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象。例如一个ticker对象   var ticker = {symbol:’IBM’,price:100}而JSON串就是   {symbol:’IBM’,price:100}这样我们就可以在函数的参数中传递JSON数据。我们很容易掌握在函数中使用动态的JSON参数数据,但是我们的目的并不是这个。通过使我们的函数能够加载动态的JSON数据,我们就能够处理动态的数据,这项技术叫做 Dynamic Javascript Insertion。我们看下面的例子index.html中   <script type=”text/javascript”>       function showPrice(data){           alert(“Symbol:” + data.symbol + “, Price:” + data.price);       }              var url = … 继续阅读

发表在 Javascript | 标签为 , , , , | 留下评论

php静态变量和方法

参考《php高级程序设计模式、框架与测试》–人民邮电出版社 静态变量1.静态变量是只存在于作用域的变量,不过,在函数执行完成以后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍会记得原来的值2.将表达式计算出来的结果付给静态变量是不合法的。表达式是指自身的值会发生变化的任何语句,例如(1+1),$variable,anyfunc()都是表达式3.你也许会想,定义静态变量似乎并不是很有用,因为可以用全局变量轻松地获取同样的结果。然而,全局变量可以被所有函数访问,所以如果两个或者更多本来应该是独立的函数使用了相同名称的变量,就会导致冲突;并且,比起引入全局变量,使用静态变量也不需要更多的语法。因此,在只有一个函数需要访问某个变量时,我们应该优先使用静态变量,而不是全局变量。 类中静态元素的使用4.在类中,static关键字有两种主要的用法,一种是用来定义静态成员,另一种是用来定义静态方法。5.静态成员是一种类变量,可以把它看成是属于整个类而不是属于类的某个实例。与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效 的,也就是说,所有的实例共享这个成员。6.$this只表示当前类的实例,self::表示类本身(后面加$)7.作用域限定操作符::通过作用域限定操作符,我们可以使用两个系统定义的作用域:self和parent。此外,php5.3还提供了static作用域。 self表示的是当前类的作用域,不过与$this不同的是,它不表示类的某个特定的实例。在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。也就是说,在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。(相当于java中方法的覆盖,明确调用父类的方法用parent) 重写父类的静态变量就在子类中定义一样的静态变量 <?php class aaa {   function bbb(){   echo ‘用双冒号::调用类的方法!’;   } } 调用1: $a = new aaa(); $a->bbb(); 调用2: aaa::bbb(); ?>  两种方法得到的结果是一样的. 想不明白,为什么普通方法bbb也可以直接用类名::调用,这好像和java里面的不一样Test.javaclass Test{  //普通方法 public  void eat(){  System.out.println(“no-static!”); }  //静态方法 public static void show(){  System.out.println(“static!”); }  //main方法 public static void main(String args[]){   Test … 继续阅读

发表在 Php | 标签为 , | 一条评论

【转】php5.3新增特性及例子:goto语句,命名空间,匿名函数,延迟绑定

 使用命名空间的例子:  匿名函数的例子 goto语句  <?phpnamespace tianfan;function t1(){echo __NAMESPACE__.’_t1′;}use abc;abct1();namespace def;function t1(){echo __NAMESPACE__.’_t1′;}use def;deft1();use abc;abct1();?>  <?php$compare=function($m,$n){$big=function(){echo ‘大’;};$small=function(){echo ‘小’;};if($m>$n)$big();else$small();};$compare(4,6);?>  <?php$a=1;$b=2;if($a>$b)goto big;elsegoto small;big:{echo ‘big’;}small:{echo ‘small’;}?>  延迟绑定  <?phpclass A{public  function m(){echo ‘父级操作的内容’;}public function s(){static::m();//这儿就是延迟绑定了,把static改为self,再运行看看结果}}class B extends A{public  function m(){echo ‘子级操作的内容’;}public function getit(){$this->s();}}$m=new B;$m->getit();

发表在 Php | 标签为 | 留下评论