linux memcache?linux软件仓库

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/127.0.0.1/22

   SSH-2.0-OpenSSH_5.1

   #我的机器shell端口是:22

   #实际:/dev/tcp根本没有这个目录,这是属于特殊设备

   [chengmo@centos5 shell]$ cat/dev/tcp/127.0.0.1/223

   -bash: connect:拒绝连接

   -bash:/dev/tcp/127.0.0.1/223:拒绝连接

   #223接口不存在,打开失败

   [chengmo@centos5 shell]$ exec 8/dev/tcp/127.0.0.1/22

   [chengmo@centos5 shell]$ ls-l/proc/self/fd/

   总计 0

   lrwx------ 1 chengmo chengmo 64 10-21 23:05 0-/dev/pts/0

   lrwx------ 1 chengmo chengmo 64 10-21 23:05 1-/dev/pts/0

   lrwx------ 1 chengmo chengmo 64 10-21 23:05 2-/dev/pts/0

   lr-x------ 1 chengmo chengmo 64 10-21 23:05 3-/proc/22185/fd

   lrwx------ 1 chengmo chengmo 64 10-21 23:05 8- socket:[15067661]

   #文件描述符8,已经打开一个socket通讯通道,这个是一个可以读写socket通道,因为用:""打开

   [chengmo@centos5 shell]$ exec 8-

   #关闭通道

   [chengmo@centos5 shell]$ ls-l/proc/self/fd/

   总计 0

   lrwx------ 1 chengmo chengmo 64 10-21 23:08 0-/dev/pts/0

   lrwx------ 1 chengmo chengmo 64 10-21 23:08 1-/dev/pts/0

   lrwx------ 1 chengmo chengmo 64 10-21 23:08 2-/dev/pts/0

   lr-x------ 1 chengmo chengmo 64 10-21 23:08 3-/proc/22234/fd

二、通过重定向读取远程web服务器头信息

复制代码

   

代码如下:

