Tip: 看不到本站引用 Flickr 的图片? 下载 Firefox Access Flickr 插件 | AD: 订阅 DBA notes -- ![]()
2008-07-30 Wed
原理图

实现方法
* 用 HashMap 来存储和用来做 CacheKey 查找。
* 用一个LinkedList来存储访问顺序列表
* 用一个LinkedList来存储添加时间顺序列表,即过期时间。
* HashMap 中 Key 为 CacheKey, Value 包装成一个CacheObject
* CacheObject 包含:
1) object size
2) 指向 Access List 节点的指针
3) 指向 Age List 节点的指针
其中两个List的作用
1) AccessList
当添加新元素且 List 满时,删除列表最后的元素,即最长时间没有访问的元素。
2) AgeList
当调用 get cache 时候,判断 List 末尾有无过期元素,如有向前一直删除到最后一个没有过期的元素为止。
Performance 性能评测
写了个简单的测试,2线程写 Cache, 4 线程同时读Cache,每个Cache 100字节,平均速度大致为
写cache: 168,924 条/秒
读cache: 605,212 次/秒
结果在相同环境测试比流行的ehcache快大约5倍。
Resource资源下载
DefaultCache 源代码,稍修改去掉没用的引用即可独立使用。
类别:高性能服务器 查看评论
偶然看到,强生全资收购了大宝,大宝化妆品有限公司成为强生(中国)投资有限公司的全资子公司。
一个熟悉的国有品牌又消失了。
这是曾经使用过的熟悉的品牌,有着熟悉的香气、优良的品质以及低廉的价格。
在国际化的过程中,我们已经失去了很多熟悉的品牌,可惜可叹!
最近看到电视广告,百年润发 的品牌经过刘德华的演绎再次出现在市场上,这是让我欣喜的一个再现。
百年润发的品牌在2006年11月,为纳爱斯集团收购。
2006年11月,集团一举全资收购英属中狮公司麾下香港奥妮等三家公司及所属的"百年润发"、"西亚斯"、"奥妮"品牌的独占使用权或所有权,为收购知识产权的实践和自主创新以及企业的更大发展拓展了新的途径。
那么现在看起来,百年润发 至少还是国有品牌:
纳爱斯集团是专业从事洗涤和个人护理用品的生产企业。前身是成立于 1968年的地方国营"丽水五七化工厂",1993年改制为股份公司,2001年组建集团。
回顾一下发哥经典的百年润发广告吧:
再看看刘德华版的:
-The End-
相关文章|Related Articles
评论数量(2)|Add Comments
本文网址:http://www.eygle.com/archives/2008/07/farewell_dabao.html
dbanotes posted a photo:
Red Hat Enterprise MRG is a next-generation IT infrastructure that makes enterprise computing 100-fold faster, defines new levels of interoperability and gives customers competitive advantage by running applications and transactions with greater performance and reliability.
dbanotes posted a photo:
Red Hat Enterprise MRG is a next-generation IT infrastructure that makes enterprise computing 100-fold faster, defines new levels of interoperability and gives customers competitive advantage by running applications and transactions with greater performance and reliability.
Shared by Dev关于《读库0803》,不得不说两句了。
嗷你妈的运
这次的意外出在纸上。我们的纸只有山东一家纸厂能够生产,并且是特种规格,需要订制。早早就下了订单,按照约定,7月中旬之前就应该到货。也就是从7月中旬开始,新书万事俱备,我却陷入频频催纸的境况中。为保证北京的电力供应,山东许多企业被限电,纸厂就这样成了拖拉机厂。
在我上火到牙疼若干天之后,接到纸厂最新版本的电话,纸应该能在月底之前到达。希望如此,否则,运输和发货也许都困难了。
就算是为盛会做贡献吧。...
Shared by Fenng
作者以小人知心度君子之腹
马云在杭州的雕像为何树不起来?是因为马云拒绝了。我想,我这么回答很傻逼,大部分看客会觉得没劲。但中国的大部分媒体就是这么一个逻辑。
你没看到昨天新浪首页两条大新闻吗?这就是阿里巴巴公关的力量。也是中国大部分媒体的愚蠢、世俗之所在。
我跟IT时代周刊的记者早就说过,这个雕像肯定树不起来。说话的时候,是我第一次知道这个消息的时候。我的预言又对了,如同半年年预言阿里巴巴在香港的股市表现。那会儿很多看客听了就不爽,包括部分评论家,居然搬出自己和马云是浙江老乡的理由来跟我辩论。事实胜于雄辩,阿里巴巴的股市神话倒了。接下来,倒下的会是另外一个个神话。
细心的人可以去当当上搜索一下“马云”,看看近2年来究竟出了多少关于阿里巴巴的书。可以告诉大家,我是圈内人,每一本书都是枪手。每一个作者,都是拿了公关费又在装淑女。
所以,很多人会问,为何大家不去追究一下,马云的神话究竟是如何演绎的呢?从阿里巴巴被雅虎收购那天起,马云就声称雅虎的杨致远要听他的。到后来请了克林顿到西湖给他捧场,马云的能量是一般人能比的吗?
马云不仅擅长造神运动,还擅长打击对手,排除异己。这里面,前3721的周鸿祎就是一个受害者。马云最怕的就是周鸿祎这样的真流氓,因为他是个伪君子。所以,围绕周鸿祎出了很多负面新闻。最离谱的是2006年,在新浪科技曾经出来一个稿子“反流氓软件联盟欲状告奇虎”。这里面的阴谋,也只有阿里公关部可以策划出来。因为他们为了公关目的,不惜策划假新闻、杜撰假人物、制造假事件。这跟华南虎没什么两样。然而,中国的大部分IT媒体还都相信,都愿意去追捧。
奥运要开了。终于可以看到真新闻了,因为体育报道大部分还是真实的,谢天谢地。
以下附上某IT社区里关于马云树雕像的帖子回复——
评论之一:马云这个时候越拒绝,马云的神坛就会越高。这个时候马云就需要推辞、推辞、再推辞。这样的话他的公关团队和他的粉丝会把他弄的不是神了,直接如来佛祖
评论之二:某某婉拒某某为自己立像。活着的人只有毛泽东敢为自己立像。马云是不敢的。但不炒作也是不行的。这么好的题材不利用,不是显得咱傻吗?
评论之三:一点都不奇怪,在杭州连老大爷老奶奶都非常喜欢马云,在学校里也都把他当作榜样在学习。。
不过雕塑的话过了一点,因为雕塑一般都是裸体的,而马云这身材,弄一尊裸体雕塑出来,肯定不够艺术。给米开朗基罗丢脸啦~~
评论之四:不知道有没有人能够系统分析一下马云是如何登上神坛的
评论之五:首先是王帅有一功,其次,马云的语言能力是内在原因,中国的弱智媒体是外在原因。
When picking a storage engine I go through a checklist-below is a quick list to get an idea of the thought process.
Do you require transactions?
If yes use INNODB else you may still want to use INNODB?
Are you doing a lot of big queries that Scan 20-30% of the rows?
If yes use MYISAM. It's better at doing large queries where the query requires a full table lock. INNODB will lock each row as it scans through it which hurts query throughput.
Are you building an app to store 1 row and access said row really fast and at a high concurrency?
See Tickets explanation of the example of an application that does this. Innodb hits a lock bottle neck when operating on the same row from many different threads, so it may not be advisable to use INNODB.
Are you building an app that stores a lot of blob data?
Now this is a grey area. With INNODB native zlib compression in 5.1+ INNODB may be a good choice over myISAM, while myISAM historically uses less diskpace then its INNODB counter-part. So, don't be afraid to create a single INNODB table and 100s of MYISAM tables that hold the blob data for INNODB.Why do this? Because a single table in MYISAM will likely lock slowing down blob insertion / removal.
Do you require a lot of reads and writes where the ratio is not 90% reads 20% writes but more like 60/40?
Use INNODB over myISAM. If you don't believe me take a look at
show global status like 'table_locks_waited';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| Table_locks_waited | 82721 |
+--------------------+-------+
These are generic common questions that personally help me find out whats best to use. In reality to pick the correct storage engine, you should experiment and find out whats best for your app. Understand the storage engine-do some testing, then its easy to pick which is best.
Joel Berman explains the ‘G’ part of the MRG offering–the grid. Watch as he demonstrates how the Amazon Cloud can be used to help complete resource-intensive tasks much more quickly.
More information
- MRG overview on redhat.com
- the MRG FAQ
- Amazon Elastic Compute Cloud information from Amazon.com
I use Maatkit for a lot of grunt work and thought you might appreciate this quick tip. Suppose you have a bazillion tables to convert from MyISAM to InnoDB, but they are mixed in with other tables that are already InnoDB, or are another storage engine that you don't want to touch.
-
mk-find <db_name> --engine MyISAM --exec "ALTER TABLE %D.%N ENGINE=INNODB" --print
Here's a bonus tip, while I'm at it. I had a client a while back whose application creates tables as needed, so they had about 90,000 tables in a bunch of different databases, all named things like user_123_456_friends. I wanted to add an index to them -- but not to the ones named friends_123_456_user.
-
mk-find <db_name> --tblregex '^user_\d+_\d+_friends$' --exec 'ALTER TABLE %D.%N ADD KEY(site_id)'
Boy, is that a lot easier than adding indexes to 90k tables by hand!
Entry posted by Baron Schwartz | 2 comments
文。赵二
“你还真拿流氓没辙,就好像你总是只能眼睁睁的看着周鸿祎耍流氓一样。”
“周鸿祎是互联网知名流氓”—这不是我说的,这是我在网络里看到的,我只是引用,所以万一周流氓看到了偶的文字心里不爽,大可以在电脑前痛斥这互联网的肮脏和无耻,支持在痛斥之前,先想一想为啥大伙都称呼您为互联网著名流氓?是不是您老干了太多的可以被称之为流氓的龌龊事?
为了查证“流氓”是否为贬义词,我特意翻了一下字典:流氓原指居所不定之流氓者,后来才慢慢演化为如今的“流氓”意义。流氓就是无业或者不务正业者,这一点是毋庸怀疑的。不过,由于游民无产业,不事劳作,到处游荡,所以有时为了谋生,必然会采取一些不择手段的方式以攫取生活必需品,这种行为方式的实施自然会枝节出“不务正业”等内涵。
周鸿祎是不是流氓,就要看他有没有住所?有没有固定职业?
周鸿祎也算是互联网大亨,所以谁要说他没住所,我肯定和他急,所以这一点上周鸿祎不符合流氓的标准;周鸿祎创办过3721,给雅虎中国打过工,现在既是奇虎的老板,据说也进军天使投资的行业,所以周鸿祎是有固定职业而且有不菲收入的人,从这一点来说,周鸿祎也不算是流氓。
为什么大伙都说周鸿祎-这个互联网潮人是流氓哪?我不禁陷入了沉思?
难道说是广大网民都有眼无珠到了难辨好坏的地步,又或者流氓已经成了一个光耀门庭的金字招牌?所以广大网民才把“流氓”这一称号安到了周鸿祎这尊互联网大仙的头上?
就在我苦思冥想之时,有一个声音从很远的地方传过来,声音既飘渺又絮絮叨叨,有一点像流行的说唱音乐:
“呦,,呦,,流氓软件,,,呦,,呦,,真的善变,,,呦,,呦,,,这是我们的暴利时代,,这就是流氓。,,。,呦,,,呦,,,周鸿祎的时代,,,呦,,,,呦,,,,”
恍然大悟啊,原来大家伙都还记仇啊,大家都记得一代流氓软件之教父周鸿祎啊!人们的眼睛是雪亮的啊,都还记得曾经被流氓软件残害的日子啊!所以大伙还不能原谅这个老老实实做事业的周鸿祎,继续揪住其过往的流氓行径而大加鞭笞!哎,人们群众爱憎很分明啊!
周鸿祎是3721的创始人,3721是流氓软件的鼻祖,这是许多人的印象!
说实话,在互联网行业,3721是一个奇迹,一个属于插件时代的商业奇迹,不论后期毁誉如何,周鸿祎做的3721都应该在互联网产品史留下重要的痕迹!
可是为什么大家都忘记了这一页,而牢牢记住了流氓周鸿祎和他的流氓插件哪?很有可能,我猜测的原因,是因为流氓周鸿祎为了推自己的360而和雅虎中国的那场口水仗!恩,反水,无间道,兄弟反目,等等大戏都在那一仗中上演,可惜啊,最终还是无疾而终的口水仗,害了3721和雅虎中国,火了奇虎和360卫士。
“流氓会武术,谁也挡不住”---周鸿祎会炒作,谁也拦不住!
这话放在互联网圈绝对实用,想一想周鸿祎是怎么推广奇虎和360就可以看出周鸿祎的炒作手法之高明。应该说奇虎做的论坛搜索确实挺好,我挺喜欢,为了这个功能,我是一边腹议着流氓周鸿祎一边在奇虎搜帖子,可惜啊,奇虎没坚持住,改行做问答了!
这更加坚定了我认为周鸿祎是流氓的定义:
前有炮轰3721,不管雅虎与周鸿祎的对错,应该说周鸿祎在3721的时候忽悠了许多的客户,从对客户的意义上来说,周鸿祎就是流氓,一个创造了一个商业模式然后打破模式的流氓,完全忽视客户的利益;从奇虎来说,周鸿祎也是个流氓,论坛搜索对用户挺有吸引力的,可能是因为不赚钱,竟然说抛弃就抛弃,这家伙不流氓,还有谁流氓!!
所以对于周鸿祎的流氓定义应该是这样的:
第一:这家伙太自私,为了利益谁都敢得罪;
第二,这家伙漠视客户的利益,当然这个客户是指以往的;
第三,这家伙太善变,不能坚持,让人无所适从;
写到这里,我已经不知道是夸这个流氓还是贬低这个流氓了,啊门!
周鸿祎就是流氓了,咱们又能怎么样?
你还真拿周鸿祎没辙,古今中外没有谁敢规定一个人是不可以做流氓的,就好像从来也没有规定一个人要做好人一样。
做流氓做到周鸿祎份上,这可不是普通流氓的境界了,想一想互联网教父都拿周鸿祎没辙,更何况我们这些互联网小民。虽然周鸿祎从来都是抱着网民第一,用户第一的口号一样,但是大家伙都觉得这家伙就是一个流氓---虽然说这个圈子里流氓很多,可是日子过的像周鸿祎一样舒坦的可也不多。
认清了周鸿祎的流氓本质,才可以理解周鸿祎最近热炒的免费杀毒的实质了。
“羊毛出在羊身上”“天上不会掉馅饼”这是作为消费者的我们要谨记的;
运营一个公司需要多少钱?
开发和维护一个好的杀毒软件需要多少钱?
如果产品完全免费,公司能否生存?
有人说周鸿祎不收用户的钱,而是收杀毒软件公司的钱?
那么请问,杀毒软件公司的钱从何而来?还不是用户提供的?
难道说就好像有人爆料说周鸿祎又想回去做插件做弹窗收取广告费吗?
杀毒软件免费,确实可行,可是获得的服务和收费肯定是有差异的。这才是事实!
所以别相信周鸿祎这个大忽悠,不然吃亏的可是咱们自己。
本文就是扯淡,偶在免费的争议之后才写就是不想凑那个热闹,在这里只是想谈一些自己对于互联网流氓大亨周鸿祎的崇敬之情,犹如那滔滔江水连绵不绝啊…………….
发表日:2008/7/30
作者:长野雅广(Masahiro Nagano)
原文链接:http://gihyo.jp/dev/feature/01/memcached/0005
前几次的文章在这里:
- 第1次:http://tech.idv2.com/2008/07/10/memcached-001/
- 第2次:http://tech.idv2.com/2008/07/11/memcached-002/
- 第3次:http://tech.idv2.com/2008/07/16/memcached-003/
- 第4次:http://tech.idv2.com/2008/07/24/memcached-004/
我是Mixi的长野。memcached的连载终于要结束了。 到上次为止, 我们介绍了与memcached直接相关的话题,本次介绍一些mixi的案例和 实际应用上的话题,并介绍一些与memcached兼容的程序。
mixi案例研究
mixi在提供服务的初期阶段就使用了memcached。 随着网站访问量的急剧增加,单纯为数据库添加slave已无法满足需要,因此引入了memcached。 此外,我们也从增加可扩展性的方面进行了验证,证明了memcached的速度和稳定性都能满足需要。 现在,memcached已成为mixi服务中非常重要的组成部分。

