皮皮网

【网页自助建站源码】【载波 源码】【hybbs源码】Memcache源码 tcp

2024-12-24 20:21:24 来源:spring源码讲涛

1.redis和memcached的区别
2.linux shell 脚本实现tcp/upd协议通讯
3.MemCacheMemCache接口介绍

Memcache源码 tcp

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通讯通道,源码载波 源码这个是源码一个可以读写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语句,就直接发送到屏幕(也就是hybbs源码标准输出),只要有标准输出了,就会通过通道马上传个:telnet ,如果接下来命令还有输出,会注意传给telnet ,直到()内所有命令执行完,与通道连接就断开了。

       再一个方面:如果说是起到推迟发送的话,什么时候有数据过来,发给telnet,什么时候telnet命令启动。跟你推迟一点还是dnfec源码早一点发送过来。没有关系。

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

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

       如果通过echo 向telnet发送数据,保持通道联通,multiset源码使用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,提供了可视化监控和管理功能,便于操作和性能优化。