1.redisåmemcachedçåºå«
2.linux shell 脚本实现tcp/upd协议通讯
3.MemCacheMemCache接口介绍
redisåmemcachedçåºå«
å¦æç®åå°æ¯è¾Redisä¸Memcachedçåºå«ï¼å¤§å¤æ°é½ä¼å¾å°ä»¥ä¸è§ç¹ï¼
1 Redisä¸ä» ä» æ¯æç®åçk/vç±»åçæ°æ®ï¼åæ¶è¿æä¾listï¼setï¼hashçæ°æ®ç»æçåå¨ã
2 Redisæ¯ææ°æ®çå¤ä»½ï¼å³master-slave模å¼çæ°æ®å¤ä»½ã
3 Redisæ¯ææ°æ®çæä¹ åï¼å¯ä»¥å°å åä¸çæ°æ®ä¿æå¨ç£çä¸ï¼éå¯çæ¶åå¯ä»¥å次å è½½è¿è¡ä½¿ç¨ã
å¨Redisä¸ï¼å¹¶ä¸æ¯ææçæ°æ®é½ä¸ç´åå¨å¨å åä¸çãè¿æ¯åMemcachedç¸æ¯ä¸ä¸ªæ大çåºå«ï¼æ个人æ¯è¿ä¹è®¤ä¸ºçï¼ã
Redisåªä¼ç¼åææçkeyçä¿¡æ¯ï¼å¦æRedisåç°å åç使ç¨éè¶ è¿äºæä¸ä¸ªéå¼ï¼å°è§¦åswapçæä½ï¼Redisæ ¹æ®âswappability = age*log(size_in_memory)â计ç®åºåªäºkey对åºçvalueéè¦swapå°ç£çãç¶ååå°è¿äºkey对åºçvalueæä¹ åå°ç£çä¸ï¼åæ¶å¨å åä¸æ¸ é¤ãè¿ç§ç¹æ§ä½¿å¾Rediså¯ä»¥ä¿æè¶ è¿å ¶æºå¨æ¬èº«å å大å°çæ°æ®ãå½ç¶ï¼æºå¨æ¬èº«çå åå¿ é¡»è¦è½å¤ä¿æææçkeyï¼æ¯ç«è¿äºæ°æ®æ¯ä¸ä¼è¿è¡swapæä½çã
åæ¶ç±äºRediså°å åä¸çæ°æ®swapå°ç£çä¸çæ¶åï¼æä¾æå¡ç主线ç¨åè¿è¡swapæä½çå线ç¨ä¼å ±äº«è¿é¨åå åï¼æ以å¦ææ´æ°éè¦swapçæ°æ®ï¼Rediså°é»å¡è¿ä¸ªæä½ï¼ç´å°å线ç¨å®æswapæä½åæå¯ä»¥è¿è¡ä¿®æ¹ã
å¯ä»¥åè使ç¨Redisç¹æå å模åååçæ åµå¯¹æ¯ï¼
VM off: k keys,源码 bytes values: 1.3G used
VM on: k keys, bytes values: M used
VM off: 1 million keys, bytes values: .M used
VM on: 1 million keys, bytes values: .M used
VM on: 1 million keys, values as large as you want, still: .M used
å½ä»Redisä¸è¯»åæ°æ®çæ¶åï¼å¦æ读åçkey对åºçvalueä¸å¨å åä¸ï¼é£ä¹Rediså°±éè¦ä»swapæ件ä¸å è½½ç¸åºæ°æ®ï¼ç¶ååè¿åç»è¯·æ±æ¹ãè¿éå°±åå¨ä¸ä¸ªI/O线ç¨æ± çé®é¢ãå¨é»è®¤çæ åµä¸ï¼Redisä¼åºç°é»å¡ï¼å³å®æææçswapæ件å è½½åæä¼ç¸åºãè¿ç§çç¥å¨å®¢æ·ç«¯çæ°éè¾å°ï¼è¿è¡æ¹éæä½çæ¶åæ¯è¾åéãä½æ¯å¦æå°Redisåºç¨å¨ä¸ä¸ªå¤§åçç½ç«åºç¨ç¨åºä¸ï¼è¿æ¾ç¶æ¯æ æ³æ»¡è¶³å¤§å¹¶åçæ åµçãæ以Redisè¿è¡æ们设置I/O线ç¨æ± ç大å°ï¼å¯¹éè¦ä»swapæ件ä¸å è½½ç¸åºæ°æ®ç读å请æ±è¿è¡å¹¶åæä½ï¼åå°é»å¡çæ¶é´ã
redisãmemcacheãmongoDB 对æ¯
ä»ä»¥ä¸å 个维度ï¼å¯¹redisãmemcacheãmongoDB åäºå¯¹æ¯ï¼æ¬¢è¿æç
1ãæ§è½
é½æ¯è¾é«ï¼æ§è½å¯¹æ们æ¥è¯´åºè¯¥é½ä¸æ¯ç¶é¢
æ»ä½æ¥è®²ï¼TPSæ¹é¢redisåmemcacheå·®ä¸å¤ï¼è¦å¤§äºmongodb
2ãæä½ç便å©æ§
memcacheæ°æ®ç»æåä¸
redis丰å¯ä¸äºï¼æ°æ®æä½æ¹é¢ï¼redisæ´å¥½ä¸äºï¼è¾å°çç½ç»IO次æ°
mongodbæ¯æ丰å¯çæ°æ®è¡¨è¾¾ï¼ç´¢å¼ï¼æç±»ä¼¼å ³ç³»åæ°æ®åºï¼æ¯æçæ¥è¯¢è¯è¨é常丰å¯
3ãå å空é´ç大å°åæ°æ®éç大å°
rediså¨2.0çæ¬åå¢å äºèªå·±çVMç¹æ§ï¼çªç ´ç©çå åçéå¶ï¼å¯ä»¥å¯¹key value设置è¿ææ¶é´ï¼ç±»ä¼¼memcacheï¼
memcacheå¯ä»¥ä¿®æ¹æ大å¯ç¨å å,éç¨LRUç®æ³
mongoDBéå大æ°æ®éçåå¨ï¼ä¾èµæä½ç³»ç»VMåå å管çï¼åå åä¹æ¯è¾å害ï¼æå¡ä¸è¦åå«çæå¡å¨ä¸èµ·
4ãå¯ç¨æ§ï¼åç¹é®é¢ï¼
对äºåç¹é®é¢ï¼
redisï¼ä¾èµå®¢æ·ç«¯æ¥å®ç°åå¸å¼è¯»åï¼ä¸»ä»å¤å¶æ¶ï¼æ¯æ¬¡ä»èç¹éæ°è¿æ¥ä¸»èç¹é½è¦ä¾èµæ´ä¸ªå¿«ç §,æ å¢éå¤å¶ï¼å æ§è½åæçé®é¢ï¼
æ以åç¹é®é¢æ¯è¾å¤æï¼ä¸æ¯æèªå¨sharding,éè¦ä¾èµç¨åºè®¾å®ä¸è´hash æºå¶ã
ä¸ç§æ¿ä»£æ¹æ¡æ¯ï¼ä¸ç¨redisæ¬èº«çå¤å¶æºå¶ï¼éç¨èªå·±å主å¨å¤å¶ï¼å¤ä»½åå¨ï¼ï¼æè æ¹æå¢éå¤å¶çæ¹å¼ï¼éè¦èªå·±å®ç°ï¼ï¼ä¸è´æ§é®é¢åæ§è½çæè¡¡
Memcacheæ¬èº«æ²¡ææ°æ®åä½æºå¶ï¼ä¹æ²¡å¿ è¦ï¼å¯¹äºæ éé¢é²ï¼éç¨ä¾èµæççhashæè ç¯ç¶çç®æ³ï¼è§£å³åç¹æ éå¼èµ·çæå¨é®é¢ã
mongoDBæ¯æmaster-slave,replicasetï¼å é¨éç¨paxosé举ç®æ³ï¼èªå¨æ éæ¢å¤ï¼,auto shardingæºå¶ï¼å¯¹å®¢æ·ç«¯å±è½äºæ é转移åååæºå¶ã
5ãå¯é æ§ï¼æä¹ åï¼
对äºæ°æ®æä¹ ååæ°æ®æ¢å¤ï¼
redisæ¯æï¼å¿«ç §ãAOFï¼ï¼ä¾èµå¿«ç §è¿è¡æä¹ åï¼aofå¢å¼ºäºå¯é æ§çåæ¶ï¼å¯¹æ§è½ææå½±å
memcacheä¸æ¯æï¼é常ç¨å¨åç¼å,æåæ§è½ï¼
MongoDBä»1.8çæ¬å¼å§éç¨binlogæ¹å¼æ¯ææä¹ åçå¯é æ§
6ãæ°æ®ä¸è´æ§ï¼äºå¡æ¯æï¼
Memcache å¨å¹¶ååºæ¯ä¸ï¼ç¨casä¿è¯ä¸è´æ§
redisäºå¡æ¯ææ¯è¾å¼±ï¼åªè½ä¿è¯äºå¡ä¸çæ¯ä¸ªæä½è¿ç»æ§è¡
mongoDBä¸æ¯æäºå¡
7ãæ°æ®åæ
mongoDBå ç½®äºæ°æ®åæçåè½(mapreduce),å ¶ä»ä¸æ¯æ
8ãåºç¨åºæ¯
redisï¼æ°æ®éè¾å°çæ´æ§è½æä½åè¿ç®ä¸
memcacheï¼ç¨äºå¨å¨æç³»ç»ä¸åå°æ°æ®åºè´è½½ï¼æåæ§è½;åç¼åï¼æé«æ§è½ï¼éå读å¤åå°ï¼å¯¹äºæ°æ®éæ¯è¾å¤§ï¼å¯ä»¥éç¨shardingï¼
MongoDB:主è¦è§£å³æµ·éæ°æ®ç访é®æçé®é¢
linux shell 脚本实现tcp/upd协议通讯
linux 设备里面有个比较特殊的文件:/dev/[tcp|upd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,源码对应port端口。源码如果主机以及端口存在,源码就建立一个socket 连接。源码将在,源码枪林弹雨飞刀辅助源码/proc/self/fd目录下面,源码有对应的源码文件出现。
一、源码测试下:/dev/tcp/host/post文件
复制代码
代码如下:
[chengmo@centos5 shell]$ cat/dev/tcp/.0.0.1/
SSH-2.0-OpenSSH_5.1
#我的源码机器shell端口是:
#实际:/dev/tcp根本没有这个目录,这是源码属于特殊设备
[chengmo@centos5 shell]$ cat/dev/tcp/.0.0.1/
-bash: connect: 拒绝连接
-bash: /dev/tcp/.0.0.1/: 拒绝连接
#接口不存在,打开失败
[chengmo@centos5 shell]$ exec 8/dev/tcp/.0.0.1/
[chengmo@centos5 shell]$ ls -l /proc/self/fd/
总计 0
lrwx------ 1 chengmo chengmo - : 0 - /dev/pts/0
lrwx------ 1 chengmo chengmo - : 1 - /dev/pts/0
lrwx------ 1 chengmo chengmo - : 2 - /dev/pts/0
lr-x------ 1 chengmo chengmo - : 3 - /proc//fd
lrwx------ 1 chengmo chengmo - : 8 - socket:[]
#文件描述符8,已经打开一个socket通讯通道,源码springaware源码解读这个是源码一个可以读写socket通道,因为用:""打开
[chengmo@centos5 shell]$ exec 8-
#关闭通道
[chengmo@centos5 shell]$ ls -l /proc/self/fd/
总计 0
lrwx------ 1 chengmo chengmo - : 0 - /dev/pts/0
lrwx------ 1 chengmo chengmo - : 1 - /dev/pts/0
lrwx------ 1 chengmo chengmo - : 2 - /dev/pts/0
lr-x------ 1 chengmo chengmo - : 3 - /proc//fd
二、通过重定向读取远程web服务器头信息
复制代码
代码如下:
#!/bin/sh
#test
HTTP/1.1 OK
Date: Thu,源码 Oct :: GMT
Server: BWS/1.0
Content-Length:
Content-Type: text/html;charset=gb
Cache-Control: private
Expires: Thu, Oct :: GMT
Set-Cookie: BAIDUID=1CB2F8CFDA6EDC1:FG=1; expires=Thu, -Oct- :: GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Connection: Keep-Alive
[chengmo@centos5 ~/shell]$ sh test
Trying ..6....
Connected to www.baidu.com.
Escape character is '^]'.
Connection closed by foreign host.
#直接给发送,失败
[chengmo@centos5 ~/shell]$ (telnet www.baidu.com )EOF
HEAD / HTTP/1.1
EOF
Trying ..6....
Connected to www.baidu.com.
Escape character is 源码'^]'.
Connection closed by foreign host.
#重定向输入,还是失败?
找到正确方法:
复制代码
代码如下:
[chengmo@centos5 shell]$ (echo -e "HEAD / HTTP/1.1/n/n/n/n/n";sleep 2)|telnet www.baidu.com
Trying ..6....
Connected to www.baidu.com.
Escape character is '^]'.
HTTP/1.1 OK
Date: Thu, Oct :: GMT
Server: BWS/1.0
Content-Length:
Content-Type: text/html;charset=gb
Cache-Control: private
Expires: Thu, Oct :: GMT
Set-Cookie: BAIDUID=0B6AACECDEEA8CBA:FG=1; expires=Thu, -Oct- :: GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Connection: Keep-Alive
#成功了!加入sleep 居然可以了,sleep 改成1秒也可以
是不是由于sleep后,echo会推出2秒发给通道:telnet呢?推论可以从这2个方面推翻:
一个方面:通过()括的数据是一对命令,会作为一个子命令执行,一起执行完程序结束。每个命令echo语句,就直接发送到屏幕(也就是智力问答源码标准输出),只要有标准输出了,就会通过通道马上传个:telnet ,如果接下来命令还有输出,会注意传给telnet ,直到()内所有命令执行完,与通道连接就断开了。
再一个方面:如果说是起到推迟发送的话,什么时候有数据过来,发给telnet,什么时候telnet命令启动。跟你推迟一点还是html源码例子早一点发送过来。没有关系。
这种类型命令,看出sleep,其实就是保持通道跟telnet 连接2秒钟。 通道连接着了,telnet终端输入也还在,因此可以保持从baidu服务器获得数据。
所以,延迟多久,还是跟服务器处理速度有关系。
如果通过echo 向telnet发送数据,保持通道联通,戴帽指标源码使用sleep是个很好方法。
通过重定向给telnet输入参数这种方法,我还想不到怎么样实现延迟输入。有知道朋友,可以指点指点.
区别:
telnet与echo 实现 mand]";
exit 1;
fi;
[[ $# -gt 2 ]]command=$3;
#设置默认值 如果command为定义则为:stats
command="${ command=stats}";
host="$1";
port="$2";
exec 8/dev/tcp/${ host}/${ port};
#打开通向通道是8
if [ "$?" != "0" ];then
echo "open $host $port fail!";
exit 1;
fi
sendmsg "$command";
#发送指定命令
sendmsg "quit";
#发送退出通向命令
exec 8-;
exec 8-;
#关闭socket通道
exit 0;
这是通过重定向,实现socket通讯中,发送然后获取返回的例子。其实,上面代码看似一次只能发送一段。时间上。我们可以反复调用:sendmsg ,捕捉输出数据。实现连续的,读与写操作。
实例截图:
其它实现方法:
其实通过:telnet也可以实现的。
[chengmo@centos5 shell]$ (echo "stats";sleep 2)|telnet .0.0.1
通过nc命令实现:
[chengmo@centos5 shell]$ (echo "stats")|nc .0.0.1
不需要加延迟,直接打开通道
第二个程序里面,看到shell完全可以处理交互设计了。如果按照这样,登陆ftp,pop3,stmp都可以类似实现。这些,我们通过shell socket类似程序实现,应该不困难,只是捕捉如发送解析的问题了。
MemCacheMemCache接口介绍
Memcache客户端提供了两种类型的接口:面向过程和面向对象。具体接口说明可参考PHP手册的"Memcache Functions"章节。面向对象的常用操作包括:Memcache::connect:建立到Memcache的连接
Memcache::pconnect:建立长连接到Memcache
Memcache::close:关闭连接
Memcache::set:在服务器上保存数据
Memcache::get:从服务器获取数据
Memcache::replace:替换已存在数据(类似set)
Memcache::delete:删除服务器上的数据
Memcache::flush:清空所有服务器数据
Memcache::getStats:获取服务器状态信息
如果需要自定义客户端,需要理解Memcache协议,包括TCP和UDP协议,但这里主要讨论TCP协议。Memcache协议的错误指令有三种,分别是普通错误、客户端错误和服务器错误。数据保存指令有set、add和replace,它们分别用于保存、添加和替换数据,数据的键、标记、有效期和数据长度是关键部分。 提取数据使用get指令,通过键获取内容,服务器返回数据或END信息。删除数据则使用delete指令,带有可选的超时时间。stats和version指令用于获取服务器状态和版本信息,quit用于关闭连接。 在实际应用中,Memcache常用于大型网站,减轻数据库压力。通过分布式部署,如根据用户ID将数据分布在多台Memcache服务器,可以有效提高性能。Memcached管理系统如MemAdmin,提供了可视化监控和管理功能,便于操作和性能优化。