图1 现在的系统组件
服务器配置和数量
mixi使用了许许多多服务器,如数据库服务器、应用服务器、图片服务器、 反向代理服务器等。单单memcached就有将近200台服务器在运行。 memcached服务器的典型配置如下:
- CPU:Intel Pentium 4 2.8GHz
- 内存:4GB
- 硬盘:146GB SCSI
- 操作系统:Linux(x86_64)
这些服务器以前曾用于数据库服务器等。随着CPU性能提升、内存价格下降, 我们积极地将数据库服务器、应用服务器等换成了性能更强大、内存更多的服务器。 这样,可以抑制mixi整体使用的服务器数量的急剧增加,降低管理成本。 由于memcached服务器几乎不占用CPU,就将换下来的服务器用作memcached服务器了。
memcached进程
每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB, 启动参数如下:
/usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720
由于使用了x86_64的操作系统,因此能分配2GB以上的内存。32位操作系统中, 每个进程最多只能使用2GB内存。也曾经考虑过启动多个分配2GB以下内存的进程, 但这样一台服务器上的TCP连接数就会成倍增加,管理上也变得复杂, 所以mixi就统一使用了64位操作系统。
另外,虽然服务器的内存为4GB,却仅分配了3GB,是因为内存分配量超过这个值, 就有可能导致内存交换(swap)。连载的第2次中 前坂讲解过了memcached的内存存储“slab allocator”,当时说过,memcached启动时 指定的内存分配量是memcached用于保存数据的量,没有包括“slab allocator”本身占用的内存、 以及为了保存数据而设置的管理空间。因此,memcached进程的实际内存分配量要比 指定的容量要大,这一点应当注意。
mixi保存在memcached中的数据大部分都比较小。这样,进程的大小要比 指定的容量大很多。因此,我们反复改变内存分配量进行验证, 确认了3GB的大小不会引发swap,这就是现在应用的数值。
memcached使用方法和客户端
现在,mixi的服务将200台左右的memcached服务器作为一个pool使用。 每台服务器的容量为3GB,那么全体就有了将近600GB的巨大的内存数据库。 客户端程序库使用了本连载中多次提到车的Cache::Memcached::Fast, 与服务器进行交互。当然,缓存的分布式算法使用的是 第4次介绍过的 Consistent Hashing算法。
应用层上memcached的使用方法由开发应用程序的工程师自行决定并实现。 但是,为了防止车轮再造、防止Cache::Memcached::Fast上的教训再次发生, 我们提供了Cache::Memcached::Fast的wrap模块并使用。
通过Cache::Memcached::Fast维持连接
Cache::Memcached的情况下,与memcached的连接(文件句柄)保存在Cache::Memcached包内的类变量中。 在mod_perl和FastCGI等环境下,包内的变量不会像CGI那样随时重新启动, 而是在进程中一直保持。其结果就是不会断开与memcached的连接, 减少了TCP连接建立时的开销,同时也能防止短时间内反复进行TCP连接、断开 而导致的TCP端口资源枯竭。
但是,Cache::Memcached::Fast没有这个功能,所以需要在模块之外 将Cache::Memcached::Fast对象保持在类变量中,以保证持久连接。
package Gihyo::Memcached;
use strict;
use warnings;
use Cache::Memcached::Fast;
my @server_list = qw/192.168.1.1:11211 192.168.1.1:11211/;
my $fast; ## 用于保持对象
sub new {
my $self = bless {}, shift;
if ( !$fast ) {
$fast = Cache::Memcached::Fast->new({ servers => \@server_list });
}
$self->{_fast} = $fast;
return $self;
}
sub get {
my $self = shift;
$self->{_fast}->get(@_);
}
上面的例子中,Cache::Memcached::Fast对象保存到类变量$fast中。
公共数据的处理和rehash
诸如mixi的主页上的新闻这样的所有用户共享的缓存数据、设置信息等数据, 会占用许多页,访问次数也非常多。在这种条件下,访问很容易集中到某台memcached服务器上。 访问集中本身并不是问题,但是一旦访问集中的那台服务器发生故障导致memcached无法连接, 就会产生巨大的问题。
连载的第4次 中提到,Cache::Memcached拥有rehash功能,即在无法连接保存数据的服务器的情况下, 会再次计算hash值,连接其他的服务器。
但是,Cache::Memcached::Fast没有这个功能。不过,它能够在连接服务器失败时, 短时间内不再连接该服务器的功能。
my $fast = Cache::Memcached::Fast->new({
max_failures => 3,
failure_timeout => 1
});
在failure_timeout秒内发生max_failures以上次连接失败,就不再连接该memcached服务器。 我们的设置是1秒钟3次以上。
此外,mixi还为所有用户共享的缓存数据的键名设置命名规则, 符合命名规则的数据会自动保存到多台memcached服务器中, 取得时从中仅选取一台服务器。创建该函数库后,就可以使memcached服务器故障 不再产生其他影响。
memcached应用经验
到此为止介绍了memcached内部构造和函数库,接下来介绍一些其他的应用经验。
通过daemontools启动
通常情况下memcached运行得相当稳定,但mixi现在使用的最新版1.2.5 曾经发生过几次memcached进程死掉的情况。架构上保证了即使有几台memcached故障 也不会影响服务,不过对于memcached进程死掉的服务器,只要重新启动memcached, 就可以正常运行,所以采用了监视memcached进程并自动启动的方法。 于是使用了daemontools。
daemontools是qmail的作者DJB开发的UNIX服务管理工具集, 其中名为supervise的程序可用于服务启动、停止的服务重启等。
这里不介绍daemontools的安装了。mixi使用了以下的run脚本来启动memcached。
#!/bin/sh
if [ -f /etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi
exec 2>&1
exec /usr/bin/memcached -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN $OPTIONS
监视
mixi使用了名为“nagios”的开源监视软件来监视memcached。
在nagios中可以简单地开发插件,可以详细地监视memcached的get、add等动作。 不过mixi仅通过stats命令来确认memcached的运行状态。
define command {
command_name check_memcached
command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p 11211 -t 5 -E -s 'stats\r\nquit\r\n' -e 'uptime' -M crit
}
此外,mixi将stats目录的结果通过rrdtool转化成图形,进行性能监视, 并将每天的内存使用量做成报表,通过邮件与开发者共享。
memcached的性能
连载中已介绍过,memcached的性能十分优秀。我们来看看mixi的实际案例。 这里介绍的图表是服务所使用的访问最为集中的memcached服务器。

图2 请求数

图3 流量

图4 TCP连接数
从上至下依次为请求数、流量和TCP连接数。请求数最大为15000qps, 流量达到400Mbps,这时的连接数已超过了10000个。 该服务器没有特别的硬件,就是开头介绍的普通的memcached服务器。 此时的CPU利用率为:

图5 CPU利用率
可见,仍然有idle的部分。因此,memcached的性能非常高, 可以作为Web应用程序开发者放心地保存临时数据或缓存数据的地方。
兼容应用程序
memcached的实现和协议都十分简单,因此有很多与memcached兼容的实现。 一些功能强大的扩展可以将memcached的内存数据写到磁盘上,实现数据的持久性和冗余。 连载第3次 介绍过,以后的memcached的存储层将变成可扩展的(pluggable),逐渐支持这些功能。
这里介绍几个与memcached兼容的应用程序。
- repcached
- 为memcached提供复制(replication)功能的patch。
- Flared
- 存储到QDBM。同时实现了异步复制和fail over等功能。
- memcachedb
- 存储到BerkleyDB。还实现了message queue。
- Tokyo Tyrant
- 将数据存储到Tokyo Cabinet。不仅与memcached协议兼容,还能通过HTTP进行访问。
Tokyo Tyrant案例
mixi使用了上述兼容应用程序中的Tokyo Tyrant。Tokyo Tyrant是平林开发的 Tokyo Cabinet DBM的网络接口。它有自己的协议,但也拥有memcached兼容协议, 也可以通过HTTP进行数据交换。Tokyo Cabinet虽然是一种将数据写到磁盘的实现,但速度相当快。
mixi并没有将Tokyo Tyrant作为缓存服务器,而是将它作为保存键值对组合的DBMS来使用。 主要作为存储用户上次访问时间的数据库来使用。它与几乎所有的mixi服务都有关, 每次用户访问页面时都要更新数据,因此负荷相当高。MySQL的处理十分笨重, 单独使用memcached保存数据又有可能会丢失数据,所以引入了Tokyo Tyrant。 但无需重新开发客户端,只需原封不动地使用Cache::Memcached::Fast即可, 这也是优点之一。关于Tokyo Tyrant的详细信息,请参考本公司的开发blog。
总结
到本次为止,“memcached全面剖析”系列就结束了。我们介绍了memcached的基础、内部结构、 分散算法和应用等内容。读完后如果您能对memcached产生兴趣,就是我们的荣幸。 关于mixi的系统、应用方面的信息,请参考本公司的开发blog。 感谢您的阅读。
最近遇到一种情况,开发团队把开发过程中的反复、出现大量的bug等问题的根源归于需求文档,希望文档写的更详细,更确定。测试团队把bug的反复、新功能缺乏开发工程师自测等问题归于需求文档,希望文档写的更详细,更确定。现在因为还没有法务、客服、BD、市场等等其他部门的同事,因此还没有得到他们的反馈。唯一的欣慰是产品团队和设计师、前端工程师的沟通比较频繁和畅通,因此对方没有提及这个问题。在这个问题上我认为产品经理不是神,需求文档不是银弹,软件工程许多年来的问题通过产品经理解决是不可能的,通过需求文档解决更是不可能的。
对于要求产品经理全程跟踪产品,把握每个细节和过程的意见我很赞同,我认为,产品经理是虚拟团队的领导者,是项目、产品的CEO。还能有谁更清除产品的所有细节?如果产品经理不去全程关注谁回去关注?管理一个产品就要管理它的方方面面,管理它的前世今生。
对于加强流程的建立,加强评审机制的意见我也很赞同,流程很重要,多成员、多角色的项目中流程很重要。每个人的思维和意识都是有局限的,每个人的经验和能力也是有局限的,我们中间的所有人都不是天才,没有人可以完全的独当一面、力挽狂澜。任何产品都需要不同工种同事的讨论、建议甚至是拍砖,这样才能汇聚大家的智慧,帮助产品经理完善产品的细节。
对于细化文档的意见我也很赞同,文档很重要,虽然有很多比文档更重要的东西,但文档还是很重要。我们的每次思考、每次讨论,每次会议、每次变更都要体现在文档上。我们每个人的脑子都会遗忘,俗话说好记性不如烂笔头子说的就是这个道理。通过语言的表达根据时间、表情、语气的不同会产生信息传递的偏差。产品的复杂性决定了需求的复杂性,自身的逻辑性和环境内其他部件之间的关联等内容让我们不得不采用结构化文档的方式来记录。文档在一些时候也可以提高交流的效率,特别是一对多的时候。文档也可以是一个存档式的东西,后续版本的需求变更要依据它,项目成员更替也需要它。
但………………
产品经理不是万能的,应该解放产品经理,现实的情况是产品经理要做很多事情,完全和我之前提到的“超级产品经理”的情况相反。和管理层沟通,领会公司的策略和方向。和用户沟通,满足用户的需求。和各种角色的同事沟通,领导大家一起出力。关注公司内外的资源,做项目管理,保证资源,保证沟通,保证进度,保证结果。靠产品经理一个人大权独揽,什么都干,显然是不行的。我觉得靠谱儿的办法应该是有专职的项目经理,别以为这个时候项目经理会闲得慌,专职的项目经理应该很忙。而产品经理的主要关注点应该回归到产品要满足的需求上面,充分考虑和调研用户的需求,做充分的数据分析和行业观测,保证产品路线协同公司的发展规划。说到底,就是我觉得应该解放产品经理,不让他们兼职做项目经理的事情。
流程对项目本身也会起到负面的影响,互联网上的应用要求快速决策、快速开发、快速响应。要求产品团队及时调整、及时变更、及时应对。要求技术团队做敏捷开发,做快速响应,不断重构。使用快速原型的方式活其他更灵活的方式进行迭代式开发,而不是采用传统的瀑布式的项目开发方式。我希望项目团队中的每个人都是产品经理,每种角色都贯穿于产品的生命线。产品经理只是个“主事儿”的而已,产品经理决定做什么,其他角色决定怎么做。
文档是问题的一部分而不是解决问题的一部分,写文档只占产品经理工作的很小一部分,产品经理更多的工作是在思考和沟通。一个产品从无到有,在产品经理的脑海中逐渐成型,经过和不同角色人员的沟通不断的完善,最终通过撰写的文档体现出来。撰写文档相对简单,占用的人力资源也少。这就像系统设计往往需要较多的时间,具体编码的时间相对较少。
靠产品经理来试图解决软件工程这么多年的问题是不可能的,产品经理撰写的需求文档无法解决项目延期的问题、无法解决软件维护复杂的问题,无法解决成本过高的问题。难道产品经理写个80页的详细需求文档就可以放假回家了码?产品就可以完美开发了?用户就喜欢了?公司就挣到钱了?其实文字只是沟通方式的一种而已,要充分利用这种沟通方式但也不能过于依赖。产品经理要写多少文档才可以?市场需求文档、产品需求文档,会议纪要,方案,策划,规范,文档文档还是文档!产生更多的文档肯定不能更好的解决问题,达成项目的目标。
我相信写个80页的文档不会有几个人会仔细的看,那么这个文档给谁看?给领导看?给开发工程师看?给设计看?给前端工程师看?给客服看的?给法务看的?给商务看的?给市场看的?他们要看的、能理解的东西一致吗?产品经理写的需求文档能满足所有的需求吗?一定不能满足。这时候就需要短平快的去通过各种方式去沟通,包括文字、图像和语言。
另外就是我一直坚持的一个观念,产品经理的人力资源无法预估!开发可以根据产品需求文档预估,根据页面数、产品复杂程度、安全级别等内容进行人力预估,测试可以以开发时间的一半来预估。但产品经理的工作如何预估?答案是没有人可以预估。但现实是领导总会对产品经理的人力资源做预估,或者产品经理迫于某些压力自己做人力资源的预估。这样的情况很普遍,但是需要改变,给产品经理一个相对宽松的环境来工作。



A simple way to view just the suggestions is to use:
http://www.cuil.com/suggest?q=click here (replace "click here" with your search). You'll notice that the results are very different than the suggestions from Yahoo, Google or Ask.
最近在优化网站内容
其中一个部分就是压缩JS以及CSS程序
比较常见的就是DOJO的ShrinkSafe
以及jsmin,ESC
不过taobao团队使用yuicompressor作为底层开发了windows下的jsMinifier
jsminifier.rar下载
目前版本2.0
使用yuicompressor+native2ascii
对于YAHOO的工具
我还是比较信任的
毕竟他们的performance团队的工作成果
是世人皆知的
雲(Cloud)是網路的象徵,所以雲端運算(Cloud Computing),最廣義的解釋就是「網路運算」。這恐怕是目前大家對於雲端運算的最大公約數,在這之外,大家對於雲端運算的理解和定義,都不太一樣。這篇文章試圖用最淺顯的方式,向大家說明我所知道的雲端運算。
網路是由許多伺服器所組成,雲端運算的基礎是大量的伺服器。如果只用一部超級電腦當伺服器,一樣可以提供相當大的運算威力,這樣可以算是雲端嗎?恐怕不行,因為雲端運算強調的是許多伺服器聯合起來提供強大的運算能力。只有一部超級電腦或少數幾部電腦,恐怕太薄弱,無法形成雲,充其量是「水蒸氣」。
良好的雲端運算架構方式,必須具備規模彈性、容錯、平衡負載。當運算規模增加,雲端要可以彈性變大,只要加上新的節點就可以了,這樣的能力稱為水平擴充(horizontal scalability)。資料重複(redundancy)存放在不同位置,確保資料安全。讓伺服器之間的負載盡量平衡,免得某些伺服器太忙,某些卻太悠閒。
既然雲端運算是將許多電腦聯合起來提供運算能力,那麼就會用到網格運算(grid computing)。比較知名的網格運算應該是SETI(尋找外星人)計畫,幾年前SETI流行時,許多人的電腦都下載安裝了SETI程式,奉獻出電腦多餘的運算能力,為尋找外星人這種無聊之舉貢獻心力。
以往的網格運算似乎是供專家使用居多,著重在需要複雜運算的「單一任務」,例如基因定序、核爆模擬。但雲端運算則比較偏大眾應用,相當高比例的大眾應用其實不需要進行複雜的運算,但是由於「大眾」相當多,所以累積起來的運算需求也相當可觀。所以在應用上,雲端運算可以被視為平民化的網格運算。
除了上述的差別,雲端運算和網格運算的差別還有兩點。第一,為了方便管理,並充分運用伺服器的效能,雲端運算也經常會使用到「虛擬化」技術。第二,以往的網格運算通常也只使用專屬的應用協定和資料格式,但雲端運算則受到近年Web潮流的影響很深。
雲端運算的願景是以Web為前端,資料全都放在後端,不放在使用者手上。如此一來使用者可以不用擔心不同裝置上資料同步化的問題,也可以隨時取用資料(如果網路沒斷線的話)。既然資料都放在雲端,運算都在雲端進行也就理所當然。因為這樣的效率最好,可以減少資料在使用者和雲端之間的傳輸。
至於Web前端,微軟和Adobe等公司會希望你使用他們各自的RIA技術,但IBM、Google、Apple等沒有RIA技術的廠商,則會希望你使用Web瀏覽器(JavaScript/CSS/HTML),以免被(其他)廠商綁死。
除了Web瀏覽器和RIA之外,許多標準的應用也會隨著雲端運算的興起,開始支援從雲端開啟文件,或寫入文件到雲端,這些讀寫的動作會透過標準的HTTP協定、FTP協定、或WebDAV來達成。說不定以後軟體在「File」選單中,除了「Save」、「Save As」之外,還會多出一個「Save To Cloud」。
但是雲端畢竟是在遠方,資料的存取速度自然遠比不上自己電腦上的硬碟。所以除非客戶端連線到雲端的速度夠快,否則這會成為推廣雲端運算的障礙。更不用提萬一像Google App Engine來個大斷線、或者太平洋海底電纜斷線,頓時白雲變烏雲,你可就求救無門了。
在雲端的廠商會將服務列在網頁上,讓你選擇要執行的程式。這些雲端上的程式都可以設定參數,以記錄你的名稱、喜好,以提供更好的服務。甚至過去的一舉一動,也會被記錄下來,你的隱私資料成為廠商的資產。如果公司利用雲端處理ERP/CRM等資料,那麼公司的運作機密以及客戶資料也都會被雲端的廠商知道。是的,雲端廠商都會強調他們重視顧客的權益,這就看你信不信了。
除了可以使用廠商原本就提供的雲端程式,利用參數設定來符合自己需求之外,你也可以上傳程式到雲端。Google App Engine允許你將程式上傳到雲端,在雲端執行。使用Google App Engine,可以省去你建置與管理伺服器的困擾。上傳程式一樣有暴露機密的可能,如果你是一家搜尋引擎的公司,你發明了比Google更準確的搜尋演算法,你敢把這樣的服務放到Google的雲端上,只是為了省去「建置與管理伺服器的困擾」嗎?
廠商提供這類的服務,都會限定所使用的語言和框架。Google目前只支援Python和相關的Web框架。以後才會支援其他語言和框架。Python是最適合雲端的語言嗎?恐怕不是,但應該已經符合大眾的需求。你的Python程式會被Google複製到不同的伺服器上各自執行,這樣的程式無法協同完成一件複雜的任務(例如基因定序)。比較適合雲端的語言其實是函數式語言,例如Erlang。而微軟預計會以F#當作雲端運算的語言。
綜觀目前的狀況,雲端運算正在一團雲霧之中,渾沌未明。雲端運算目前充滿不確定因素,太多事情的發展很難預料。我認為,妄想漫步在雲端,而太早踏入,小心你一腳踩空。
最近在Field的帮助下完成了fetion短信报警,下面以磁盘空间报警为例(采用的是Solarwinds报警后自动执行VbScript调用飞信机器人发送短信报警)
- 一、 软件环境(Windows 2003为例)
Solarwinds+飞信机器人
- 二、 安装过程
飞信机器人下载包地址:
WINDOWS(2000/XP/VISTA):支持库 最新程序fetion20080618002-win32.rar
其中支持库和安装包如下:
fetion20080618002-win32.rar解压缩你指定的目录,支持库 的内容解压缩后复制至和fetion.exe同一目录即可
- 三、 配置过程
- 1. Solarwinds报警配置磁盘空间监控
在上图中的Configure Alerts中新建报警DiskStatus,按照你的需要配置监控的服务器,报警的条件,监控的周期等,然后按照下图配置满足报警要求后的Action
按照上图添加2个Alert Action
Alert Action 1:log the alert to a file将报警保存为alter.log(可随意指定文件名和目录)
Alert Action 2:Execute an external VBScript指定要执行的VbScript,请将VbScript放在fetion的安装目录下,因为下面的VbScript指定的路径是相对路径
备注:请一定要先设置报警保存的log,然后在设置要执行的VbScript,因为只有先生成log,然后在执行VbScript读取log中的短信报警信息,设置好后如下图:
配置生效后应该先生成log然后执行VBScript发送短信
- 2.Log样本如下:
Alert: Percent Space Used of 100.121-D:\ is now 84 %
Alert: Percent Space Used of 100.102-C:\ is now 82 %
- 3. VBScript如下:
fetion_exec="G:\LibFetion\install\fetion" '定义fetion.exe所在位置
fetion_user="135xxxxxxxx" '定义飞信的登陆用户名或手机号
fetion_passwd="123456" '定义飞信的登陆密码
send_buddy="13512345678" '定义短信的接收人,需在你飞信好友列表中
Set objFS = CreateObject ("Scripting.FileSystemObject")
objFS.CreateTextFile("mess.txt")
Set objNF = objFS.OpenTextFile("mess.txt",8) '所发送的报警信息存放在mess.txt
Dim arrFileLines()
i = 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(logfile, 1) '读取报警log全部信息
Do Until objFile.AtEndOfStream
Redim Preserve arrFileLines(i)
arrFileLines(i) = objFile.ReadLine
i = i + 1
Loop
objFile.Close
l = Ubound(arrFileLines) '读取报警log最后一行,因为最近的报警信息永远是最后一行
objNF.writeline "sms "&send_buddy&" " &arrFileLines(l) '把报警log最后一行信息写入mess.txt
objNF.writeline "exit" '退出飞信机器人
objNF.close 'close mess.txt
Set objShell = CreateObject("Wscript.Shell")
if objFS.fileExists("mess.txt")=True then '判断mess.txt是否存在
objShell.run "cmd /C "&fetion_exec&" -u "&fetion_user&" -p "&fetion_passwd&" -b mess.txt",4,True '执行飞信机器人程序使用fetion_user& fetion_passwd登陆后发送mess.txt中的信息
objFS.DeleteFile("mess.txt") '删除mess.txt,可以不要
end if
以上内容保存为alter.vbs放在fetion.exe同一目录即可
备注:由于监控的机器不多,而且报警的条件也比较高,所有报警次数比较少,生成的log就比较小,如果每天生成的log很大,建议log每天生成,增加日期变量即可
2008-07-29 Tue
2008-07-28 Mon
AnySQL.net
DBA notes
Oracle & Starcraft
eagle's home
Give you some color to see see!
AnySQL.net English
Oracle Scratchpad
Oracle Life
OracleDBA Blog---Please enjoy the pain which is unable to avoid!
Uploads from dbanotes
Chanel [K]
xzh2000的博客
Oracle Security Blog
ERN空间
Eddie Awad's Blog
MySQL Performance Blog
The Tom Kyte Blog
del.icio.us/fenng/oracle
AIXpert
O'Reilly Databases
Red Hat Magazine
DBASupport
DB2 Magazine 中文版
developerWorks 中国 : 技术文章 , 教程 AIX
Pythian Group Blog » Log Buffer
车东[Blog^2]
blue_prince
玉面飞龙的BLOG
此生 今世
人生就是如此
Orange Tiger 木匠 的 移民生活
生活帮-LifeBang
Hey!! Sky!
dba on unix
Oracle Notes Wiki
Brotherxiao's Home
柔嘉维则@life.oracle.eng
Fenng's shared items in Google Reader
jametong's shared items in Google Reader
缥缈游侠-logzgh
Tanel Poder's blog: Core IT for geeks and pros
DBA Tools
ilonng
yangtingkun
Oracle & Unix
Inside the Oracle Optimizer - Removing the black magic
Ricky's Test Blog
DBA@Taobao
存储部落
Think in 88
Alibaba DBA Team
Oracle Team @SNC
淘宝数据仓库团队
OracleBlog.cn
中国雅虎_站长天下_www.dbaleading.com_原创文章










