CentOS 6正式发布,免费的企业级Linux

CentOS 6 正式版已于7月9日发布。

CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同在于,CentOS并不包含封闭源代码软件。

CentOS 6.0 基于上游的 Red Hat Enterprise Linux 6.0 制作,同时基本包含了所有的上游软件包。CentOS 完全遵守上游供应商的再发行政策,并且以百分之百的软件兼容性为目标,但相对于 RHEL ,CentOS 最主要的改变是去除了上游供应商的商标及美工图。

CentOS 6上游版本发行注记和文档:Red Hat Enterprise Linux 6

CentOS 6相对于上游版本 RHEL 6,修改、删除和新增了部分组件,详细情况参阅:发行注记

官方网站:http://www.centos.org/

下载页面:http://www.centos.org/modules/tinycontent/index.php?id=15

敏捷方法中测试人员的价值?

敏捷方法在软件开发中受到青睐,特别是在互联网应用服务系统的开发中,越来越多的公司采用敏捷方法,包括XPScrumLeanCrystalFDD等。具体的敏捷方法在操作时有一些区别,但基本思想是一致的,如客户至上、拥抱变化、缩短迭代周期、自我组织等。在敏捷方法中,流程相对灵活,强调沟通,通过充分的沟通来及时解决问题,由于沟通充分,文档不是很重要,而且有可能不采用Word等独立的文件格式,而是采用Wiki、空间等web内容方式。

在敏捷方法中,需求变化比较快、产品开发周期很短(一、两周),给软件测试带来很大的挑战!例如,功能测试的自动化实现就比较困难,没有足够时间开发自动化测试脚本,要花大量时间讨论产品特性,及时进行产品的验收测试。自动化测试,更多的是在单元测试这个层次上实现。而单元测试自动化、持续集成等一些关键实践,开发人员能发挥更大的作用,而测试人员难以很好地发挥作用。在敏捷方法中,开发人员的主导作用更明显,讨论需求、实现需求,再修改需求、再实现、再重构,不断完善产品,测试人员容易边缘化。甚至在Crystal方法中,可以不需要测试人员,开发人员能承担所有技术性的工作。 在敏捷方法中,测试人员的价值又如何体现?

  1. 首先在需求讨论上,测试人员可以站在客户角度上来阐述自己的观点,和产品人员、开发人员等进行充分的交流和讨论,使自己在用户体验、业务逻辑等等方面的经验充分体现出来。
  2. 在开发过程中,测试人员不仅扮演“用户代表”角色,而且可以及时提供更全面的质量反馈,包括代码质量、接口一致性等。测试人员不写代码,可以参与代码复审(code review),将质量问题及时提交给项目组,保证在产品构造的整个过程中质量受到足够的关注,提高质量改进的持续性和可视性。
  3. 测试人员还是可以参与单元测试。即使单元测试由开发人员做,测试人员可以推进开发人员进行单元测,检查单元测试状态,如确保单元测试达到80%以上覆盖率,以及帮助开发人员开发出具有良好可测试性的代码。
  4. 即使在敏捷方法中,集成测试、端到端(end-to-end)测试、性能测试等是不可少的。因为在敏捷方法中,往往将一个大的系统开发分解成多个小的子系统(模块/组件),集成测试和端到端(end-to-end)测试显得更重要。测试人员在功能测试上工作量会降低,但在这些测试上发挥更大的作用。
  5. 随着迭代的不断深入,回归测试的工作量很大,这也是测试人员的用武之地。 测试人员可以针对稳定的产品特性开发自动化测试脚本,这也是一种持续的努力,使回归测试自动化。
  6. 测试人员对缺陷进行分析,总结出一些规律,帮助开发人员建立良好的习惯,改进代码的质量。

而且:

  • 在敏捷方法中,我们也要采用敏捷测试,不要再写几十页的测试计划书,而是在每个迭代周期,写出一页纸的测试计划,将测试要点列出来。
  • 在敏捷测试中,可能不需要测试用例,而是针对use case 或user story直接进行验证,并进行探索性测试。而节约出来的时间,用于开发原有功能的自动化测试脚本,为回归测试服务。自动化测试脚本将代替测试用例,成为软件组织的财富。
  所以:

敏捷功能测试 = 新特性的手工测试 (use case验证和探索性测试) + 原有功能的自动化测试 (回归测试)

理想情况下,测试人员具有很好的编程能力,可以和开发人员进行角色互换。在当前版本开发(/迭代周期)中担任测试人员角色,在下一个版本开发(/迭代周期)中担任开发人员角色,而开发人员则担任测试人员角色,让开发人员深刻地理解用户的需求角度来考虑系统功能的设计,这样会更好地保证产品的质量,沟通的障碍也会消除,开发的效率会有很大的提高。这也是对测试人员的一个挑战。

敏捷测试也是一个持续测试的过程,而这持续测试的基础是具备一个灵活的、开放的自动化测试框架。测试人员在自动化测试框架构建上、测试工具开发或第3方测试工具前期研究、试用等方面可以发挥主导作用。

项目采用敏捷方法,要获得成功,项目组中每个人都有很强的质量意识,具有质量的主人翁精神,特别是开发人员,每时每刻提醒自己——“质量是构建出来的”,与客户或产品设计人员进行充分沟通,遵守高度一致的质量标准。测试人员将是促进质量文化不断提升的中坚力量。

原作者:朱少民

Hadoop快速入门

目的

这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS)和Map-Reduce框架有所体会,比如在HDFS上运行示例程序或简单作业等。

先决条件

