Memcache的使用和协议分析详解(php)

Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.net/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linux 缓存 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。(关于Memcache的更多信息请Google)Memcache官方网站:http://www.danga.com/memcached 【安装Memcache服务器端】 我目前的平台,服务器是Fedora Core 1(内核:2.4.22),客户端是Windows XP SP2,需要安装的就是服务器的Memcached的守护进程和客户端的PHP扩展php_memcache两个东西。现在我分别来讲。 服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.2.0 。下载:http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.2。(如果你的系统已经安装了libevent,可以不用安装)官网:http://www.monkey.org/~provos/libevent/下载:http://www.monkey.org/~provos/libevent-1.2.tar.gz 我分别把两个东东下载回来,放到 /tmp 目录下:# cd /tmp# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz 先安装libevent:# tar zxvf libevent-1.2.tar.gz# cd libevent-1.2# ./configure –prefix=/usr# make# make install 然后看看我们的libevent是否安装成功:# ls -al /usr/lib | grep libeventlrwxrwxrwx    1 root     root          21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3-rwxr-xr-x       1 root     […]

Maven入门–概念与实例

Maven入门–概念与实例     最近由于工作原因在研究、应用Maven,有了一些体会就写成了此文。本文虽然是Maven2的入门文章,但并不涉及Maven的历史、下载与安装,这些内容可以到Maven的官方网站上了解。本文主要是关注Maven中的重要概念,并以一个实例来阐述使用Maven的基本方法。文末有例子代码下载的链接。(2007.01.02最后更新) 1 关键名词     Project:任何您想build的事物,Maven都可以认为它们是工程。这些工程被定义为工程对象模型(POM,Poject Object Model)。一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。    POM:POM(pom.xml)是Maven的核心文件,它是指示Maven如何工作的元数据文件,类似于Ant中的build.xml文件。POM文件位于每个工程的根目录中。    GroupId:groupId是一个工程的在全局中唯一的标识符,一般地,它就是工程名。groupId有利于使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。    Artifact:artifact是工程将要产生或需要使用的文件,它可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId和artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中,否则Maven无法找到(识别)它们。    Dependency:为了能够build或运行,一个典型的Java工程会依赖其它的包。在Maven中,这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。    Plug-in:Maven是由插件组织的,它的每一个功能都是由插件提供的。插件提供goal(类似于Ant中的target),并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成的,但它也支持用Beanshell或Ant脚本写成的插件。    Repository:仓库用于存放artifact,它可以是本地仓库,也可以是远程仓库。Maven有一个默认的远程仓库–central,可以从http://www.ibiblio.org/maven2/下载其中的artifact。在Windows平台上,本地仓库的默认地址是User_Home\.m2\repository。    Snapshot:工程中可以(也应该)有一个特殊版本,它的版本号包括SNAPSHOT字样。该版本可以告诉Maven,该工程正处于开发阶段,会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版。2 Maven Build Life Cycle    软件项目一般都有相似的开发过程:准备,编译,测试,打包和部署,Maven将上述过程称为Build Life Cycle。在Maven中,这些生命周期由一系列的短语组成,每个短语对应着一个(或多个)操作;或对应着一个(或多个)goal(类似于Ant中的target)。    如编译源文件的命令mvn compile中的compile是一个生命周期短语。同时该命令也可以等价于mvn compiler:compile,其中的compiler是一个插件,它提供了compile(此compile与mvn compile中的compile意义不同)goal;compiler还可提供另一个goal–testCompile,该goal用于编译junit测试类。    在执行某一个生命周期时,Maven会首先执行该生命周期之前的其它周期。如要执行compile,那么将首先执行validate,generate-source,process-source和generate-resources,最后再执行compile本身。关于Maven中默认的生命周期短语,请见参考资源[6]中的附录B.3。3 标准目录布局    Maven为工程中的源文件,资源文件,配置文件,生成的输出和文档都制定了一个标准的目录结构。Maven鼓励使用标准目录布局,这样就不需要进行额外的配置,而且有助于各个不同工程之间的联接。当然,Maven也允许定制个性的目录布局,这就需要进行更多的配置。关于Maven的标准目录布局,请见参考资源[6]中的附录B.1。4 Maven的优点    [1]build逻辑可以被重用。在Ant中可能需要多次重复地写相同的语句,但由于POM的继承性,可以复用其它的POM文件中的语句。这样既可以写出清晰的build语句,又可以构造出层次关系良好的build工程。    [2]不必关注build工作的实现细节。我们只需要使用一些build生命周期短语就可以达到我们的目标,而不必管Maven是如何做到这些的。如,只需要告诉Maven要安装(install),那么它自然就会验证,编译,打包,及安装。    [3]Maven会自动加载工程依赖的artifact所依赖的其它artifact(Transitive Dependency),而不用显示的将这些artifact全部写到dependency中。    [4]如果完全使用Maven的标准目录布局,那么可以极大地减少配置细节。5 实例5.1 构想    由于只是阐述Maven的基本使用方法,所以本文将要设计的实例,只是一个简单的Maven demo。该实例包含两个工程:普通应用程序工程(app)和Web应用工程(webapp)。app工程提供一个简单的Java类;webapp工程只包含一个Servlet,并将使用app中的Java类。    该Demo的目标是能够正确地将webapp制成war包,以供部署时使用。要能够正确制作war,自然首先就必须要能够正确的编译源代码,且要将App模块制成jar包。本文创建的工程所在的目录是D:\maven\demo。5.2 App工程    可以使用Maven的archetype插件来创建新工程,命令如下:    D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app该工程的groupId是ce.demo.mvn,那么该工程的源文件将放在Java包ce.demo.mvn中。artifactId是app,那么该工程根目录的名称将为app。    当第一次执行该命令时,Maven会从central仓库中下载一些文件。这些文件包含插件archetype,以及它所依赖的其它包。该命令执行完毕后,在目录D:\maven\demo下会出现如下目录布局: app|– pom.xml`– src    |– main    |   `– java    |       `– ce    |           `– demo    |               `– mvn    |                   `– App.java    `– test        `– java            `– ce                `– demo                    `– mvn                        `– AppTest.java因本文暂时不涉及JUnit测试,故请将目录app\src\test目录删除(不删除也没关系 ^_^)。然后再修改App.java文件,其完全内容如下: package ce.demo.mvn;public class App {    public String getStr(String str) {        return str;    }}其实,如果我们能够清楚地知道Maven的标准目录布局,就可以不使用archetype插件来创建工程原型;如果我们要定制个性的目录布局,那么就更没有必要使用archetype插件了。5.3 WebApp工程    我们仍然如创建app工程一样使用archetype插件来创建webapp工程,命令如下:    D:\maven\demo>mvn archetype:create […]