#!/bin/sh

   #testhttphead.sh

   #实现通过主机名,端口读取web服务器header信息

   #copyright chengmo,qq:8292669

   if(($#2));then

   echo"usage:$0 host port";

   exit 1;

   fi

   #如果参数缺失,退出程序,返回状态1

   exec 6/dev/tcp/$1/$2 2/dev/null;

   #打开host的port可读写的socket连接,与文件描述符6连接

   if(($?!=0));then

   echo"open$1$2 error!";

   exit 1;

   fi

   #如果打开失败,$?返回不为0,终止程序

   echo-e"HEAD/ HTTP/1.1/n/n/n/n/n"6;

   #将HEAD信息,发送给socket连接

   cat6;

   #从socket读取返回信息,显示为标准输出

   exec 6-;

   exec 6-;

   #关闭socket的输入,输出

   exit 0;

脚本建立后:存为testhttphead.sh

运行结果:

复制代码

   

代码如下:

[chengmo@centos5~/shell]$ sh testhttphead.sh www.baidu.com 80

   HTTP/1.1 200 OK

   Date: Thu, 21 Oct 2010 15:17:23 GMT

   Server: BWS/1.0

   Content-Length: 6218

   Content-Type: text/html;charset=gb2312

   Cache-Control: private

   Expires: Thu, 21 Oct 2010 15:17:23 GMT

   Set-Cookie: BAIDUID=1C40B2F8C676180FD887379A6E286DC1:FG=1; expires=Thu, 21-Oct-40 15:17:23 GMT; path=/; domain=.baidu.com

   P3P: CP=" OTI DSP COR IVA OUR IND COM"

   Connection: Keep-Alive

   [chengmo@centos5~/shell]$ sh testhttphead.sh 127.0.0.1 8080

   open 127.0.0.1 8080 error!

突然有个奇怪想法:

我们在windows时代就通过telnet可以实现tcp/upd协议通讯,那么如果用传统方法怎么实现呢?

复制代码

   

代码如下:

[chengmo@centos5~/shell]$ echo-e"HEAD/ HTTP/1.1/n/n/n/n/n"|telnet www.baidu.com 80

   Trying 220.181.6.175...

   Connected to www.baidu.com.

   Escape character is'^]'.

   Connection closed by foreign host.

   #直接给发送,失败

   [chengmo@centos5~/shell]$(telnet www.baidu.com 80)EOF

   HEAD/ HTTP/1.1

   EOF

   Trying 220.181.6.175...

   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 80

   Trying 220.181.6.175...

   Connected to www.baidu.com.

   Escape character is'^]'.

   HTTP/1.1 200 OK

   Date: Thu, 21 Oct 2010 15:51:58 GMT

   Server: BWS/1.0

   Content-Length: 6218

   Content-Type: text/html;charset=gb2312

   Cache-Control: private

   Expires: Thu, 21 Oct 2010 15:51:58 GMT

   Set-Cookie: BAIDUID=0B6A01ACECD5353E4247E088A8CB345A:FG=1; expires=Thu, 21-Oct-40 15:51:58 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命令启动。跟你推迟一点还是早一点发送过来。没有关系。

这种类型命令,看出sleep,其实就是保持通道跟telnet连接2秒钟。通道连接着了,telnet终端输入也还在,因此可以保持从baidu服务器获得数据。

所以,延迟多久,还是跟服务器处理速度有关系。

如果通过echo向telnet发送数据,保持通道联通,使用sleep是个很好方法。

通过重定向给telnet输入参数这种方法,我还想不到怎么样实现延迟输入。有知道朋友,可以指点指点.

区别:

telnet与echo实现 http访问,与通过打开读写socket是不一样的,打开socket通道,是可以进行交换处理的。传入命令,活动结果,再传入命令,再获得结果。telnet通过echo就不能这样处理了。

三、通过shell脚本重定向实现监控memcache状态

复制代码

   

代码如下:

#!/bin/sh

   #通过传入ip以及端口,发送指令获得返回数据

   #copyright chengmo qq:8292669

   #函数往往放到最上面

   function sendmsg()

   {

   msg=$1;

   echo"$1"8;

   getout;

   }

   #向socket通道发送指令,并且调用获得返回参数

   function getout()

   {

   #read命令-u从打开文件描述符 8读取数据,-d读取数据忽略掉:/r换行符

   while read-u 8-d$'/r' name;

   do

   if ["${name}"=="END"-o"${name}"=="ERROR" ];then

   break;

   fi;

   echo$name;

   done

   }

   #由于:memcached每次通讯完毕,会返回:END或者ERROR(出错),通过判断是否是"END"觉得读取是不是结束,否则循环不会停止

   if [$#-lt 2 ];then

   echo"usage:$0 host port [command]";

   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 127.0.0.1 11211

通过nc命令实现:

[chengmo@centos5 shell]$(echo"stats")|nc 127.0.0.1 11211

不需要加延迟,直接打开通道

第二个程序里面,看到shell完全可以处理交互设计了。如果按照这样,登陆ftp,pop3,stmp都可以类似实现。这些,我们通过shell socket类似程序实现,应该不困难,只是捕捉如发送解析的问题了。

Redis和Memcache的区别总结

区别:

1、存储方式不同

memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(笔者注:有快照和AOF日志两种持久化方式,在实际应用的时候,要特别注意配置文件快照参数,要不就很有可能服务器频繁满载做dump)。

2、数据支持类型不同

redis在数据支持上要比memecache多的多。

3、使用底层模型不同

新版本的redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4、运行环境不同

redis目前官方只支持LINUX上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上。

扩展资料

注意事项

1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。

2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘。

4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire设定,例如expire name 10。

5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一,存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)。

参考资料:百度百科:redis百度百科:memcache

linux memcached 怎么使用

当前项目中,linux下memcached的启动/结束的方式

默认情况下memcached安装到/usr/local/bin下。

进入安装目录,启动memcached:/usr/local/memcached/bin/memcached-d-c 10240-m 1024-u root

获取运行状态:echo stats| nc localhost 11211(可以查看出pid)或使用ps-ef|grep memcached

停止memcached:kill-9 pid(-9表示强制杀死,pid为进程的进程标识符)

-d选项是启动一个守护进程,

-m是分配给Memcache使用的内存数量,单位是MB,这里是1024MB,默认是64MB

-u是运行Memcache的用户,这里是root

-l是监听的服务器IP地址,默认应该是本机

-p是设置Memcache监听的端口,默认是11211,最好是1024以上的端口

-c选项是最大运行的并发连接数,默认是1024,这里设置了10240,按照你服务器的负载量来设定

-P是设置保存Memcache的pid文件位置

-h打印帮助信息

-v输出警告和错误信息

-vv打印客户端的请求和返回信息

ps-ef|grep memcached(命令说明)

grep:功能说明:查找文件里符合条件的字符串。

|:管道命令操作符

ps(process status):功能说明:报告程序状况。

连接到 memcached:

telnet ip端口,如telnet 192.168.100.11 11211

stats查看状态,flush_all:清楚缓存

查看memcached状态的基本命令,通过这个命令可以看到如下信息:

STAT pid 22459进程ID

STAT uptime 1027046服务器运行秒数

STAT time 1273043062服务器当前unix时间戳

STAT version 1.4.4服务器版本

STAT pointer_size 64操作系统字大小(这台服务器是64位的)

STAT rusage_user 0.040000进程累计用户时间

STAT rusage_system 0.260000进程累计系统时间

STAT curr_connections 10当前打开连接数

STAT total_connections 82曾打开的连接总数

STAT connection_structures 13服务器分配的连接结构数

STAT cmd_get 54执行get命令总数

STAT cmd_set 34执行set命令总数

STAT cmd_flush 3指向flush_all命令总数

STAT get_hits 9 get命中次数

STAT get_misses 45 get未命中次数

STAT delete_misses 5 delete未命中次数

STAT delete_hits 1 delete命中次数

STAT incr_misses 0 incr未命中次数

STAT incr_hits 0 incr命中次数

STAT decr_misses 0 decr未命中次数

STAT decr_hits 0 decr命中次数

STAT cas_misses 0 cas未命中次数

STAT cas_hits 0 cas命中次数

STAT cas_badval 0使用擦拭次数

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 15785读取字节总数

STAT bytes_written 15222写入字节总数

STAT limit_maxbytes 1048576分配的内存数(字节)

STAT accepting_conns 1目前接受的链接数

STAT listen_disabled_num 0

STAT threads 4线程数

STAT conn_yields 0

STAT bytes 0存储item字节数

STAT curr_items 0 item个数

STAT total_items 34 item总数

STAT evictions 0为获取空间删除item的总数

另外一个例子:

启动/结束

memcached-d-m 10-u root-l 192.168.0.122-p 11200-c 256-P/tmp/memcached.pid

-d选项是启动一个守护进程,

-m是分配给Memcache使用的内存数量,单位是MB,这里是10MB

-u是运行Memcache的用户,这里是root

-l是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址192.168.0.122

-p是设置Memcache监听的端口,这里设置了12000,最好是1024以上的端口

-c选项是最大运行的并发连接数,默认是1024,这里设置了256,按照你服务器的负载量来设定

-P是设置保存Memcache的pid文件

kill `cat/tmp/memcached.pid`

获取运行状态

echo stats| nc 192.168.1.123 11200

watch"echo stats| nc 192.168.1.123 11200"(实时状态)

阅读剩余
THE END