支持平台

  • GNU/Linux是产品开发和运行的平台。 Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证。
  • Win32平台是作为开发平台支持的。由于分布式操作尚未在Win32平台上充分测试,所以还不作为一个生产平台被支持。

所需软件

Linux和Windows所需软件包括:

  1. JavaTM1.5.x,必须安装,建议选择Sun公司发行的Java版本。
  2. ssh 必须安装并且保证 sshd一直运行,以便用Hadoop 脚本管理远端Hadoop守护进程。

Windows下的附加软件需求

  1. Cygwin – 提供上述软件之外的shell支持。

安装软件

如果你的集群尚未安装所需软件,你得首先安装它们。

以Ubuntu Linux为例:

$ sudo apt-get install ssh
$ sudo apt-get install rsync

在Windows平台上,如果安装cygwin时未安装全部所需软件,则需启动cyqwin安装管理器安装如下软件包:

  • openssh – Net

下载

为了获取Hadoop的发行版,从Apache的某个镜像服务器上下载最近的 稳定发行版

运行Hadoop集群的准备工作

解压所下载的Hadoop发行版。编辑 conf/hadoop-env.sh文件,至少需要将JAVA_HOME设置为Java安装根路径。

尝试如下命令:
$ bin/hadoop
将会显示hadoop 脚本的使用文档。

现在你可以用以下三种支持的模式中的一种启动Hadoop集群:

  • 单机模式
  • 伪分布式模式
  • 完全分布式模式

单机模式的操作方法

默认情况下,Hadoop被配置成以非分布式模式运行的一个独立Java进程。这对调试非常有帮助。