五款常用mysql slow log分析工具的比较

mysql slow log 是用来记录执行时间较长(超过long_query_time秒)的sql的一种日志工具. 启用 slow log 有两种启用方式:1, 在my.cnf 里 通过 log-slow-queries[=file_name] 2, 在mysqld进程启动时,指定–log-slow-queries[=file_name]选项 比较的五款常用工具mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter mysqldumpslow, mysql官方提供的慢查询日志分析工具. 输出图表如下: 主要功能是, 统计不同慢sql的 出现次数(Count),  执行最长时间(Time),  累计总耗费时间(Time),  等待锁的时间(Lock),  发送给客户端的行总数(Rows),  扫描的行总数(Rows),  用户以及sql语句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示). mysqlsla, hackmysql.com推出的一款日志分析工具(该网站还维护了 mysqlreport, mysqlidxchk 等比较实用的mysql工具) 整体来说, 功能非常强大. 数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等. 格式说明如下: 总查询次数 (queries total), 去重后的sql数量 (unique) […]

Spring中基于aop命名空间的AOP

本文地址:http://www.blogjava.net/cmzy/archive/2008/08/23/223870.html下篇地址:Spring中基于aop命名空间的AOP 二(声明一个切面、切入点和通知)     在某些时候,我们工程中使用的JDK 不一定就是1.5 以上,也就是说可能不支持Annotation 注解,这时自然也就不能使用@AspectJ 注解驱动的AOP 了,那么如果我们仍然想使用AspectJ 灵活的切入点表达式,那么该如何呢?Spring 为我们提供了基于xml schematic 的aop 命名空间,它的使用方式和@AspectJ 注解类似,不同的是配置信息从注解中转移到了Spring 配置文件中。在这里,我们将详细介绍如何使用Spring 提供的<aop:config/> 标签来配置Spring AOP 。 1 、一点准备工作和一个例子     使用<aop:config/> 标签,需要给Spring 配置文件中引入基于xml schema 的Spring AOP 命名空间。完成后的Spring 配置文件如下(在该节,所有例程的配置文件中添加了Spring AOP 命名空间,除非特殊情况外,为了节约空间,这部分将在给出的代码中省略),粗体内容即为我们需要添加的内容: 代码   查看源代码copy to clipboard打印 <?xml version=“1.0” encoding=“UTF-8”?>   <beans xmlns=“http://www.springframework.org/schema/beans”           xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”           xmlns:aop=“http://www.springframework.org/schema/aop”           xsi:schemaLocation=”http://www.springframework.org/schema/beans                  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd                   http://www.springframework.org/schema/aop                   http://www.springframework.org/schema/aop/spring-aop-2.5.xsd >   ………… Spring配置信息    </beans>       关于aop命名空间的标签,我们前面使用过的有<aop:aspectj-autoproxy/>,在这一节,我们将以<aop:config/>标签作为重点。事实上,我们在这一节介绍的所有标签都是该标签的子标签。    下面有一个例程来直观的展示如何使用<aop:config/>标签来配置Spring AOP(完整代码见例程4.15)。在例子中,我们使用<aop:config/>配置一个切面并拦截目标对象Peoples的SayHello()方法,在它执行前输出提示信息。首先创建工程AOP_Test4.15,添加Spring […]