下面的实例将已解压的 conf 目录拷贝作为输入,查找并显示匹配给定正则表达式的条目。输出写入到指定的output目录。
$ mkdir input
$ cp conf/*.xml input
$ bin/hadoop jar hadoop-*-examples.jar grep input output ‘dfs[a-z.]+’
$ cat output/*

伪分布式模式的操作方法

Hadoop可以在单节点上以所谓的伪分布式模式运行,此时每一个Hadoop守护进程都作为一个独立的Java进程运行。

配置

使用如下的 conf/hadoop-site.xml:

<configuration>
<property>
<name>fs.default.name</name>
<value>localhost:9000</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

免密码ssh设置

现在确认能否不输入口令就用ssh登录localhost:
$ ssh localhost

如果不输入口令就无法用ssh登陆localhost,执行下面的命令:
$ ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

执行

格式化一个新的分布式文件系统:
$ bin/hadoop namenode -format

启动Hadoop守护进程:
$ bin/start-all.sh

Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).

浏览NameNode和JobTracker的网络接口,它们的地址默认为:

将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -put conf input

运行发行版提供的示例程序:
$ bin/hadoop jar hadoop-*-examples.jar grep input output ‘dfs[a-z.]+’

查看输出文件:

将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output
$ cat output/*

或者

在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*

完成全部操作后,停止守护进程:
$ bin/stop-all.sh

完全分布式模式的操作方法

关于搭建完全分布式模式的,有实际意义的集群的资料可以在这里找到。

 

LVS+Keepalived 介绍

LVS+Keepalived 介绍

LVS

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);
十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)。
Keepalvied
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现

Click here to open new window CTRL+Mouse wheel to zoom in/out

IP配置信息:

  • LVS-DR-Master          192.168.2.166
  • LVS-DR-BACKUP          192.168.2.167
  • LVS-DR-VIP             192.168.2.170
  • WEB1-Realserver        192.168.2.171
  • WEB2-Realserver        192.168.2.172
  • GateWay                192.168.2.253
  • 命令行查看Memcached运行状态

    很多时候需要监控服务器上的Memcached运行情况,比如缓存的查询次数,命中率之类的。但找到的那个memcached-tool是linux下用perl写的,我也没试过windows能不能用。后来发现个简单的办法可以做到,就是使用Telnet。

    首先登录到服务器,然后在cmd命令行中键入

    telnet 127.0.0.1 11211

    其中127.0.0.1是服务器的地址(这里是本机) ,11211是memcached绑定的端口号。

    之后命令行窗口全黑只有光标提示,摸黑输入stats,即可得到描述Memcached服务器运行情况的参数。如下图:

    shell中查看Memcached状态

    其中,uptime 是memcached运行的秒数,cmd_get是查询缓存的次数。这两个数据相除一下就能得到平均每秒请求缓存的次数——最近niupu的流量很低,所以平均也就一秒请求一次多,这么点大的压力,用文件系统缓存一样没问题,根本不会体现出使用memcached的优越。

    下面的cmd_set 就是设置key=>value的次数。整个memcached是个大hash,用cmd_get没有找到的内容,就会调用一下cmd_set写进缓存里。紧跟着是get_hits,就是缓存命中的次数。缓存命中率 = get_hits/cmd_get * 100%。

    下面的get_misses的数字加上get_hits应该等于cmd_get。而total_itemscurr_items表示现在在缓存中的键值对个数,在图上total_items == cmd_set == get_misses,不过当可用最大内存用光时,memcached就会删掉一些内容,上面的等式就不成立了

     

    Ruby on Rails with Nginx on CentOS 5

    Ruby on Rails is a popular rapid development web framework that allows web designers and developers to implement fully featured dynamic web applications using the Ruby programming language. This guide describes the required process for deploying Ruby on Rails with Passenger and the nginx web server on CentOS 5.

     

    These instructions work with the Linode platform. If you don’t have a Linode yet, sign up for a Linux VPS and get started today.

    Contents
    Install Required Packages
    Install Passenger and Nginx
    Set up an Init Script for Nginx
    Install MySQL Support (optional)
    More Information
    License

    Install Required Packages

    Make sure your system is up to date by issuing the following command:

    yum update

    Issue the following series of commands to install packages required for Ruby on Rails.

    yum groupinstall "Development Tools"
    yum install zlib-devel wget openssl-devel pcre pcre-devel make gcc gcc-c++ curl-devel

    The version of Ruby in the CentOS repositories is fairly old; we’ll need to download and compile it ourselves. Check the Ruby language siteExternal Link for a link to the newest stable version and substitute it for the link shown below. Execute the following sequence of commands to get Ruby installed.

    cd /opt
    wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p376.tar.gz
    tar -zxvf ruby-1.9.1-p376.tar.gz
    cd ruby-1.9.1-p376
    ./configure --bindir=/usr/bin --sbindir=/usr/sbin/
    make -j3
    make install

    Now we’ll need to install gems. Issue the following series of commands to download and install a fresh version. You may wish to check the RubyForge files pageExternal Link for the most recent version.

    cd /opt
    wget http://production.cf.rubygems.org/rubygems/rubygems-1.5.1.tgz
    tar -zxvf rubygems-1.5.1.tgz
    cd /opt/rubygems-1.5.1/
    ruby setup.rb

    Update rubygems:

    gem update --system

    Install the rakerack, and fastthread gems:

    gem install rake rack
    gem install fastthread --no-rdoc --no-ri

    Install Passenger and Nginx

    Proceed to the Phusion PassengerExternal Link site and locate the link for the current source code tarball. Download it as follows (substitute the link for the current version):

    cd /opt
    wget http://rubyforge.org/frs/download.php/73563/passenger-3.0.1.tar.gz
    tar xzvf passenger-3.0.1.tar.gz

    Run the Phusion Passenger installer for Nginx:

    cd /opt/passenger-3.0.1/bin
    ./passenger-install-nginx-module

    You’ll be greeted by the Phusion Passenger Nginx installer program. Press “Enter” to continue with the installation.

    Phusion Passenger Nginx installer program running on CentOS 5.When prompted for the Nginx installation method, we recommend you choose “1” to allow the installer to automatically download, compile, and install Nginx for you. Unless you have specific needs that would necessitate passing custom options to Nginx at compile time, this is the safest way to proceed.

    Please do not remove the Passenger files from opt after the install. They need to stay in place or your install will not function correctly.

    Set up an Init Script for Nginx

    Nginx is now installed in /opt/nginx, but there are no “init” scripts to control this process. Issue the following sequence of commands to download a script, move it to the proper directory, set the proper permissions and set system startup links:

    cd /opt
    wget https://library.linode.com/frameworks/ruby-on-rails-nginx/reference/init-rpm.sh
    mv /opt/init-deb.sh /etc/rc.d/init.d/nginx
    chmod +x /etc/rc.d/init.d/nginx
    chkconfig --add nginx
    chkconfig nginx on

    You can now start, stop, and restart Nginx just like any other server daemon. For example, to start the server, issue the following command:

    /etc/init.d/nginx start

    You can now start, stop, and restart Nginx just like any other server daemon. For example, to start the server, issue the following command:

    /etc/rc.d/init.d/nginx start

    If you haven’t already configured your firewall to allow inbound HTTP connections, run the following command to do so now:

    system-config-securitylevel-tui

    The configuration file for Nginx is located at /opt/nginx/conf/nginx.conf. This is the file you’ll need to edit to add support for your Rails applications. A default server is already configured in this file, and it also contains examples for alternate virtual host and SSL configurations.

    Install MySQL Support (optional)

    If your application uses MySQL, install the database server by following our MySQL on CentOS 5 guide. Once it’s installed and configured properly, issue the following commands:

    yum install mysql-devel
    gem install mysql --no-rdoc --no-ri -- --with-mysql-dir=/usr/bin --with-mysql-lib=/usr/lib/mysql --with-mysql-include=/usr/include/mysql

     

    More Information

    You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.

     

    Rapid Development with Rails ( OSDC 演講)

    這是我在 OSDC 2011 的前言草稿。本來是打算週六才打算放出來的,不過目前對岸正在 Twitter 上演 Rails 與 PHP 之爭(詳情請看 @robbinfan@fenng 的大戰),看了手癢。 想了一下,還是把當天的這前十分鐘講稿先放出來好了…

    我的主題是如何善用 Rails 特性達到 Rapid Development。這場 talk 不會有太多的 code,一些觀念上的闡釋和搭配的架構介紹會講比較多。時間是 3/26(六)的下午 2:00 在中研院

    ====

    簡單自我介紹一下,我是 xdite,在 T 客邦工作。我目前的角色是 Lead Developer 與 Manager。中間是有去「出國深造」一陣子 ….不過目前回來了 XD

    我寫 Rails 大約有快四年的時間,之前待過和多PIXNETHTC

    講題概念 ( 澄清關於對 Rails 的一些錯誤認知)

    大概講一下這次會講這個主題的原因:Ruby on Rails 一直以來是一個非常優秀的網頁框架。應該是有始以來最棒的網頁框架,開發者不僅可以從中跟上世界頂尖開發者的研究進度,滿足自己的技術癮之外,又可以穩穩 的兼顧快速的商業需求。很可惜因為種種因素,讓世人對人一直對它停留在非常糟糕的印象(「市場上找不到開發者」且「只適合滿足技術狂人癮頭」的「效率糟 糕」「不穩定」框架)。

    Rails 對於生意與開發上的幫助,絕非只有「Rapid Development」可言。Rails 如果如同大家所說的,只是這種糟糕的玩具,相信也活不到今天,也絕不會有越來越多的開發者、商業網站投入採用。如果各位正在或曾經開發網站,深入把玩過幾 個框架,應該知道 Rails 的架構和想法先進超出其他框架幾個世代之多。

    Rails 的批評者最常對它的指責,總結起來大概就是這句:「市場上找不到開發者」且「只適合滿足技術狂人癮頭」的「效率糟糕」「不穩定」框架。

    以前當我還是很菜的開發者時,聽到這句話會很生氣,但又不知道從何反駁起。但現在再聽到這種批評,我會心理暗笑對方是沒經營過商業網站的外行人。

    事實上:世人的誤解,和真正現實的社會是這樣的:

    PHP 的 Developer 好找,Rails 的 Developer 不好找

    1. 挖來的「有經驗」的開發者,幾乎是不能對現有的團隊帶來戰力的。多數的情況,他只是用一門語言,埋頭重複寫了好幾年,從未自我進修與跟上現有開發技術潮流 的開發者。他寫的 code 通常又會帶著自己的性格(無論是好的或壞的)。在一個團隊中,大家作事如果沒有建立起共同的 convention,越補人往往越只是災難。更或者,有些人寫 code 其實只是寫自己開心寫拿來炫耀的,從來不想考慮商業上的需求和穩定…

    別懷疑,如果你希望有好的開發團隊,請自己養,別去挖別去找。要挖也要挖能幫你建立制度的人,自己也要努力幫忙貢與獻維持制度,也不需要害怕這個 Leader 跑掉,公司建立制度就是為了要保證沒有了誰還不會完蛋。(我出國深造,Team 也沒倒…)

    而且,培養幾個 Rails Developer 的成本,真的比挖一大堆 PHP Developer 的成本便宜很多。

    Rails 只是炫,對商業無貢獻價值

    2. 現實的商業變動需求是很大的。Rails 並非只是五分鐘 CRUD 這種炫,沒辦法成事的東西。Rails 天生的良好的架構可以讓你可以不需要重造輪子,快速達成商業需求。剩下來的時間和力氣,可以用在把產品做的更好更棒。甚至把時間花在把原先的站修整成更好 的架構。

    當開發者不是處於事情多到做不完,每天寫的要死還是 deliver 出一個爛貨的狀態時。他將會有更多時間、精力甚至是心情,學習把事情做得更好更對。

    (事實上,最近公司正在開發的產品,進度遠超過預期,提早三週寫完,RD 剩下來的時間都用在 refactor code,SEO,performance tuning,開心的 tune UI 等等…)

    Rails 效能糟糕透頂,所以使用它會陷入麻煩

    3. Rails 效能是很不錯的,不要被那些謠言騙了。早在 Rails 2.x 時代,效能評測遠遠就幹掉了類似性質(full stack 型)的 framework。而且在公司裡,如果你想跟老闆說你想花時間 tune 效能,它只會回你一句,為什麼不買機器解決就好?Code 乾淨度和效能永遠不是商業運營需要考量的第一重點,除非它嚴重影響了你的商業營運與拓展需求(技術部主管要自己懂得拿捏這一點分寸)。

    而且現實的狀況是,通常買機器的成本會遠比雇用 RD tunning 的成本低。如果還在草創階段,當然還可以咬點牙自己擠一點效能來調度。但別忘了,做生意就是要搞大,搞大了還要賺錢,如果你搞很大還不賺錢,沒有錢買機器,那是你這門生意有問題。不是 Framework 的問題

    永遠都不會是,別本末倒置了。

    Rails 變動過大,跟著升級網站會爛光,成本過高

    4. 「變動太快導致不穩定,維護成本代價太大,所以不想用。」就更暴露了講這句話的人,原本寫的 code 可能本來就很髒、沒有寫 test、沒有用版本控制。更可能的是,根本不知道世界有這些東西的存在 XD

    回頭想想,如果「一個框架」都「不變動」而且「更新不大」,那才令人害怕。那表示這個專案一點價值都沒有,沒人想貢獻。follow 一個沒有價值的專案,那才可怕…

    另外,框架本身變動就需要更新嗎?那也未必,一門生意可以穩穩的跑還可以賺錢,為何要活生生搞爛它?沒事找事做,搞爛它把生意砸掉是你自己個人的愚蠢,從來就不是框架的錯

    採用 Rails 從來不是什麼辦家家酒的決定。如果想讓自己的公司業務快速拓展、自己團隊的開發者能夠迅速的跟上世界領先開發者的腳步、讓自己的開發團隊在寫程式之外,還有餘裕把產品做得更好更棒,你才更該採用 Rails。

    Rails 在坊間的新手教學,基本就可以讓一個初上手的開發者達到一般人眼中的 Rapid Development 了。如果是這種快速 CRUD,很多人當然會說 XXX 也可以,為何一定要選 Rails?

    但這種初階特性,及其開發速度。從來不是 Rails 開發者眼中真正 Rails 的價值,也不是所謂真正的 Rapid Development。今天這個 Talk 的主體,就是深入介紹一些只有進階開發者才知道的 Rails 之美、配合實務務經驗以及商業經驗,來達到真正恐怖的 Rapid Development。

    Rapid Development,其實與 Rails 沒有絕對的正相關。只是 Rails 本身及其生態圈的發展與風氣,對於幫助發展 Rapid Development 有相當強大的正向力量。

    一個專案的成敗,當然不只有開發工具暴力就行,還需要搭配其他的因素,如:團隊管理技巧、專案管理技巧、風險控制、商業運營 …etc.

    不過,如果好的開發工具可以大量節省在開發產品本身時消耗的時間,那麼整個團隊將會有更多精力去專注在其他方向上,整體來說會提昇不小的專案成功機率。

     

    node.js调研与服务性能测试

    这几天对nodejs进行了一下简单的调研

    主要关注这几个方面

    1. socket服务性能,
    2. socket客户端性能
    3. http服务性能.
    4. 服务的稳定性与资源占用
    5. 开发成本

    考虑到今后的应用场景, 实现了一个简单的memcache代理服务.

    内部维护了一个50连接的简单连接池, 通过长连接与memcache服务器相连.
    同时对外提供socket代理服务与http restful服务

    测试环境

    测试使用编译安装的node.js v0.3.1,未使用任何第三方modules
    代理服务与memcache部署在不同的服务器中.
    系统均为rhel 5.2, cpu: AMD Opteron 2200, mem: 4g

    测试用例

    通过此代理程序, 分别使用memcached协议与http协议从memcache服务中取出一个长度为100bytes的值, 并检查最终输出是否正确

    压力工具

    socket: 由于没有找到合适的socket压力工具.用node.js实现了一个简单的socket压力工具
    http: siege 2.70

    测试结论

    服务启动与空载资源占用


    程序启动20秒后,系统资源占用达到稳定状态, 内存消耗13m, 堆尺寸8m
    由堆使用变化可知v8每隔7~8秒会进行一次gc操作

    100并发100秒socket长连接压力


    压力启动后内存占用迅速提高至30m, v8堆也基本维持在22m的水平, 使用率在20%到50%之间波动
    此时v8的gc操作频率降低到约20秒一次.
    qps曲线比较平稳,在16700左右波动,幅度在400左右,v8的gc操作对性能没有明显影响
    压力过程中cpu占用基本维持在95%左右,处于满载状态.
    另, 测试结束后20秒左右, 所占用资源被释放,内存与v8堆均回复至空载水平.

    250并发100秒http长连接压力


    与socket相比, http消耗的系统资源约多出30%,且8v的gc操作也要更频繁
    qps值为4392, gc操作对qps的影响也不明显
    压力过程中cpu占用基本维持在95%左右,处于满载状态.
    与socket时类似, 测试结束后20秒左右, 所占用资源被释放,内存与v8堆均回复至空载水平.

    一些结论

    性能:单cpu, socket 17000 qps, http 4400 qps, 内存消耗30~40m, cpu基本满载
    用作中间层服务时,性能瓶颈基本应位于cpu运算性能.
    v8引擎gc操作带来的性能影响已经可以基本忽略.
    系统的健壮性不错,测试过程中qps与负载曲线基本都处于水平状态.且成功率均为100%
    快速开发, 代理服务与压力工具总计开发时间3~4小时左右, 且最终性能与编译型语言差距不大,但开发时间节省很多
    开发模式上与传统服务器端动态语言区别较大,不熟悉的开发人员需要一些上手时间.

    另,由于时间因素,仅进行了单进程模式下的性能,使用web-worker模型的多进程模式下的性能没有进行测试
    不过由单进程性能可以基本推断,在普通8核服务器下应能做到10万以上的socket, qps, 3万以上的http qps

    总体来说, 非阻塞模式的io处理给nodejs带来在相对低系统资源耗用下的高性能与出众的负载能力, 非常适合用作依赖其它io资源的中间层服务.

    相关源码下载:

    http://nodejs-memcache-proxy-performance-test.googlecode.com/files/nodejs-text.tar.gz
    包括测试程序与socket压力工具.

     

    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 libevent
    lrwxrwxrwx    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     root          263546 11?? 12 17:38 libevent-1.2.so.1.0.3
    -rw-r–r–        1 root     root          454156 11?? 12 17:38 libevent.a
    -rwxr-xr-x       1 root     root          811 11?? 12 17:38 libevent.la
    lrwxrwxrwx    1 root     root          21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3


    还不错,都安装上了,再来安装memcache,同时需要安装中指定libevent的安装位置:


    # cd /tmp
    # tar zxvf memcached-1.2.0.tar.gz
    # cd memcached-1.2.0
    # ./configure –with-libevent=/usr
    # make
    # make install


    如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
    安装完成后会把memcached放到 /usr/local/bin/memcached ,我们看以下是否安装了:


    # ls -al /usr/local/bin/mem*
    -rwxr-xr-x    1 root     root       137986 11?? 12 17:39 /usr/local/bin/memcached
    -rwxr-xr-x    1 root     root       140179 11?? 12 17:39 /usr/local/bin/memcached-debug


    恩,安装完成了,现在我们看以下memcache的帮助:


    # /usr/local/bin/memecached -h
    memcached 1.2.0
    -p <num>            port number to listen on
    -s <file>               unix socket path to listen on (disables network support)
    -l <ip_addr>        interface to listen on, default is INDRR_ANY
    -d                          run as a daemon
    -r                           maximize core file limit
    -u <username> assume identity of <username> (only when run as root)
    -m <num>          max memory to use for items in megabytes, default is 64 MB
    -M                         return error on memory exhausted (rather than removing items)
    -c <num>            max simultaneous connections, default is 1024
    -k                          lock down all paged memory
    -v                          verbose (print errors/warnings while in event loop)
    -vv                        very verbose (also print client commands/reponses)
    -h                         print this help and exit
    -i                          print memcached and libevent license
    -b                         run a managed instanced (mnemonic: buckets)
    -P <file>             save PID in <file>, only used with -d option
    -f <factor>          chunk size growth factor, default 1.25
    -n <bytes>         minimum space allocated for key+value+flags, default 48


    参数不算多,我们来启动一个Memcache的服务器端:
    # /usr/local/bin/memcached -d -m 10  -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid


    -d选项是启动一个守护进程,-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,-u是运行Memcache的用户,我这里是root,-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,如果要结束Memcache进程,执行:
    # kill `cat /tmp/memcached.pid`

    也可以启动多个守护进程,不过端口不能重复。


    【安装Memcache的PHP扩展】


    Memcache就是在服务器监听端口,通过一定的协议交互来写入数据到服务器内存中,或者获取一些值。如果你了解Memcache的交互协议,完全可以自己构建Memcache的客户端,目前网上也有很多构建好的Memcache客户端的PHP Class,可以直接用,不过我这里为了效率,还是决定使用PECL中Memcache的专用扩展,因为毕竟是用C写的,效率比较高,而且安装部署比较方便。


    下载PECL中的Memcache,因为我的客户端是Windows XP,所以需要下载dll版,我的PHP版本是PHP 5.1.4,必须下载PHP 5.1专用的扩展。
    PECL官网:http://pecl.php.net (For Linux)
                           http://pecl4win.php.net(For Windows)
    扩展下载: http://pecl4win.php.net/download.php/ext/5_1/5.1.2/php_memcache.dll


    如果你的PHP是其他版本,请到 http://pecl4win.php.net/ext.php/php_memcache.dll 选择你相应的版本,如果是Linux下的PHP,请到 http://pecl.php.net/package/memcache 选择相应想要下载的版本。


    下载完了以后,我把php_memcache.dll 拷贝到 c:\php5\ext 目录下,如果你的扩展目录是在是缺省路径,(就是没有修改过php.ini中的扩展路径) 请拷贝到 c:\windows\ 目录下,如果是Linux平台,请自己编译安装,可以在程序中使用dl()函数加载,或者在编译php的时候加载进去。最后重启Web服务器,IIS/Apache。


    我的网站目录是在:d:\mysite 目录下,现在建立一个 phpinfo.php 文件在网站根目录下,代码是:
    <?phpinfo()?>
    看有没有成功加载 php_memcache.dll 扩展。如果显示了 Memcache 选项和相应的版本信息,则说明成功加载了,否则请仔细检查上面的步骤。


    如果一切正确无误,那么说明安装成功。


     


    【Memcache初试】


    [ 接口介绍 ]
    服务器端和客户端都安装配置好了,现在我们就来测试以下我们的成果。Memcache客户端包含两组接口,一组是面向过程的接口,一组是面向对象的接口,具体可以参考PHP手册 “LXXV. Memcache Functions” 这章。我们为了简单方便,就使用面向对象的方式,也便于维护和编写代码。Memcache面向对象的常用接口包括:


    Memcache::connect — 打开一个到Memcache的连接
    Memcache::pconnect — 打开一个到Memcache的长连接
    Memcache::close — 关闭一个Memcache的连接
    Memcache::set — 保存数据到Memcache服务器上
    Memcache::get — 提取一个保存在Memcache服务器上的数据
    Memcache::replace — 替换一个已经存在Memcache服务器上的项目(功能类似Memcache::set)
    Memcache::delete — 从Memcache服务器上删除一个保存的项目
    Memcache::flush — 刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目)
    Memcache::getStats — 获取当前Memcache服务器运行的状态


    [ 测试代码 ]
    现在我们开始一段测试代码:



    <?php
    //连接
    $mem = new Memcache;
    $mem->connect(192.168.0.200, 12000);

    //保存数据
    $mem->set(key1, This is first value, 0, 60);
    $val = $mem->get(key1);
    echo Get key1 value:  . $val .<br>;

    //替换数据
    $mem->replace(key1, This is replace value, 0, 60);
    $val = $mem->get(key1);
    echo Get key1 value:  . $val . <br>;

    //保存数组
    $arr = array(aaa, bbb, ccc, ddd);
    $mem->set(key2, $arr, 0, 60);
    $val2 = $mem->get(key2);
    echo Get key2 value: ;
    print_r($val2);
    echo <br>;

    //删除数据
    $mem->delete(key1);
    $val = $mem->get(key1);
    echo Get key1 value:  . $val . <br>;

    //清除所有数据
    $mem->flush();
    $val2 = $mem->get(key2);
    echo Get key2 value: ;
    print_r($val2);
    echo <br>;

    //关闭连接
    $mem->close();
    ?>



    如果正常的话,浏览器将输出:
    Get key1 value: This is first value
    Get key1 value: This is replace value
    Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
    Get key1 value:
    Get key2 value:



    基本说明我们的Memcache安装成功,我们再来分析以下上面的这段程序。



    [ 程序分析 ]


    初始化一个Memcache的对象:
    $mem = new Memcache;


    连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:
    $mem->connect(“192.168.0.200”, 12000);


    保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:
    $mem->set(‘key1‘, ‘This is first value’, 0, 60);


    从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:
    $val = $mem->get(‘key1′);
    echo “Get key1 value: “ .
    $val;


    现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:
    $mem->replace(‘key1’, ‘This is replace value’, 0, 60);
    $val = $mem->get(‘key1’);
    echo “Get key1 value: ” . $val;


    同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出
    $arr = array(‘aaa’, ‘bbb’, ‘ccc’, ‘ddd’);
    $mem->set(‘key2’, $arr, 0, 60);
    $val2 = $mem->get(‘key2’);
    print_r($val2);


    现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果
    $mem->delete(‘key1’);
    $val = $mem->get(‘key1’);
    echo “Get key1 value: ” . $val .
    “<br>”;


    最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接
    $mem->flush();
    $val2 = $mem->get(‘key2’);
    echo “Get key2 value: “;
    print_r($val2);
    echo
    “<br>”;


     



    【Memcache协议分析】


    如果你不喜欢 php_memcache.dll 扩展或者服务器器目前不支持这个扩展,那么就可以考虑自己构建,需要构建Memcahe的客户端,要先了解Memcache协议的交互,这样才能开发自己的客户端,我这里就简单的分析以下Memcache的协议。
    (更详细的协议内容请在Memcache服务器端的源码的 doc/protocol.txt 文件中,本文基本来源于此)


    Memcache既支持TCP协议,也支持UDP协议,不过我们这里是以TCP协议的协议作为主要考虑对象,想了解UDP协议的过程,请参考 doc/protocol.txt 文件。


    [ 错误指令]
    Memcache的协议的错误部分主要是三个错误提示之提示指令:
    普通错误信息,比如指令错误之类的
    ERROR\r\n


    客户端错误
    CLIENT_ERROR <错误信息>\r\n


    服务器端错误
    SERVER_ERROR <错误信息>\r\n


    [ 数据保存指令]
    数据保存是基本的功能,就是客户端通过命令把数据返回过来,服务器端接收后进行处理。
    指令格式:
    <命令> <键> <标记> <有效期> <数据长度>\r\n


    <命令>command name
    主要是三个储存数据的三个命令, set, add, replace
    set 命令是保存一个叫做key的数据到服务器上
    add 命令是添加一个数据到服务器,但是服务器必须这个key是不存在的,能够保证数据不会被覆盖
    replace 命令是替换一个已经存在的数据,如果数据不存在,就是类似set功能


    <键>key
    就是保存在服务器上唯一的一个表示符,必须是跟其他的key不冲突,否则会覆盖掉原来的数据,这个key是为了能够准确的存取一个数据项目


    <标记>flag
    标记是一个16位的无符号整形数据,用来设置服务器端跟客户端一些交互的操作


    <有效期>expiration time
    是数据在服务器上的有效期限,如果是0,则数据永远有效,单位是秒,Memcache服务器端会把一个数据的有效期设置为当前Unix时间+设置的有效时间


    <数据长度>bytes
    数据的长度,block data 块数据的长度,一般在这个个长度结束以后下一行跟着block data数据内容,发送完数据以后,客户端一般等待服务器端的返回,服务器端的返回:


    数据保存成功
    STORED\r\n


    数据保存失败,一般是因为服务器端这个数据key已经存在了
    NOT_STORED\r\n



    [ 数据提取命令]
    从服务器端提取数据主要是使用get指令,格式是:
    get <键>*\r\n


    <键>*key
    key是是一个不为空的字符串组合,发送这个指令以后,等待服务器的返回。如果服务器端没有任何数据,则是返回:
    END\r\n


    证明没有不存在这个key,没有任何数据,如果存在数据,则返回指定格式:
    VALUE <> <标记> <数据长度>\r\n
    <数据块>\r\n


    返回的数据是以VALUE开始的,后面跟着key和flags,以及数据长度,第二行跟着数据块。


    <键> -key
    是发送过来指令的key内容


    <标记> – flags
    是调用set指令保存数据时候的flags标记


    <数据长度> – bytes
    是保存数据时候定位的长度


    <数据块> – data block
    数据长度下一行就是提取的数据块内容


     


    [ 数据删除指令]
    数据删除指令也是比较简单的,使用get指令,格式是:
    delete <键> <超时时间>\r\n


    <键> – key
    key是你希望在服务器上删除数据的key键


    <超时时间> – timeout
    按照秒为单位,这个是个可选项,如果你没有指定这个值,那么服务器上key数据将马上被删除,如果设置了这个值,那么数据将在超时时间后把数据清除,该项缺省值是0,就是马上被删除


    删除数据后,服务器端会返回:
    DELETED\r\n
    删除数据成功
    NOT_FOUND\r\n
    这个key没有在服务器上找到


    如果要删除所有服务器上的数据,可以使用flash_all指令,格式:
    flush_all\r\n

    这个指令执行后,服务器上所有缓存的数据都被删除,并且返回:
    OK\r\n


    这个指令一般不要轻易使,除非你却是想把所有数据都干掉,删除完以后可以无法恢复的。



    [其他指令]
    如果想了解当前Memcache服务器的状态和版本等信息,可以使用状态查询指令和版本查询指令。


    如果想了解当前所有Memcache服务器运行的状态信息,可以使用stats指令,格式
    stats\r\n
    服务器将返回每行按照 STAT 开始的状态信息,包括20行,20项左右的信息,包括守护进程的pid、版本、保存的项目数量、内存占用、最大内存限制等等信息。

    如果只是想获取部分项目的信息,可以指定参数,格式:
    stats <参数>\r\n
    这个指令将只返回指定参数的项目状态信息。


    如果只是想单独了解当前版本信息,可以使用version指令,格式:
    version\r\n
    将返回以 VERSION 开头的版本信息


    如果想结束当前连接,使用quit指令,格式:
    quit\r\n


    将断开当前连接


    另外还有其他指令,包括incr, decr 等,我也不太了解作用,就不做介绍了,如果感兴趣,可以自己去研究。


     


    【Memcache在中型网站的使用】


    使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。


    [ 分布式应用]
    Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。


    但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。


    [ 减少数据库压力]
    这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。


    我考虑的一种简单方法:
    后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。


    缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。


    上面只是我两点没有经过深思熟虑的简单想法,也许有用,那就最好了。


     


    【Memcache的安全】


    我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。


    为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。


    [ 内网访问]
    最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。


    # memcached -d -m 1024  -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid


    Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接



    [ 设置防火墙]
    防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。
    一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。


    # iptables -F
    # iptables -P INPUT DROP
    # iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
    # iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT


    上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。


     


    【Memcache的扩展性】


    Memcache算是比较简洁高效的程序,Memcache 1.2.0 的源代码大小才139K,在Windows平台上是不可想象的,但是在开源世界来说,这是比较正常合理的。
    Memcache目前都只是比较简单的功能,简单的数据存取功能,我个人希望如果有识之士,能够在下面两方面进行扩展。


    1. 日志功能
    目前Memcache没有日志功能,只有一些命令在服务器端进行回显,这样是很不利于对一个服务器的稳定性和负载等等进行监控的,最好能够相应的加上日志的等功能,便于监控。


    2. 存储结构
    目前的数据形式就是: key => data 的形式,特别单一,只能够存储单一的一维数据,如果能够扩展的话,变成类似数据库的格式,能够存储二维数据,那样会让可以用性更强,使用面更广,当然相应的可能代码效率和存取效率更差一些。


    3. 同步功能
    数据同步是个比较重要的技术,因为谁都不能保证一台服务器是持久正常的运行的,如果能够具有类似MySQL的 Master/Slave 的功能,那么将使得Memcache的数据更加稳定,那么相应的就可以考虑存储持久一点的数据,并且不用害怕Memcache的down掉,因为有同步的备份服务器,这个问题就不是问题了。


    以上三点只是个人拙见,有识之士和技术高手可以考虑。


     


    【结束语】


    我上面的内容都只是自己安装和使用的一些想法,不能保证绝对正确,只是给需要的人一个参考,一个推广Memcache的文章,希望更多的人能够认识和了解这个技术,并且为自己所用。


    我花费了整整一个晚上的时间洋洋洒洒的写了这么长,无非是对于这项开源技术的热爱,我想开源世界能够繁荣起来,就是源于大家的热爱并且愿意做出贡献,开源世界才这么精彩。


    希望本文能够给需要的人一些帮助,希望不会误导他们,呵呵。

    利用memcached java client一个简单的应用

    利用memcached java client一个简单的应用


    1.memcached java client一个实现的下载地址


    http://www.whalin.com/memcached/#download
    2.  利用memcached java client 一个简单的应用


    java 代码




    1. package com.danga.MemCached.test;   
    2.   
    3. import java.util.Date;   
    4.   
    5. import com.danga.MemCached.MemCachedClient;   
    6. import com.danga.MemCached.SockIOPool;   
    7.   
    8.   
    9. public class Test {       
    10.     protected static MemCachedClient mcc = new MemCachedClient();      
    11.       
    12.     static {      
    13.         String[] servers ={“192.168.40.4:12000”};      
    14.       
    15.         Integer[] weights = { 3 };      
    16.       
    17.         //创建一个实例对象SockIOPool    
    18.         SockIOPool pool = SockIOPool.getInstance();      
    19.       
    20.         // set the servers and the weights   
    21.         //设置Memcached Server   
    22.         pool.setServers( servers );      
    23.         pool.setWeights( weights );      
    24.       
    25.         // set some basic pool settings      
    26.         // 5 initial, 5 min, and 250 max conns      
    27.         // and set the max idle time for a conn      
    28.         // to 6 hours      
    29.         pool.setInitConn( 5 );      
    30.         pool.setMinConn( 5 );      
    31.         pool.setMaxConn( 250 );      
    32.         pool.setMaxIdle( 1000 * 60 * 60 * 6 );      
    33.       
    34.         // set the sleep for the maint thread      
    35.         // it will wake up every x seconds and      
    36.         // maintain the pool size      
    37.         pool.setMaintSleep( 30 );      
    38.       
    39. //        Tcp的规则就是在发送一个包之前,本地机器会等待远程主机   
    40. //        对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,   
    41. //        以至这个包准备好了就发;   
    42.         pool.setNagle( false );      
    43.         //连接建立后对超时的控制   
    44.         pool.setSocketTO( 3000 );   
    45.         //连接建立时对超时的控制   
    46.         pool.setSocketConnectTO( 0 );      
    47.       
    48.         // initialize the connection pool      
    49.         //初始化一些值并与MemcachedServer段建立连接   
    50.         pool.initialize();   
    51.               
    52.       
    53.         // lets set some compression on for the client      
    54.         // compress anything larger than 64k      
    55.         mcc.setCompressEnable( true );      
    56.         mcc.setCompressThreshold( 64 * 1024 );      
    57.     }      
    58.           
    59.     public static void bulidCache(){      
    60.         //set(key,value,Date) ,Date是一个过期时间,如果想让这个过期时间生效的话,这里传递的new Date(long date) 中参数date,需要是个大于或等于1000的值。   
    61.         //因为java client的实现源码里是这样实现的 expiry.getTime() / 1000 ,也就是说,如果 小于1000的值,除以1000以后都是0,即永不过期   
    62.         mcc.set( “test”“This is a test String” ,new Date(10000));   //十秒后过期   
    63.              
    64.     }      
    65.      
    66.     public static void output() {      
    67.         //从cache里取值   
    68.         String value = (String) mcc.get( “test” );      
    69.         System.out.println(value);       
    70.     }      
    71.           
    72.     public static void main(String[] args){      
    73.         bulidCache();     
    74.         output();          
    75.     }    
    76.       
    77. }      

     



    运行输出值为:



    This is a test String  


     


    3.注释掉buildCache();


    十秒后运行,输出值为 null