EXT2.0 简明教程!

EXT2.0 简明教程!http://www.dojochina.com/?q=node/547EXT官方教程http://www.dojochina.com/?q=node/584EXThttp://www.dojochina.com/?q=node/482#comment-61

Eclipse热键大全~~转滴!

个人常用快捷键 【Content Assist 】:默认为【ctrl+space】与其他快捷建冲突失效,修改为【Alt+/】(原来【Alt+/】为【word completion】的默认快捷键,有了【Content Assist 】这个可以不用了。) (1)Ctrl+M切换窗口的大小(2)Ctrl+Q跳到最后一次的编辑处(3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Description。            F3跳到声明或定义的地方。            F5单步调试进入函数内部。            F6单步调试不进入函数内部,如果装了金山词霸2006则要把“取词开关”的快捷键改成其他的。            F7由函数内部返回到调用处。            F8一直执行到下一个断点。(4)Ctrl+Pg~对于XML文件是切换代码和图示窗口(5)Ctrl+Alt+I看Java文件中变量的相关信息(6)Ctrl+PgUp对于代码窗口是打开“Show List”下拉框,在此下拉框里显示有最近曾打开的文件(7)Ctrl+/ 在代码窗口中是这种//~注释。            Ctrl+Shift+/ 在代码窗口中是这种/*~*/注释,在JSP文件窗口中是<!–~–>。(8)Alt+Shift+O(或点击工具栏中的Toggle Mark Occurrences按钮) 当点击某个标记时可使本页面中其他地方的此标记黄色凸显,并且窗口的右边框会出现白色的方块,点击此方块会跳到此标记处。(9)右击窗口的左边框即加断点的地方选Show Line Numbers可以加行号。(10)Ctrl+I格式化激活的元素Format Active Elements。              Ctrl+Shift+F格式化文件Format Document。(11)Ctrl+S保存当前文件。              Ctrl+Shift+S保存所有未保存的文件。(12)Ctrl+Shift+M(先把光标放在需导入包的类名上) 作用是加Import语句。              Ctrl+Shift+O作用是缺少的Import语句被加入,多余的Import语句被删除。(13)Ctrl+Space提示键入内容即Content Assist,此时要将输入法中Chinese(Simplified)IME-Ime/Nonlme Toggle的快捷键(用于切换英文和其他文字)改成其他的。              Ctrl+Shift+Space提示信息即Context Information。(14)双击窗口的左边框可以加断点。(15)Ctrl+D删除当前行。 Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt+↑ 当前行和上面一行交互位置(同上)Alt+← 前一个编辑的页面Alt+→ 下一个编辑的页面(当然是针对上面那条来说了) Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性 Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)Shift+Ctrl+Enter 在当前行插入空行(原理同上条) Ctrl+Q 定位到最后编辑的地方Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)Ctrl+M 最大化当前的Edit或View (再按则反之)Ctrl+/ 注释当前行,再按则取消注释Ctrl+O 快速显示 […]

基于OO的可移动DIV窗口。

  项目需要一个可移动的DIV窗口,要求调用简单,可以重用。本人马上就考虑到使用OO了。代码如下:     <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”><HTML> <HEAD>  <TITLE> New Document </TITLE>  <META NAME=”Generator” CONTENT=”EditPlus”>  <META NAME=”Author” CONTENT=””>  <META NAME=”Keywords” CONTENT=””>  <META NAME=”Description” CONTENT=””> </HEAD>  <BODY><SCRIPT LANGUAGE=”JavaScript”>  <!–var ie=document.all;var nn6=document.getElementById&&!document.all;var isdrag=false;var y,x;var oDragObj;var qtD = document;function $(id){ return getObj(id);}function getObj(id){ return qtD.getElementById(id);}function cleanDiv(obj){(typeof(obj)==”string”?$(obj):obj).innerHTML=”;} function msgWindow(msgContext){  this.width=400; this.height=300; this.title = ”; this.content = ”; this.context = (typeof(msgContext)==”string”?$(msgContext):msgContext);  this.popup = function(){  var left […]

另类加水印——根据明暗度分别加不同的水印

package image;       import java.awt.AlphaComposite;    import java.awt.Color;    import java.awt.Font;    import java.awt.Graphics;    import java.awt.Graphics2D;    import java.awt.Image;    import java.awt.image.BufferedImage;    import java.awt.image.ColorModel;    import java.awt.image.PixelGrabber;    import java.io.File;    import java.io.FileOutputStream;       import javax.imageio.ImageIO;       import com.sun.image.codec.jpeg.JPEGCodec;    import com.sun.image.codec.jpeg.JPEGImageEncoder;       public class WaterMark {           /**        * 获取指定矩形中的像素的矩阵        *         * @param imageSrc        * @param startX        * @param startY        * @param w        * @param h        * @return   […]

JavaRebel 1.2发布,充分支持Spring

JavaRebel是一个JVM插件(-javaagent),能够即时重载java class更改,因此不需要重新部署一个应用或者重启容器,节约开发者时间。它是一个Java EE和Java 独立应用的常用解决方案。最新的稳定版本JavaRebel代码加载包含一个Spring的插件,能重新加载Spring配置快速的促进生产力的发展,甚至更多。查看Screencast ,下载JavaRebel 和插件 。 这个稳定的JavaRebel主要致力于两个主题:稳定和可扩展性。下面是它与1.1版本的区别: core:增强了core的JavaRebel现在可以处理任何复杂的代码或容器。 SDK:您可以对应用程序和库的任何部分进行增值,无论您身在何处或怎么设置。SDk 为开放源代码。 JavaRebel插件:现在支持自定义的classloaders更容易,容器和框架只需登记一个小插件即可。 Eauinox OSGi容器,现在支持IBM WebSphere 和 Atlassian 混合插件。 查看完整的更新列表 或现在就开始下载JavaRebel。 我们已经准备了一个Screencast来说明Spring插件的功能。查看该插件的安装手册 ,了解更多的详情或现在就下载 。

一个体现Java接口及工厂模式优点的例子

     随着模式概念的普及,了解模式和使用模式的程序员越来越多,很多人在学习模式的时候,都会有这样一种疑惑:“有必要搞得这么复杂吗?”。的确,因为教程的例子过于简单化(这样方便读者学习),或者是作者选例子的时候并没有很好体现所讲模式的优点,很多情况下如果仅就其例子的问题来说,用模式是太复杂了。因此才导致这样的误解:“模式就是把简单的问题复杂化吗?”。当然不是,随着你开发实践的不断丰富,你终会发现模式强大威力,而且模式也并非贵族化的编程方式,它就是一些经过提炼了的解决问题的方法技巧。         通过学习模式,程序员开始告别过去准直线式的代码方式,模式开扩了我们的视野,强化了我们面向对象编程的思维方式。然而现在又出现了另一个普遍的问题,盲目应用模式。模式是问题的解决方案,先有问题才有模式,模式是依附于所要解决的问题的而生的。必须了解模式在很多情况下是以提高代码的复杂度为代价来增强灵活性、可复用性。如果在自已的代码中使用某一模式仅只提高了代码的复杂度,而其它方面收效甚微,或者某部份代码根本就不存在灵活性及高复用性的需求,那么我们就没有必要为使用模式而放弃更直观简单的代码写法。         一流的高手90%精力关注问题的解决方案,因为找到了好的解决方案,再写起代码会很轻松代码也简洁流畅,看这样的代码是一种享受和提高;二流的熟手90%精力关注代码实现,因为问题的解决方案并非最佳,实现的代码也会比较复杂;三流菜鸟记流水帐,90%精力在敲键盘,常常做了大半才发现行不通,回过头来再用90%的时间敲键盘,根本不会用到任何模式,写出来的代码的只有他自已才能看懂。做出来的软件也是支离破碎,做一丁点改动都要大费周折,而且你还不知道改动后会产生什么问题,大有住危房里的感觉。         在这里还是举一个滥用模式的例子吧。我曾参与过一个大集团公司OA系统的第二期开发,开发沿用原有代码架构并增加新的功能模块。文档很少我读原代码时就被它程序里的代码转来转去搞得头大如斗,最后读懂了:原代码架构总体采用工厂模式,而且是最复杂的抽象工厂模式。它把所有模块类都通过工厂生成还工厂套工厂,并且每一个模块类都有一个接口,每个接口也只有一个模块现实类,因为涉及权限控制还用了代理(proxy)模式。 读懂代码后我开始嵌入代码,发现每新增一个类,都要到六个Java文件中去增加相应代码,而在类中每增加一个方法,也要到它的接口等四个Java文件中去增加相应代码。天呀!!!记得当时我的小姆指常会不听使唤,就是因为频繁的使用Ctrl+C 、Ctrl+V,小姆指按着Ctrl键给累的。整个项目组苦不堪言,真烦透了。项目结束后我回顾发现:代理模式用得还对(现在针对权限这类横向控制有AOP编程这种新的解决办法了)但工厂模式在这里根本就是画蛇添足,不仅没有解决什么问题,反而增加代码复杂度和耦合性,降低了开发效率连维护难度都提高了。而且那种每个类简单的加一个接口的方式,更是没有道理,这让我很想说周星驰说过的一句话:“球~~~不是这么踢~~~~的,接口~~~不是这么用~~~的”。言归正传,我们先来看这样一个常见问题:某系统需要支持多种类型的数据库。用过Oracle、MSSQL等数据库的人都知道,它们的SQL编写方式都各有些不同。比如说Oracle的唯一标识自动+1字段用的是序列,MSSQL改一下字段属性就成了,还有各种各自特有的SQL用法。为了支持多数据库,难道我们要开发多套系统?当然NO。请看下面的解决方案。         即然数据库存在多种,我们可以将系统中所有对数据库的操作抽象出来,写成一个个方法组合到一个类中,有几种数据库我们就写几个这样的类。具体设计类图如下:     简要说明: OracleDataOperate、SqlserverDataOperate、MysqlDataOperate,分别代表Oracle、Sqlserver、Mysql这三种数据库的操作类。继承自AbstractDataOperate AbstractDataOperate是一个抽象类,包含了那些不同种类数据库都是一样代码的操作方法。继承自DataOperate DataOperate是上面说的数据操作类的统一接口,只有两个方法:取得一条记录、插入一条记录。 DataOperateFactory是一个工厂方法,统一用它的方法来得到数据库操作类的实例。 SampleClass是我们系统的某个功能模块的类。 People是一个实体类,代表一条记录。三个字段 oid唯一标识符、name姓名、date生日。   详细说明: 1、所有系统功能模块类只认DataOperat这个接口还不必管具体的实现类是OracleDataOperate还SqlserverDataOperate。DataOperate源代码如下: publicinterface DataOperate {     //根据记录的唯一标识取出一条记录     People getPeople(String oid);     //插入一条记录     boolean insertPeople(People people); }   2、AbstractDataOperate、OracleDataOperate、SqlserverDataOperate、MysqlDataOperate都是继承DataOperate接口的,没什么好说的,省略。   3、DataOperateFactory。我们看看工厂方法怎么写的。 publicclass DataOperateFactory {     publicstaticfinalint ORACLE = 0; […]