欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 44_03 _memcached安装配置及保存php session 于 memcached 中的方法 有大用

image.png


image.png


chrome有上面的开发者工具,ie上也有 httpwatch ( 有免费版,有profetional???专业版) 工具

httpwatch 专业版甚至比chrome开发者工具更强,甚至能录制整个页面的加载过程



memcached    键值存储的服务器

key:value,键值存储的,能存储众多这样的key:value的服务器,


name:Jerry 根据键name 找到Jerry,,,,但是每个键的键名应该不一样,键名一样,可能会覆盖以前的值,或者拒绝存数据


http web object 存于 memcached


http://www.magedu.com/index.html    可以使用url作为键 字符串作键,页面文件数据作为值


一堆的key:value


如下图图一,如何存键值对到memcached,如何根据键从memcached中获取数据值

只关心怎么存,至于键和值存在哪里,不用关心,

取值的时候,只需告诉键是什么就可以了

memcached 是一个C/S架构的客户端服务器端程序,双方之间基于某种协议进行通信,基于tcp或udp都可以,,,,,,,,,tcp支持长连接,我们要从缓存中获取数据,每次要三次握手,获取后,要断开,很浪费时间,,,,,,,所以也支持udp的方式,,,,无论tcp,udp都通过ip报文发送,意味着我们的memcached服务器端一定监听在某个套接字上,不然无法接收客户端请求,,,,,而我们的客户端基于某种协议连进来,,,(ftpd与httpd服务器如何区别的?首先靠协议的不同,保证了自己获取资源的方式不一样,,,,,第二,它们用自己独有的协议,来实现客户端与服务器端的交互),,,memcached客户端与服务器端如何交互?客户端发一个命令过去,服务器端要能够接受并处理这个命令,,,,,(http报文,发一个get uri,服务器端能够理解get,并响应资源,,,,,,,,发一个PUT /etc/issue,这个协议本身能够带着这个文件,传送给服务器,服务器能够接受这个文件,并存储这个文件,,,,,,,,这个get,put类似于命令吧)(ftp也有 get, put,mget,mput之类的命令)(这些协议发送的命令很简单,如下图图二,基于文本命令的简单协议simple protocol) (http: 基于text 超文本传输协议)(ftp: text binary 基于文本,也可以基于二进制),,,,,,,,,,,我们作为memcached客户端,要想存键值对数据,协议编码应该使用?二进制格式安全性和效率上更好;文本格式,处理机制简单,因为只要客户端发送文本命令的信号就可以了,,,,(如果基于文本的方式,以前测试过http协议, telnel ip 80,可以直接发请求报文,发命令, get uri http/1.1  

host 

连回车两下,就可以直接获取资源了,,,,,,,,,对于文本类的信息,可以这样子做测试,非文本类的协议,得使用专用客户端了,)(我们的ftp服务器,如果既支持文本方式传输,又支持二进制,很可能默认是二进制,我们只有采用专用客户端,只有专用客户端才能以二进制格式封装指令,以二进制格式接受数据,才能还原成数据的,memcached也是一个道理,)

memcache早期是text文本协议,基于文本发送一些指令,发送一些获取命令,,,现在也支持binary二进制了,,,,,,,,既支持纯文本的方式来发送命令,来实现数据的上传和下载(存到服务器端,进行缓存,从服务器端获取缓存值),也支持二进制格式的,

图一

image.png

图二

image.png

memcached为了保证整个处理机制非常简单,memcached将它的协议的实施上,默认情况下也是基于纯简单的协议来完成,,,它的协议在发送的时候,封装任何指令,不会使用xml格式,

两个计算机之间为了交互数据,为了让对方能够更理解我们的请求命令是什么,(比如集群,它的大多数配置文件都是xml格式的,是为了实现某些数据交互,为了避免对方误解的,,,,,,这种协议,它所能够支持的功能非常强大,而且它的配置功能也非常强大,但是xml本身要能够解析xml格式的文档,,,,,,,所以任何一个协议,如果支持xml格式来传输数据的话,那就意味着我们的服务器端,客户端都要有一个xml引擎,至少要能够分析xml格式的文档,,这样会使服务器复杂了起来,memcached本身是为了高性能而存在的,所以越简单越好,因此memcached也仅支持一些非常简单的命令,比如 get,set,,,,,set是用来设定,保存缓存,get是用来获取一个键对应的值的)


memcached:是一个缓存服务器,但本身无法决定缓存任何数据,

         一半依赖于客户端(存储谁,存多久,什么时候过期),一半依赖于服务器端(提供了存储能力,检索能力)

客户端自己提供键名  ,提供缓存时长,提供标识位,提供值,提供整个数据大小(比如5个字符)

    set key 5 60 hello    存储键名 key,值 hello ,5个字符的大小????,时长为60秒,,,,,,,过期后,服务器端自己清除,

    lazy: memcached缓存管理是基于lazy模型的,懒惰模型,,,,,,,只要我们当前的系统上仍然有足够的空间可用,无论过不过期,我都不会清空这个缓存,,,,,,,,,只有实在没有空间了,才会清空这个缓存,,,,,它也是基于LRU:(Least Recently Used)最近最少使用的清理机制,,,

    如果缓存空间过小,但缓存数据量很大,缓存抖动很历害,存了清,清了存,一次也没命中过,,,,有时还有一种情况,提供的非常非常大???,但是存进去的很多数据,突然之间,由于存的数据管理不善,可能带来雪崩,也有可能是因为我们的缓存空间过小,反正各种机制,可能导致缓存崩溃,,,,,所以存的太多,就是命中不了,,,,,memcached既然叫缓存,并不保证数据持久存储,它假设自己坏了,是无所谓的,是不影响数据本身的,


memcached尽可能使用内存来缓存数据,是内存缓存服务器,存数据的时候

最小48bytes

最大1MB

存的数据大小可能会不一致,

比如 index.html: 10k

        test.jpg: 34k

memcached内存当中如何管理这些不同的缓存数据,,,,,,,,因为我们知道为了存储一个数据对象,我们必须要给它在内存中开辟一个边界,如下图,内存中存的数据都是按字节实现序列化的,它是一个字节一个字节存的,在内存中每一个字节都是编址的单元,进程中使用是按照页面使用的,,,,,,要存10k和34k的数据,怎么存?只要分配足够的空间就行了,但是我们将来去内存中找数据的时候,我们必须要有一个缓存对象从哪里开始,到哪里结束,,,,,,,得有个边界,必须要标识起始存储地址和结束存储地址,把它当作一个独立的单位来管理,过一会儿,它失效了,意味着这个空间就腾出去了,时间久了,会带来碎片的,因为它存的都是很小的数据单元,存一个删一个,大小不一,过一会儿,这个内存当中全是缝隙,全是缝隙以后,我们再想高速利用很困难,,,,,,我想找一个空闲空间,往里面再存一个对象,半天找不到空闲空间,所以在这种机制下,memcached存储数据,包括数据管理,内存管理都是非常缓慢的,,,有时缓存没过期,需要手动清除,反正数据需要频繁的建立删除,建立删除,不停的极快速的完成内存的申请释放,尤其是我们存储近百万个缓存对象的时候,这种申请空间释放空间本身需要大量的时间消耗,因此我们也必须要有一种高效的机制来解决内存的创建和释放的问题,,,对于memcached来讲,首要解决的问题就是这样一个问题,,,,不然的话,你会发现由于内存的碎片,它会导致进程运行起来非常慢,刚开始没问题,时间一久,会拖慢速度,,,,所以我们首先就是解决内存碎片的问题

image.png

linux内核当中,引入两种机制来管理避免内存碎片的,

buddy system: 伙伴系统 主要是为了实现整个系统当中以页面的方式管理内存的时候有足够大的连续内存空间可用的,,,,,,在我们的物理内存上,事实上我们的内存的申请和分配通常是以页面的方式来进行的,如下图,在x86以及x86_64的服务器上,通常一个页面默认是4K大小,将来我们一个进程需要用到一个内存页面,需要存数据,我们要给4K,一个给4k,一个给8k,再一个给12k,当某些进程结束时,内存中都是碎片了,页面缝隙会有很多个,,,假如需要连续的10M左右的空间,但是内存都是缝隙,,buddy system就是为了实现将这些邻近的空闲的内存页面可以合并成一个大的连续的空间,将来申请内存空间的时候,可以从一头申请????,而不是从中间申请,,这样子会尽可能避免页面之间产生碎片的,,,,,,,,,,,因此buddy system的主要目的是为了避免内存外碎片????(页面之外的碎片,页面和页面之间的碎片),,,,,,,,,,有些数据存储的时候,占据不了一个页面,(内核打开一个文件的时候,都有一个inode,除了inode还有很多元数据,inode加上属性信息(大小,名称,创建时间等)(其实属性信息也包含在inode当中),,,,,,,,假设每个inode结构大概需要128个字节,给4k的页面存储,是个浪费,,,,,,,,,

slab allocator就是这样的目的,它能够实现我们页面存储小于页面单位的非常小的数据内存结构的时候,专门事先分配好这些结构,随时等待有需求的进程或者要存储的对象使用,而且使用之后也不会销毁这样一个结构,它是随时重复利用的????)

image.png

slab allocator: slab 分配器

        避免内存内碎片的,

 如下图,把4k的页面分成n个128字节的结构,需要存储的时候,从128字节里面拿一个就可以直接用了,用完之后不回收,空置在那儿,将来有人再用,就重复使用,就使用刚才那个已经空闲已经腾出来的空间就可以了,,,,,,,,,这样就不必分配内存了,因为刚启动的时候,事先就准备好了,随时使用,,,,,,,,如果这么多n个128字节不够用了,再找一个空闲页面(4k),再立即划分好,再从里面申请就好了,,,,,,,,我们的操作系统上有众多的内存数据结构都需要这种方式来使用的, 来实现的,而且它们所需要的大小(存储空间的大小和结构也不尽相同),,,,,,,,比如进程,每个进程都有进程描述符(进程号,进程名,进程属主属组等),进程也需要一个数据结构,因此,inode和进程完全属于不同的数据结构,,,,,,,,不同的数据结构,它们本身所需要的依赖的空间也不一样,,,,,,,,slab allocator 为每一种数据结构都准备了一些内存空间,比如一个进程数据结构需要256个字节,就事先分配n个256个字节,任何时候想使用,过来申请使用,用完之后,跟我拿到这儿,我重新放到可用列表中去,,,,,,所以slab allocator当中,它的整个内存中的数据结构分成己用和空闲的,,,,,,当用完后,归类到空闲列表中去就可以了,,,,,,在内核中,它使用一个数据结构,描述(追踪)的在当前内存段当中,分配给某一种slab对象要存的,它占据有几个页面,就给它分了几个页面????,,,,,,哪个页面中是空的,可能一下子准备了2个页面,但是从第一个页面开始用,第一个用完了,才用第二个页面,,,,,到底一下子准备了几个?不同的数据结构,我们内存中定义的可能不尽相同,,,,,,,刚开始时,可能不止一个页面,它用的时候,一定是从页面的一头开始用的,,,,用完之后,再用另外一个,,,,,,当我们空闲的时候,它也是将空闲的顺序存放,,,,,,所有的页面分配的时候,尽可能的一个页面用完后,再用第二个页面,所以只要第一个页面上有空闲空间,它就往第一个页面上放数据,所以第二个页面它就有一段连续的空间可用?????,所以达到了重复利用这样的目的,,,,,,,memcached的原理,也是这样子,,,,,马哥好像讲得并不十分清晰

image.png


memcached也是事先要求你可以给memcached多大内存空间,假设预给memcached 512M内存,如下图,然后给512M的内存分片,存的各个数据大小一样???????,,,,如果分1k,,,如果存2k,就是2片数据,还是会出现碎片,,,它在分片时充分考虑各种大小数据的存储,,,,,,马哥好像讲得并不十分清晰,,,,,,由此,

image.png


如下图,由此(默认最小48字节)分一堆48字节,一堆80字节,一堆120字节,再分一堆200字节,,,,,,,,,假设存20byte, 找个48字节的存储, 只好浪费了28byte,一定是找最佳的浪费情况最少的,如果存72byte,只好找个80字节的存储,,,,这样才能实现内存的高效分配和回收.......

每一类当中彼此间间隔越小,浪费越少????比如48字节一个,60字节一个,68字节一个,这样子会更好,,,,但是类别过多,会带来管理上的麻烦,,,,,,,,,早期是2倍增长的 48字节,96字节.............这种方法太粗糙,浪费的空间太大,,,,,,

            现在是增长因子来定义 growth factor  明确定义 比如 为 2

                    48bytes  growth factor为2时,下一个就是96bytes

                    48bytes  growth factor为1.1时,下一个就是48*1.1bytes

一共可以翻多大,取决于整个内存空间的可用空间的大小,

每一个增长因子对应的类别,应该有相应的数目, 48字节 有一大堆 (slab class),80字节 有一大堆, (slab class)

每一个类当中都有个块存储数据的,每个块叫做 slab chunk


image.png


一旦给memcached指定有多大内存空间以后,它就会立即把这个内存申请过来,并且划分好里面的存储空间,而且它分好一个一个的小格子,如下图,当有必要的时候,按需存到最佳匹配的小格子当中,,,,一旦存满了,就该清理了,,,,,,如果不满的话,就算过期了,它也不清理,它是lazy模型的,

image.png


memcached: 不通信的分布式缓存服务器,,

    memcached不能缓存过多的数据,将来缓存的数据很大,怎么办?多台memcached分别提供服务,如下图,一堆应用程序服务器,主从mysql服务器,我们可以提供memcached,,,,,,,,,,,缓存对象过多,一个memcached抗不住,再来一个memcached,两个memcached不通信的,,,,应用程序服务器,应该轮流使用两个memcached,

image.png

如下图图一,对于memcached而言,分布式算法是在客户端(这里叫做应用程序服务器端吧)应用程序实现的,如下图,轮流到哪个memcached,不是取决于memcached自身,这两个memcached不需要通信,也不需要监控对方的心跳,客户端(这里叫做应用程序服务器端吧)应用程序监控哪个memcached是否在线,,,,所以说智能性一半在客户端,一半在服务器端,,,,客户端(这里叫做应用程序服务器端吧)怎么轮流?需要一定的分布式算法,需要一个调度器,lvs可以调度,这里不适合加lvs,,,,,我们的客户端(这里叫做应用程序服务器端吧)应用程序,用键作特殊的运算,取得唯一的键值,除以memcached的总数取余(比如键是index.html作指纹运算(比如校验码)后,除以2取余,,假如结果为0,数据就存在第一个memcached,,下次取数据的时候,仍然让指纹运算(比如校验码)后除以2取余,就会发现是第一个memcached,就从第一个memcached上取数据,,,,,,,校验码结果奇偶的可能性是几乎平均分布的,,,若三台memcached,就除以3取余,,)这种方式的缺陷,假设4台memcached,万一某个memcached挂了,如下图图三,,把挂了的memcached从4台memcached的可用列表中去了,去了后,总数就是3,此时就要除以3取模了,,以前是除以4取余,所以此时大量缓存失效了,,若从4台加了1台,变成了5台,你会发现,整个缓存大量缓存失效,要重新建立,,,,,,算法应用起来简单,但是弊断很严重,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,如果memcached的确很多,是可以加调度器的,比如nginx就可以调度,因为nginx可以理解memcached的协议的(memcached协议很简单,里面就是一堆的get set,),,haproxy也行,lvs也行(只不过lvs? 要想让数据始终被获取到,得使用持久连接,,,,,,所以haproxy,nginx,lvs都得持久连接,, 这样不会缓存到第一个memcached,而到第二个memcached上找数据,找不到还得缓存,,,显然是不应该的,,,,)

图一

image.png

图二

image.png

图三

image.png


如下图,有一个一致性hash算法,找一个环,有n个点位,一系列散列的点,挨着连续的,彼此之间是离散的,范围是从1-2^32,我们有几个服务器,将它们放在对应的环上的某个点上,比如第1位放一个服务器,第200位放一个服务器,..................再放几个,可能有些地方离散度很大,能做到平均更好,,(2^32个,除以4????在哪个位置上放都可以.),怎么缓存数据?仍然取它的离散值,可以对2^32取余,取余结果以后,可能结果不在某一个服务器点上,(我们使用一个键的检验码来计算结果,除以2^32次方取余, 它有可能分散到整个环的任何一个位置,,,,位置与服务器不对应,怎么办?,按顺时针,找一个离它最近的服务器,,,,,,万一某一个服务器挂了,咋办?如下图,只影响一部分的数据,,,,如果是普通的取余数,则动一发而牵动所有的缓存服务器,)

image.png


如下图,增加一个服务器,也只影响一部分数据,这种算法,称为一致性hash

image.png


如下图,使用这种一致性hash算法,来管理多台memcached,可以实现让它的影响范围,每一次服务器的增减,影响范围,尽可能的降到最低,

image.png

memcached很简单,协议,报文格式没必要了解,

只要了解 

1)在内存在缓存 2)内存中使用slab allocate分配成很多很多的小格子(slab chunk),,,,,,,每个chunk是用来存储一类(指大小一样的吗)???数据的,而我们真正存的数据,很可能chunk中不会精确匹配,找最佳的匹配,难以避免内存浪费,但是内存分配效率会很高,,,而且它又是基于hash来存储的,所以可以达到oe????还是O(1)??????的效果,



http://memcached.org/ 

memcached本身是live journal????的,live journal是一个非常著名的网站,它们开发用来专门为自己的站点提供高可用缓存功能,

用memcached的公司,live journal,,它是memcached的作者所供职的公司,wikipedia是全球最大的wiki站点,它存的数据量非常大,(memcached只适合存键值数据,只是个缓存cache,不适合存储store,,,,mysql是store,),,,,twitter,youtube,dig,wordpress,mixi(日本最大的社交站点) 它们用的都是memcached,,,,,,,,,,,,,,

image.png

众多应用程序开发,支持memcached缓存,C库,C++库,php库,,直接开发时,就可以调用memcached功能,

如果某个程序开发时,不会用memcached(即没有此应用程序的关于memcached库文件???),是不能往memcached缓存数据的,缓存数据与否取决于应用程序自身,memcached说是一个缓存服务器,但是它本身并不提供缓存能力,得你自己决定怎么缓存,用不用memcached.


What is Memcached?

Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

Memcached is simple yet powerful. Its simple design promotes quick deployment, ease of development, and solves many problems facing large data caches. Its API is available for most popular languages.

Memcached是免费开源,高性能,分布式,内存对象?????缓存系统,马哥看到的最新版本1.4.15(2012-9-3)

http://memcached.org/ 

用法

Cache Results

function get_foo(foo_id)
    foo = memcached_get("foo:" . foo_id)
    return foo if defined foo

    foo = fetch_foo_from_database(foo_id)
    memcached_set("foo:" . foo_id, foo)
    return foo
end

Play with telnet

$ telnet localhost 11211        tcp,udp都可以,可以自己指定  get获取值,set设定键值
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get foo
VALUE foo 0 2
hi
END
stats
STAT pid 8861
(etc)


memcached我们直接编译安装就行,

memcached本身是事件驱动的,异步io的 event-driven,利用的是libevent( 能提供 event-driven相关功能的库叫做 libevent )这样一件库,

红帽5,红帽6使用的是同一个版本的libevent

[root@master ~]# rpm -q libevent        #1.4系列

libevent-1.4.13-4.el6.i686

[root@master ~]#

[root@master ~]# rpm -ql libevent    

/usr/lib/libevent-1.4.so.2    #安装后只是生成一个库,主要就是提供事件驱动的功能的,编程的时候,基于这种方式编程????,就依赖于这个库

/usr/lib/libevent-1.4.so.2.1.3

/usr/lib/libevent_core-1.4.so.2

/usr/lib/libevent_core-1.4.so.2.1.3

/usr/lib/libevent_extra-1.4.so.2

/usr/lib/libevent_extra-1.4.so.2.1.3

/usr/share/doc/libevent-1.4.13

/usr/share/doc/libevent-1.4.13/README

[root@master ~]#


https://libevent.org/ 

image.png

image.png

[root@master ~]# uname -r

2.6.32-754.el6.i686

[root@master ~]# cat /etc/issue

Red Hat Enterprise Linux Server release 6.10 (Santiago)

Kernel \r on an \m


[root@master ~]#

红帽5上的libevent好像也是1.4的,我们觉得需要,可以编译安装2.0

无非就是./configure         make        make install    



Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。


memcached是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在

已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。


Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:


1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;

2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;

3. 各服务器间彼此无视:不在服务器间进行数据同步;

4. O(1)的执行效率

5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;


Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。


存储类命令:set, add, replace, append, prepend

获取数据类命令:get, delete, incr/decr

统计类命令:stats, stats items, stats slabs, stats sizes

清理命令: flush_all


一、安装libevent


memcached依赖于libevent API,因此要事先安装之,项目主页:http://libevent.org/,读者可自行选择需要的版本下载。本文采用的是目前最新版本的源码包libevent-2.0.16-stable.tar.gz。安装过程:


# tar xf libevent-2.0.20-stable.tar.gz

# cd libevent-2.0.20

# ./configure --prefix=/usr/local/libevent    #--prefix指定路径,为了避免替换此前的老版本,因为老版本可能被其它的程序所依赖

# make && make install        # 编译 安装


# echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf

# ldconfig 


二、安装配置memcached


1、安装memcached        可以找rpm包,也可以自己编译安装

# tar xf memcached-1.4.15.tar.gz 

# cd memcached-1.4.15

# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent        # --with-libevent告诉memcached,使用我们自己新版的libevent,,,否则使用系统自带的也可以

# make && make install



2、memcached SysV的startup脚本代码如下所示,将其建立为/etc/init.d/memcached文件:


#!/bin/bash

#

# Init file for memcached

#

# chkconfig: - 86 14

# description: Distributed memory caching daemon

#

# processname: memcached

# config: /etc/sysconfig/memcached


. /etc/rc.d/init.d/functions


## Default variables

PORT="11211"

USER="nobody"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""


RETVAL=0

prog="/usr/local/memcached/bin/memcached"

desc="Distributed memory caching"

lockfile="/var/lock/subsys/memcached"


start() {

        echo -n $"Starting $desc (memcached): "

        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS"

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch $lockfile

        return $RETVAL

}


stop() {

        echo -n $"Shutting down $desc (memcached): "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f $lockfile

        return $RETVAL

}


restart() {

        stop

        start

}


reload() {

        echo -n $"Reloading $desc ($prog): "

        killproc $prog -HUP

        RETVAL=$?

        echo

        return $RETVAL

}


case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  condrestart)

        [ -e $lockfile ] && restart

        RETVAL=$?

        ;;       

  reload)

        reload

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

   *)

        echo $"Usage: $0 {start|stop|restart|condrestart|status}"

        RETVAL=1

esac


exit $RETVAL



使用如下命令配置memcached成为系统服务:

# chmod +x /etc/init.d/memcached

# chkconfig --add memcached

# service memcached start


3、使用telnet命令测试memcached的使用


Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。


# telnet 127.0.0.1 11211



add命令:    #add 表示添加一个新键    #set表示修改一个键的键值

add keyname flag  timeout  datasize

如:

add mykey 0 10 12

Hello world!


get命令:

get keyname

如:get mykey

VALUE mykey 0 12

Hello world!

END


4、memcached的常用选项说明


-l <ip_addr>:指定进程监听的地址;

-d: 以服务模式运行;

-u <username>:以指定的用户身份运行memcached进程;

-m <num>:用于缓存数据的最大内存空间,单位为MB,默认为64MB;

-c <num>:最大支持的并发连接数,默认为1024;

-p <num>: 指定监听的TCP端口,默认为11211;

-U <num>:指定监听的UDP端口,默认为11211,0表示关闭UDP端口;

-t <threads>:用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;

-f <num>:设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;

-M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;

-n: 指定最小的slab chunk大小;单位是字节;

-S: 启用sasl进行用户认证;




三、安装Memcache的PHP扩展


①安装PHP的memcache扩展


# tar xf memcache-2.2.5.tgz

# cd memcache-2.2.5

# /usr/local/php/bin/phpize

# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache

# make && make install


上述安装完后会有类似以下的提示:


Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/


②编辑/usr/local/php/lib/php.ini,在“动态模块”相关的位置添加如下一行来载入memcache扩展:

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so



而后对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内容:

<?php

$mem = new Memcache;

$mem->connect("127.0.0.1", 11211)  or die("Could not connect");


$version = $mem->getVersion();

echo "Server's version: ".$version."<br/>\n";


$mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");

echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";


$get_result = $mem->get('testkey');

echo "$get_result is from memcached server.";         

?>



如果有输出“Hello World is from memcached.”等信息,则表明memcache已经能够正常工作。



四、使用libmemcached的客户端工具:


访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等。


1) 编译安装libmemcached


# tar xf libmemcached-1.0.2.tar.gz 

# cd libmemcached-1.0.2

# ./configure 

# make && make install

# ldconfig


2) 客户端工具

# memcat --servers=127.0.0.1:11211 mykey

# memping 

# memslap

# memstat



五、Nginx整合memcached:


server {

        listen       80;

        server_name  www.magedu.com;


        #charset koi8-r;


        #access_log  logs/host.access.log  main;


        location / {

                set $memcached_key $uri;

                memcached_pass     127.0.0.1:11211;

                default_type       text/html;

                error_page         404 @fallback;

        }


        location @fallback {

                proxy_pass http://172.16.0.1;

        }

}




找memcached的rpm包 https://rpmfind.net/ 

https://rpmfind.net/linux/rpm2html/search.php?query=memcached&submit=Search+...&system=&arch= 

image.png


我们其实可以自己做rpm包的,

我们采用编译的方法来安装memcached吧


1)确保已经安装上 libevent     

[root@master ~]# rpm -q libevent    

libevent-1.4.13-4.el6.i686

[root@master ~]#

libevent要另外编译安装的吧???,马哥说也可以,编译安装也很快,这里就不编译安装了

image.png

image.png


http://memcached.org/

http://memcached.org/downloads

https://github.com/memcached/memcached/wiki/ReleaseNotes

https://github.com/memcached/memcached/wiki/ReleaseNotes1415

https://github.com/memcached/memcached/wiki/ReleaseNotes1415

http://memcached.org/files/old/memcached-1.4.5.tar.gz

[root@master ~]# wget http://memcached.org/files/old/memcached-1.4.5.tar.gz

--2021-05-06 14:23:12--  http://memcached.org/files/old/memcached-1.4.5.tar.gz

正在解析主机 memcached.org... 107.170.231.145

正在连接 memcached.org|107.170.231.145|:80... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:302516 (295K) [application/octet-stream]

正在保存至: “memcached-1.4.5.tar.gz”


100%[======================================>] 302,516      262K/s   in 1.1s


2021-05-06 14:23:14 (262 KB/s) - 已保存 “memcached-1.4.5.tar.gz” [302516/302516])


[root@master ~]#

[root@master ~]# tar xf memcached-1.4.5.tar.gz

[root@master ~]# cd memcached-1.4.5

[root@master memcached-1.4.5]#

#单独安装位置,将来卸载简单,一删就行,所以使用--prefix

[root@master memcached-1.4.5]# ./configure --help        ( ./configure --help  | less )

`configure' configures memcached 1.4.5 to adapt to many kinds of systems.


Usage: ./configure [OPTION]... [VAR=VALUE]...


To assign environment variables (e.g., CC, CFLAGS...), specify them as

VAR=VALUE.  See below for descriptions of some of the useful variables.


Defaults for the options are specified in brackets.


Configuration:

  -h, --help              display this help and exit

      --help=short        display options specific to this package

      --help=recursive    display the short help of all the included packages

  -V, --version           display version information and exit

  -q, --quiet, --silent   do not print `checking...' messages

      --cache-file=FILE   cache test results in FILE [disabled]

  -C, --config-cache      alias for `--cache-file=config.cache'

  -n, --no-create         do not create output files

      --srcdir=DIR        find the sources in DIR [configure dir or `..']


Installation directories:

  --prefix=PREFIX         install architecture-independent files in PREFIX

                          [/usr/local]

  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX

                          [PREFIX]


By default, `make install' will install all the files in

`/usr/local/bin', `/usr/local/lib' etc.  You can specify

an installation prefix other than `/usr/local' using `--prefix',

for instance `--prefix=$HOME'.


For better control, use the options below.


Fine tuning of the installation directories:

  --bindir=DIR            user executables [EPREFIX/bin]

  --sbindir=DIR           system admin executables [EPREFIX/sbin]

  --libexecdir=DIR        program executables [EPREFIX/libexec]

  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]    #配置文件路径

  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]

  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]

  --libdir=DIR            object code libraries [EPREFIX/lib]

  --includedir=DIR        C header files [PREFIX/include]

  --oldincludedir=DIR     C header files for non-gcc [/usr/include]

  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]

  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]

  --infodir=DIR           info documentation [DATAROOTDIR/info]

  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]

  --mandir=DIR            man documentation [DATAROOTDIR/man]

  --docdir=DIR            documentation root [DATAROOTDIR/doc/memcached]

  --htmldir=DIR           html documentation [DOCDIR]    #htmldir这是什么????

  --dvidir=DIR            dvi documentation [DOCDIR]

  --pdfdir=DIR            pdf documentation [DOCDIR]

  --psdir=DIR             ps documentation [DOCDIR]


Program names:

  --program-prefix=PREFIX            prepend PREFIX to installed program names

  --program-suffix=SUFFIX            append SUFFIX to installed program names

  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names


System types:

  --build=BUILD     configure for building on BUILD [guessed]

  --host=HOST       cross-compile to build programs to run on HOST [BUILD]

  --target=TARGET   configure for building compilers for TARGET [HOST]


Optional Features:

  --disable-option-checking  ignore unrecognized --enable/--with options

  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)

  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]

  --disable-dependency-tracking  speeds up one-time build

  --enable-dependency-tracking   do not reject slow dependency extractors

  --enable-sasl           Enable SASL authentication        # 启用sasl,,如果memcached谁都能访问,不安全,,,,memcached默认不支持认证,,早期不支持认证,现在可以使用--enable-sasl支持认证 确保首先sasl的开发库要装上

  --enable-sasl-pwdb      Enable plaintext password db    #启用简单的明文密码方式认证

  --enable-dtrace         Enable dtrace probes

  --disable-coverage      Disable code coverage

  --enable-64bit          build 64bit version

  --disable-docs          Disable documentation generation


Optional Packages:

  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]

  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)

  --with-libevent=PATH     Specify path to libevent installation


Some influential environment variables:

  CC          C compiler command

  CFLAGS      C compiler flags

  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a

              nonstandard directory <lib dir>

  LIBS        libraries to pass to the linker, e.g. -l<library>

  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if

              you have headers in a nonstandard directory <include dir>

  CPP         C preprocessor


Use these variables to override the choices made by `configure' or to help

it to find libraries and programs with nonstandard names/locations.


Report bugs to <memcached@googlegroups.com>.

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# rpm -qa | grep sasl    #sasl认证,的devel库要装上

cyrus-sasl-lib-2.1.23-15.el6_6.2.i686

cyrus-sasl-plain-2.1.23-15.el6_6.2.i686

cyrus-sasl-devel-2.1.23-15.el6_6.2.i686    #安装好了

cyrus-sasl-gssapi-2.1.23-15.el6_6.2.i686

cyrus-sasl-md5-2.1.23-15.el6_6.2.i686

cyrus-sasl-2.1.23-15.el6_6.2.i686

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# yum list all | grep sasl

cyrus-sasl.i686                        2.1.23-15.el6_6.2                   @anaconda-RedHatEnterpriseLinux-201805250237.i386/6.10

cyrus-sasl-devel.i686                  2.1.23-15.el6_6.2                   @Base    #有的

cyrus-sasl-gssapi.i686                 2.1.23-15.el6_6.2                   @anaconda-RedHatEnterpriseLinux-201805250237.i386/6.10

cyrus-sasl-lib.i686                    2.1.23-15.el6_6.2                   @anaconda-RedHatEnterpriseLinux-201805250237.i386/6.10

cyrus-sasl-md5.i686                    2.1.23-15.el6_6.2                   @Base

cyrus-sasl-plain.i686                  2.1.23-15.el6_6.2                   @anaconda-RedHatEnterpriseLinux-201805250237.i386/6.10

python-saslwrapper.i686                0.14-1.el6                          Base

saslwrapper.i686                       0.14-1.el6                          Base

[root@master memcached-1.4.5]#


[root@master memcached-1.4.5]# yum -y install cyrus-sasl-devel        #因为已安装,我这里ctrl+c,未执行


[root@master memcached-1.4.5]# ./configure --enable-sasl --prefix=/usr/local/memcached

............................................................................................


checking for main in -lgcov... yes

checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/


      If it's already installed, specify its path using --with-libevent=/dir/

#没找到 libevent?

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# yum  list all | grep libevent    #装上了

libevent.i686                          1.4.13-4.el6                        @anaconda-RedHatEnterpriseLinux-201805250237.i386/6.10

libevent2.i686                         2.0.21-2.el6                        Base

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# rpm -qi libevent    #没看到在哪里

Name        : libevent                     Relocations: (not relocatable)

Version     : 1.4.13                            Vendor: Red Hat, Inc.

Release     : 4.el6                         Build Date: 2012年04月23日 星期一 22时07分29秒

Install Date: 2021年03月18日 星期四 23时29分01秒      Build Host: x86-001.build.bos.redhat.com

Group       : System Environment/Libraries   Source RPM: libevent-1.4.13-4.el6.src.rpm

Size        : 231320                           License: BSD

Signature   : RSA/8, 2012年05月03日 星期四 19时39分36秒, Key ID 199e2f91fd431d51

Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>

URL         : http://monkey.org/~provos/libevent/

Summary     : Abstract asynchronous event notification library

Description :

The libevent API provides a mechanism to execute a callback function

when a specific event occurs on a file descriptor or after a timeout

has been reached. libevent is meant to replace the asynchronous event

loop found in event driven network servers. An application just needs

to call event_dispatch() and can then add or remove events dynamically

without having to change the event loop.

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# rpm -ql libevent        #在libevent下面

/usr/lib/libevent-1.4.so.2

/usr/lib/libevent-1.4.so.2.1.3

/usr/lib/libevent_core-1.4.so.2

/usr/lib/libevent_core-1.4.so.2.1.3

/usr/lib/libevent_extra-1.4.so.2

/usr/lib/libevent_extra-1.4.so.2.1.3

/usr/share/doc/libevent-1.4.13

/usr/share/doc/libevent-1.4.13/README

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# ./configure --enable-sasl --prefix=/usr/local/memcached --with-libevent=/usr/lib

.........................................................

checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/


      If it's already installed, specify its path using --with-libevent=/dir/

#还是报错.只能重新安装libevent了?

[root@master memcached-1.4.5]#


image.png


https://libevent.org/

https://github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz

http://github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz  #有些去掉s,更好点

[root@master ~]# wget http://github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz

.........................................................

2021-05-06 14:50:20 (36.8 KB/s) - 已保存 “libevent-2.0.20-stable.tar.gz” [845446/845446])


[root@master ~]# 

[root@master ~]# tar xf  libevent-2.0.20-stable.tar.gz

[root@master ~]# cd libevent-2.0.20-stable

[root@master libevent-2.0.20-stable]#

[root@master libevent-2.0.20-stable]# ./configure --prefix=/usr/local/libevent

image.png

[root@master libevent-2.0.20-stable]# make && make install

image.png






libevent作为一个线程库做的非常好,libevent的benchmark????和glibc自带的event drivent库比较起来,性能上差别非常大,

libevent是一个api,不是一个应用程序,提供了一种机制,用来实现回调函数的,(事件驱动必须要能够回调),当内核把某个数据完成之后,它直接通过回调函数通知给进程的,它还可以设定signals和timeouts?????libevent支持  /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4). ..........所以说libevent在解决c10k上提供了epoll的机制,(提供了一个高性能的事件驱动框架库),,,,,,,,,,比我们的glibc当中自带的框架库性能要好很多,,,,,,,,,,所以很多现在的这种支持高并发的应用程序在编程的时候就已经自己直接使用libevent库了,所以说现在它已经是一个基本库了,

image.png


[root@master libevent-2.0.20-stable]# cd

[root@master ~]# cd memcached-1.4.5

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# ./configure --enable-sasl --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent        #再配置

image.png

[root@master memcached-1.4.5]# make && make install

image.png


memcached与mysql-proxy很近似,它有一大堆的选项,可以决定你启动这个服务的时候???就一个二进制程序


[root@master memcached-1.4.5]#  /usr/local/memcached/bin/memcached -h        #这个问题如何解决 见 /node-admin/15983

/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]#  /usr/local/memcached/bin/memcached -h           memcached 1.4.5

-p <num>      TCP port number to listen on (default: 11211)    #指定tcp协议的监听端口

-U <num>      UDP port number to listen on (default: 11211, 0 is off)   #指定UDP协议的监听端口 0表示关闭udp协议

-s <file>     UNIX socket path to listen on (disables network support)    #如果只在本地通信,可以监听在某个unix套接字上,向外提供服务,,,,,,mysql有个/tmp/mysql.sock,就是本地套接字的通信机制,能够利用所谓近似于共享内存的方式进行通信的,

-a <mask>     access mask for UNIX socket, in octal (default: 0700)

-l <ip_addr>  interface to listen on (default: INADDR_ANY, all addresses)    #监听的地址,默认监听本机所有地址

-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: 64 MB)        #以兆为单位,指定memcached可用的最大内存空间

-M            return error on memory exhausted (rather than removing items)

-c <num>      max simultaneous connections (default: 1024)

-k            lock down all paged memory.  Note that there is a

              limit on how much memory you may lock.  Trying to

              allocate more than that would fail, so be sure you

              set the limit correctly for the user you started

              the daemon with (not for -u <username> user;

              under sh this is done with 'ulimit -S -l NUM_KB').

-v            verbose (print errors/warnings while in event loop)    #详细信息

-vv           very verbose (also print client commands/reponses)   #更详细信息

-vvv          extremely verbose (also print internal state transitions)   #更更详细信息

-h            print this help and exit

-i            print memcached and libevent license

-P <file>     save PID in <file>, only used with -d option    #指定pid文件的

-f <factor>   chunk size growth factor (default: 1.25)        #设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;

-n <bytes>    minimum space allocated for key+value+flags (default: 48)        #指定最小的 slab chunk 大小;单位是字节;

-L            Try to use large memory pages (if available). Increasing        #试图使用最多的内存空间

              the memory page size could reduce the number of TLB misses

              and improve the performance. In order to get large pages

              from the OS, memcached will allocate the total item-cache

              in one large chunk.

-D <char>     Use <char> as the delimiter between key prefixes and IDs.

              This is used for per-prefix stats reporting. The default is

              ":" (colon). If this option is specified, stats collection

              is turned on automatically; if not, then it may be turned on

              by sending the "stats detail on" command to the server.

-t <num>      number of threads to use (default: 4)        #用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效

-R            Maximum number of requests per event, limits the number of

              requests process for a given connection to prevent

              starvation (default: 20)

-C            Disable use of CAS        #禁用CAS???是NoSQL的一个重要特性评估

-b            Set the backlog queue limit (default: 1024)    #指定backlog???的队列大小,默认1024,基本够用了

-B            Binding protocol - one of ascii, binary, or auto (default)

-I            Override the size of each slab page. Adjusts max item size

              (default: 1mb, min: 1k, max: 128m)

-S            Turn on Sasl authentication        #启用sasl用户认证功能的(刚刚编译时把sasl功能加进去了)


-o         #我这版没有了,马哥那边有,逗号分隔一大堆额外选项,我们基本用不上

[root@master memcached-1.4.5]# ldd  /usr/local/memcached/bin/memcached

        linux-gate.so.1 =>  (0x0056f000)

        libhugetlbfs.so => /usr/lib/libhugetlbfs.so (0x00b1c000)

        libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x004b9000)

        libevent-2.0.so.5 => /usr/lib/libevent-2.0.so.5 (0x008ba000)

        libpthread.so.0 => /lib/libpthread.so.0 (0x00712000)

        libc.so.6 => /lib/libc.so.6 (0x00579000)

        libdl.so.2 => /lib/libdl.so.2 (0x0072f000)

        libresolv.so.2 => /lib/libresolv.so.2 (0x001ea000)

        libcrypt.so.1 => /lib/libcrypt.so.1 (0x00dae000)

        librt.so.1 => /lib/librt.so.1 (0x00736000)

        /lib/ld-linux.so.2 (0x80047000)

        libfreebl3.so => /lib/libfreebl3.so (0x00de0000)

[root@master memcached-1.4.5]#



-d 守护进程

-m 128 使用的最大内存空间128M

-n 20  最小的slab chunk大小;单位是字节

-f 增长因子,一般1-2之间是理想值吧

-v 详细信息

[root@master memcached-1.4.5]#  /usr/local/memcached/bin/memcached  -m 128 -n 20 -f 1.25 -v    #不使用 -d 可以显示过程的

can't run as root without the -u switch        #root不允许

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]#  /usr/local/memcached/bin/memcached -d -m 128 -n 20 -f 1.25 -v -u nobody    #无信息显示? 我不小心加了 -d 

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# netstat -tunlp  | grep 11211

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LIST

tcp        0      0 :::11211                    :::*                        LIST

udp        0      0 0.0.0.0:11211               0.0.0.0:*

udp        0      0 :::11211                    :::*

[root@master memcached-1.4.5]# killall memcached

[root@master memcached-1.4.5]#  /usr/local/memcached/bin/memcached -d -m 128 -n 20 -f 1.25 -vv -u nobody       #我不小心加了 -d  #改成-vv        #会显示分配内存的详细信息

[root@master memcached-1.4.5]# slab class   1: chunk size        56 perslab   18724      

                                                                                                     #它最小是56,不是指定的20  ,          18724  应该是个数吧

slab class   2: chunk size        72 perslab   14563        

slab class   3: chunk size        96 perslab   10922

slab class   4: chunk size       120 perslab    8738

slab class   5: chunk size       152 perslab    6898

slab class   6: chunk size       192 perslab    5461

slab class   7: chunk size       240 perslab    4369

slab class   8: chunk size       304 perslab    3449

slab class   9: chunk size       384 perslab    2730

slab class  10: chunk size       480 perslab    2184

slab class  11: chunk size       600 perslab    1747

slab class  12: chunk size       752 perslab    1394

slab class  13: chunk size       944 perslab    1110

slab class  14: chunk size      1184 perslab     885

slab class  15: chunk size      1480 perslab     708

slab class  16: chunk size      1856 perslab     564

slab class  17: chunk size      2320 perslab     451

slab class  18: chunk size      2904 perslab     361

slab class  19: chunk size      3632 perslab     288

slab class  20: chunk size      4544 perslab     230

slab class  21: chunk size      5680 perslab     184

slab class  22: chunk size      7104 perslab     147

slab class  23: chunk size      8880 perslab     118

slab class  24: chunk size     11104 perslab      94

slab class  25: chunk size     13880 perslab      75

slab class  26: chunk size     17352 perslab      60

slab class  27: chunk size     21696 perslab      48

slab class  28: chunk size     27120 perslab      38

slab class  29: chunk size     33904 perslab      30

slab class  30: chunk size     42384 perslab      24

slab class  31: chunk size     52984 perslab      19

slab class  32: chunk size     66232 perslab      15

slab class  33: chunk size     82792 perslab      12

slab class  34: chunk size    103496 perslab      10

slab class  35: chunk size    129376 perslab       8

slab class  36: chunk size    161720 perslab       6

slab class  37: chunk size    202152 perslab       5

slab class  38: chunk size    252696 perslab       4

slab class  39: chunk size    315872 perslab       3

slab class  40: chunk size    394840 perslab       2

slab class  41: chunk size    493552 perslab       2

slab class  42: chunk size    616944 perslab       1

slab class  43: chunk size    771184 perslab       1

slab class  44: chunk size   1048576 perslab       1        #1048576 是最大的类别的字节

<26 server listening (auto-negotiate)

<27 server listening (auto-negotiate)

<28 send buffer was 112640, now 268435456

<29 send buffer was 112640, now 268435456

<28 server listening (udp)

<29 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)

<28 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)

<29 server listening (udp)

^C

[root@master memcached-1.4.5]# netstat -tunlp  | grep 11211

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LIST

tcp        0      0 :::11211                    :::*                        LIST

udp        0      0 0.0.0.0:11211               0.0.0.0:*

udp        0      0 :::11211                    :::*

[root@master memcached-1.4.5]# killall memcached


[root@master memcached-1.4.5]#  /usr/local/memcached/bin/memcached -d -m 128 -n 20 -f 1.1 -vv -u nobody   #我不小心加了 -d #增长因子换为 1.1

[root@master memcached-1.4.5]# slab class   1: chunk size        56 perslab   18724        #也是56开始,也不是20

slab class   2: chunk size        64 perslab   16384    #第二个是64

slab class   3: chunk size        72 perslab   14563

slab class   4: chunk size        80 perslab   13107

slab class   5: chunk size        88 perslab   11915

slab class   6: chunk size        96 perslab   10922

slab class   7: chunk size       112 perslab    9362

slab class   8: chunk size       128 perslab    8192

slab class   9: chunk size       144 perslab    7281

slab class  10: chunk size       160 perslab    6553

slab class  11: chunk size       176 perslab    5957

slab class  12: chunk size       200 perslab    5242

slab class  13: chunk size       224 perslab    4681

slab class  14: chunk size       248 perslab    4228

slab class  15: chunk size       272 perslab    3855

slab class  16: chunk size       304 perslab    3449

slab class  17: chunk size       336 perslab    3120

slab class  18: chunk size       376 perslab    2788

slab class  19: chunk size       416 perslab    2520

slab class  20: chunk size       464 perslab    2259

slab class  21: chunk size       512 perslab    2048

slab class  22: chunk size       568 perslab    1846

slab class  23: chunk size       624 perslab    1680

slab class  24: chunk size       688 perslab    1524

slab class  25: chunk size       760 perslab    1379

slab class  26: chunk size       840 perslab    1248

slab class  27: chunk size       928 perslab    1129

slab class  28: chunk size      1024 perslab    1024

slab class  29: chunk size      1128 perslab     929

slab class  30: chunk size      1240 perslab     845

slab class  31: chunk size      1368 perslab     766

slab class  32: chunk size      1504 perslab     697

slab class  33: chunk size      1656 perslab     633

slab class  34: chunk size      1824 perslab     574

slab class  35: chunk size      2008 perslab     522

slab class  36: chunk size      2208 perslab     474

slab class  37: chunk size      2432 perslab     431

slab class  38: chunk size      2680 perslab     391

slab class  39: chunk size      2952 perslab     355

slab class  40: chunk size      3248 perslab     322

slab class  41: chunk size      3576 perslab     293

slab class  42: chunk size      3936 perslab     266

slab class  43: chunk size      4336 perslab     241

slab class  44: chunk size      4776 perslab     219

slab class  45: chunk size      5256 perslab     199

slab class  46: chunk size      5784 perslab     181

slab class  47: chunk size      6368 perslab     164

slab class  48: chunk size      7008 perslab     149

slab class  49: chunk size      7712 perslab     135

slab class  50: chunk size      8488 perslab     123

slab class  51: chunk size      9336 perslab     112

slab class  52: chunk size     10272 perslab     102

slab class  53: chunk size     11304 perslab      92

slab class  54: chunk size     12440 perslab      84

slab class  55: chunk size     13688 perslab      76

slab class  56: chunk size     15056 perslab      69

slab class  57: chunk size     16568 perslab      63

slab class  58: chunk size     18224 perslab      57

slab class  59: chunk size     20048 perslab      52

slab class  60: chunk size     22056 perslab      47

slab class  61: chunk size     24264 perslab      43

slab class  62: chunk size     26696 perslab      39

slab class  63: chunk size     29368 perslab      35

slab class  64: chunk size     32304 perslab      32

slab class  65: chunk size     35536 perslab      29

slab class  66: chunk size     39096 perslab      26

slab class  67: chunk size     43008 perslab      24

slab class  68: chunk size     47312 perslab      22

slab class  69: chunk size     52048 perslab      20

slab class  70: chunk size     57256 perslab      18

slab class  71: chunk size     62984 perslab      16

slab class  72: chunk size     69288 perslab      15

slab class  73: chunk size     76216 perslab      13

slab class  74: chunk size     83840 perslab      12

slab class  75: chunk size     92224 perslab      11

slab class  76: chunk size    101448 perslab      10

slab class  77: chunk size    111592 perslab       9

slab class  78: chunk size    122752 perslab       8

slab class  79: chunk size    135032 perslab       7

slab class  80: chunk size    148536 perslab       7

slab class  81: chunk size    163392 perslab       6

slab class  82: chunk size    179736 perslab       5

slab class  83: chunk size    197712 perslab       5

slab class  84: chunk size    217488 perslab       4

slab class  85: chunk size    239240 perslab       4

slab class  86: chunk size    263168 perslab       3

slab class  87: chunk size    289488 perslab       3

slab class  88: chunk size    318440 perslab       3

slab class  89: chunk size    350288 perslab       2

slab class  90: chunk size    385320 perslab       2

slab class  91: chunk size    423856 perslab       2

slab class  92: chunk size    466248 perslab       2

slab class  93: chunk size    512872 perslab       2

slab class  94: chunk size    564160 perslab       1

slab class  95: chunk size    620576 perslab       1

slab class  96: chunk size    682640 perslab       1

slab class  97: chunk size    750904 perslab       1

slab class  98: chunk size    826000 perslab       1

slab class  99: chunk size    908600 perslab       1

slab class 100: chunk size   1048576 perslab       1

<26 server listening (auto-negotiate)

<27 server listening (auto-negotiate)

<28 send buffer was 112640, now 268435456

<29 send buffer was 112640, now 268435456

<28 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)

<29 server listening (udp)

^C

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# netstat -tunlp  | grep 11211

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LIST

tcp        0      0 :::11211                    :::*                        LIST

udp        0      0 0.0.0.0:11211               0.0.0.0:*

udp        0      0 :::11211                    :::*

[root@master memcached-1.4.5]# killall memcached

[root@master memcached-1.4.5]#  /usr/local/memcached/bin/memcached -d -m 128 -n 20 -f 1.1 -vv -u nobody

[root@master memcached-1.4.5]# slab class   1: chunk size        56 perslab   18724

slab class   2: chunk size        64 perslab   16384

slab class   3: chunk size        72 perslab   14563

slab class   4: chunk size        80 perslab   13107

slab class   5: chunk size        88 perslab   11915

slab class   6: chunk size        96 perslab   10922

slab class   7: chunk size       112 perslab    9362

slab class   8: chunk size       128 perslab    8192

slab class   9: chunk size       144 perslab    7281

slab class  10: chunk size       160 perslab    6553

slab class  11: chunk size       176 perslab    5957

slab class  12: chunk size       200 perslab    5242

slab class  13: chunk size       224 perslab    4681

slab class  14: chunk size       248 perslab    4228

slab class  15: chunk size       272 perslab    3855

slab class  16: chunk size       304 perslab    3449

slab class  17: chunk size       336 perslab    3120

slab class  18: chunk size       376 perslab    2788

slab class  19: chunk size       416 perslab    2520

slab class  20: chunk size       464 perslab    2259

slab class  21: chunk size       512 perslab    2048

slab class  22: chunk size       568 perslab    1846

slab class  23: chunk size       624 perslab    1680

slab class  24: chunk size       688 perslab    1524

slab class  25: chunk size       760 perslab    1379

slab class  26: chunk size       840 perslab    1248

slab class  27: chunk size       928 perslab    1129

slab class  28: chunk size      1024 perslab    1024

slab class  29: chunk size      1128 perslab     929

slab class  30: chunk size      1240 perslab     845

slab class  31: chunk size      1368 perslab     766

slab class  32: chunk size      1504 perslab     697

slab class  33: chunk size      1656 perslab     633

slab class  34: chunk size      1824 perslab     574

slab class  35: chunk size      2008 perslab     522

slab class  36: chunk size      2208 perslab     474

slab class  37: chunk size      2432 perslab     431

slab class  38: chunk size      2680 perslab     391

slab class  39: chunk size      2952 perslab     355

slab class  40: chunk size      3248 perslab     322

slab class  41: chunk size      3576 perslab     293

slab class  42: chunk size      3936 perslab     266

slab class  43: chunk size      4336 perslab     241

slab class  44: chunk size      4776 perslab     219

slab class  45: chunk size      5256 perslab     199

slab class  46: chunk size      5784 perslab     181

slab class  47: chunk size      6368 perslab     164

slab class  48: chunk size      7008 perslab     149

slab class  49: chunk size      7712 perslab     135

slab class  50: chunk size      8488 perslab     123

slab class  51: chunk size      9336 perslab     112

slab class  52: chunk size     10272 perslab     102

slab class  53: chunk size     11304 perslab      92

slab class  54: chunk size     12440 perslab      84

slab class  55: chunk size     13688 perslab      76

slab class  56: chunk size     15056 perslab      69

slab class  57: chunk size     16568 perslab      63

slab class  58: chunk size     18224 perslab      57

slab class  59: chunk size     20048 perslab      52

slab class  60: chunk size     22056 perslab      47

slab class  61: chunk size     24264 perslab      43

slab class  62: chunk size     26696 perslab      39

slab class  63: chunk size     29368 perslab      35

slab class  64: chunk size     32304 perslab      32

slab class  65: chunk size     35536 perslab      29

slab class  66: chunk size     39096 perslab      26

slab class  67: chunk size     43008 perslab      24

slab class  68: chunk size     47312 perslab      22

slab class  69: chunk size     52048 perslab      20

slab class  70: chunk size     57256 perslab      18

slab class  71: chunk size     62984 perslab      16

slab class  72: chunk size     69288 perslab      15

slab class  73: chunk size     76216 perslab      13

slab class  74: chunk size     83840 perslab      12

slab class  75: chunk size     92224 perslab      11

slab class  76: chunk size    101448 perslab      10

slab class  77: chunk size    111592 perslab       9

slab class  78: chunk size    122752 perslab       8

slab class  79: chunk size    135032 perslab       7

slab class  80: chunk size    148536 perslab       7

slab class  81: chunk size    163392 perslab       6

slab class  82: chunk size    179736 perslab       5

slab class  83: chunk size    197712 perslab       5

slab class  84: chunk size    217488 perslab       4

slab class  85: chunk size    239240 perslab       4

slab class  86: chunk size    263168 perslab       3

slab class  87: chunk size    289488 perslab       3

slab class  88: chunk size    318440 perslab       3

slab class  89: chunk size    350288 perslab       2

slab class  90: chunk size    385320 perslab       2

slab class  91: chunk size    423856 perslab       2

slab class  92: chunk size    466248 perslab       2

slab class  93: chunk size    512872 perslab       2

slab class  94: chunk size    564160 perslab       1

slab class  95: chunk size    620576 perslab       1

slab class  96: chunk size    682640 perslab       1

slab class  97: chunk size    750904 perslab       1

slab class  98: chunk size    826000 perslab       1

slab class  99: chunk size    908600 perslab       1

slab class 100: chunk size   1048576 perslab       1

<26 server listening (auto-negotiate)

<27 server listening (auto-negotiate)

<28 send buffer was 112640, now 268435456

<29 send buffer was 112640, now 268435456

<28 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)

<29 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)

<28 server listening (udp)

<29 server listening (udp)


[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# netstat -tunlp        #由下面tcp两个11211,udp两个11211

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      14042/memcached    #0.0.0.0:11211与:::11211区别????

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1758/rpcbind

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2599/nginx

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2118/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1837/cupsd

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2455/master

tcp        0      0 0.0.0.0:45446               0.0.0.0:*                   LISTEN      1781/rpc.statd

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      2094/php-fpm

tcp        0      0 :::3306                     :::*                        LISTEN      2385/mysqld

tcp        0      0 :::11211                    :::*                        LISTEN      14042/memcached

tcp        0      0 :::111                      :::*                        LISTEN      1758/rpcbind

tcp        0      0 :::22                       :::*                        LISTEN      2118/sshd

tcp        0      0 ::1:631                     :::*                        LISTEN      1837/cupsd

tcp        0      0 ::1:25                      :::*                        LISTEN      2455/master

tcp        0      0 :::46595                    :::*                        LISTEN      1781/rpc.statd

udp        0      0 0.0.0.0:11211               0.0.0.0:*                               14042/memcached

udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1758/rpcbind

udp        0      0 0.0.0.0:631                 0.0.0.0:*                               1837/cupsd

udp        0      0 192.168.0.60:123            0.0.0.0:*                               2129/ntpd

udp        0      0 127.0.0.1:123               0.0.0.0:*                               2129/ntpd

udp        0      0 0.0.0.0:123                 0.0.0.0:*                               2129/ntpd

udp        0      0 0.0.0.0:661                 0.0.0.0:*                               1758/rpcbind

udp        0      0 0.0.0.0:42780               0.0.0.0:*                               1781/rpc.statd

udp        0      0 127.0.0.1:703               0.0.0.0:*                               1781/rpc.statd

udp        0      0 :::11211                    :::*                                    14042/memcached

udp        0      0 :::34799                    :::*                                    1781/rpc.statd

udp        0      0 :::111                      :::*                                    1758/rpcbind

udp        0      0 fe80::20c:29ff:fe03:7488:123 :::*                                    2129/ntpd

udp        0      0 ::1:123                     :::*                                    2129/ntpd

udp        0      0 :::123                      :::*                                    2129/ntpd

udp        0      0 :::661                      :::*                                    1758/rpcbind

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# telnet localhost 11211

-bash: telnet: command not found

[root@master memcached-1.4.5]#

[root@master memcached-1.4.5]# yum -y install telnet

image.png



[root@master memcached-1.4.5]# telnet localhost 11211

Trying ::1...

Connected to localhost.

Escape character is '^]'.

<30 new auto-negotiating client connection

help

30: Client using the ascii protocol

<30 help

>30 ERROR

ERROR

stats    #这个子命令?显示当然状态的

<30 stats

STAT pid 14042    #pid号

STAT uptime 342    #运行多长时间

STAT time 1620291851

STAT version 1.4.5    #版本号

STAT pointer_size 32

STAT rusage_user 0.000000

STAT rusage_system 0.015997

STAT curr_connections 10

STAT total_connections 11

STAT connection_structures 11

STAT cmd_get 0    #用了多少次get

STAT cmd_set 0    #用了多少次set

STAT cmd_flush 0    #flush命令

STAT get_hits 0        #get命中率

STAT get_misses 0    #get未命中率

STAT delete_misses 0    #delete未命中率

STAT delete_hits 0   #delete命中率

STAT incr_misses 0

STAT incr_hits 0

STAT decr_misses 0

STAT decr_hits 0

STAT cas_misses 0

STAT cas_hits 0

STAT cas_badval 0

STAT auth_cmds 0        #认证的

STAT auth_errors 0

STAT bytes_read 13

STAT bytes_written 7

STAT limit_maxbytes 134217728

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT conn_yields 0

STAT bytes 0

STAT curr_items 0

STAT total_items 0

STAT evictions 0

STAT reclaimed 0

END




Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。


memcached是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在

已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。


Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要反映在如下方面:


1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;

2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;

3. 各服务器间彼此无视:不在服务器间进行数据同步;

4. O(1)的执行效率

5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;


Memcached提供了为数不多的几个命令来完成与服务器端的交互,这些命令基于memcached的协议实现。


存储类命令:set, add, replace, append, prepend

获取数据类命令:get, delete, incr/decr

统计类命令:stats, stats items, stats slabs, stats sizes

清理命令: flush_all


一、安装libevent


memcached依赖于libevent API,因此要事先安装之,项目主页:http://libevent.org/,读者可自行选择需要的版本下载。本文采用的是目前最新版本的源码包libevent-2.0.16-stable.tar.gz。安装过程:


# tar xf libevent-2.0.20-stable.tar.gz

# cd libevent-2.0.20

# ./configure --prefix=/usr/local/libevent

# make && make install


# echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf

# ldconfig 


二、安装配置memcached


1、安装memcached

# tar xf memcached-1.4.15.tar.gz 

# cd memcached-1.4.15

# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent

# make && make install



2、memcached SysV的startup脚本代码如下所示,将其建立为/etc/init.d/memcached文件:


#!/bin/bash

#

# Init file for memcached

#

# chkconfig: - 86 14

# description: Distributed memory caching daemon

#

# processname: memcached

# config: /etc/sysconfig/memcached


. /etc/rc.d/init.d/functions


## Default variables

PORT="11211"

USER="nobody"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""


RETVAL=0

prog="/usr/local/memcached/bin/memcached"

desc="Distributed memory caching"

lockfile="/var/lock/subsys/memcached"


start() {

        echo -n $"Starting $desc (memcached): "

        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS"

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch $lockfile

        return $RETVAL

}


stop() {

        echo -n $"Shutting down $desc (memcached): "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f $lockfile

        return $RETVAL

}


restart() {

        stop

        start

}


reload() {

        echo -n $"Reloading $desc ($prog): "

        killproc $prog -HUP

        RETVAL=$?

        echo

        return $RETVAL

}


case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  condrestart)

        [ -e $lockfile ] && restart

        RETVAL=$?

        ;;       

  reload)

        reload

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

   *)

        echo $"Usage: $0 {start|stop|restart|condrestart|status}"

        RETVAL=1

esac


exit $RETVAL



使用如下命令配置memcached成为系统服务:

# chmod +x /etc/init.d/memcached

# chkconfig --add memcached

# service memcached start


3、使用telnet命令测试memcached的使用


Memcached提供一组基本命令用于基于命令行调用其服务或查看服务器状态等。


# telnet 127.0.0.1 11211



add命令:

add keyname flag  timeout  datasize

如:

add mykey 0 10 12

Hello world!


get命令:

get keyname

如:get mykey

VALUE mykey 0 12

Hello world!

END


4、memcached的常用选项说明


-l <ip_addr>:指定进程监听的地址;

-d: 以服务模式运行;

-u <username>:以指定的用户身份运行memcached进程;

-m <num>:用于缓存数据的最大内存空间,单位为MB,默认为64MB;

-c <num>:最大支持的并发连接数,默认为1024;

-p <num>: 指定监听的TCP端口,默认为11211;

-U <num>:指定监听的UDP端口,默认为11211,0表示关闭UDP端口;

-t <threads>:用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;

-f <num>:设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;

-M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;

-n: 指定最小的slab chunk大小;单位是字节;

-S: 启用sasl进行用户认证;




三、安装Memcache的PHP扩展


①安装PHP的memcache扩展


# tar xf memcache-2.2.5.tgz

# cd memcache-2.2.5

/usr/local/php/bin/phpize

# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache

# make && make install


上述安装完后会有类似以下的提示:


Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/


②编辑/usr/local/php/lib/php.ini,在“动态模块”相关的位置添加如下一行来载入memcache扩展:

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so



而后对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内容:

<?php

$mem = new Memcache;

$mem->connect("127.0.0.1", 11211)  or die("Could not connect");


$version = $mem->getVersion();

echo "Server's version: ".$version."<br/>\n";


$mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");

echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";


$get_result = $mem->get('testkey');

echo "$get_result is from memcached server.";         

?>



如果有输出“Hello World is from memcached.”等信息,则表明memcache已经能够正常工作。



四、使用libmemcached的客户端工具:


访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等。


1) 编译安装libmemcached


# tar xf libmemcached-1.0.2.tar.gz 

# cd libmemcached-1.0.2

# ./configure 

# make && make install

# ldconfig


2) 客户端工具

# memcat --servers=127.0.0.1:11211 mykey

# memping 

# memslap

# memstat



五、Nginx整合memcached:


server {

        listen       80;

        server_name  www.magedu.com;


        #charset koi8-r;


        #access_log  logs/host.access.log  main;


        location / {

                set $memcached_key $uri;

                memcached_pass     127.0.0.1:11211;

                default_type       text/html;

                error_page         404 @fallback;

        }


        location @fallback {

                proxy_pass http://172.16.0.1;

        }

}



[root@master ~]# telnet localhost 11211                                         Trying ::1...

Connected to localhost.

Escape character is '^]'.

<30 new auto-negotiating client connection

stats

30: Client using the ascii protocol

<30 stats

STAT pid 2791

STAT uptime 17

STAT time 1620347374

STAT version 1.4.5

STAT pointer_size 32

STAT rusage_user 0.000000

STAT rusage_system 0.005999

STAT curr_connections 10

STAT total_connections 11

STAT connection_structures 11

STAT cmd_get 0

STAT cmd_set 0

STAT cmd_flush 0

STAT get_hits 0

STAT get_misses 0

STAT delete_misses 0

STAT delete_hits 0

STAT incr_misses 0

STAT incr_hits 0

STAT decr_misses 0

STAT decr_hits 0

STAT cas_misses 0

STAT cas_hits 0

STAT cas_badval 0

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 7

STAT bytes_written 0

STAT limit_maxbytes 134217728

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT conn_yields 0

STAT bytes 0

STAT curr_items 0

STAT total_items 0

STAT evictions 0

STAT reclaimed 0

END

add mykey 0 560   #这里应该使用的是二进制协议???      #存,增加值       add后面分别为键,标识位,超时时间,字符长度        #append后面补值  prepend前面补值

<30 add mykey 0 60 5

hello

>30 STORED

STORED

get mykey    #取

<30 get mykey

>30 sending key mykey

>30 END

VALUE mykey 0 5

hello

END

get mykey    #过了60秒,,,取不到值了,,,,,,,在内存中没有清空掉,但是系统已经标记为失效了

<30 get mykey        

>30 END

END

flush        #里面没有任何数据,所以error了,,不对,应该是flush_all

<30 flush

>30 ERROR

ERROR

flush *        #里面没有任何数据,所以error了

<30 flush *

>30 ERROR

ERROR


memcached 的基本命令

get

set     #格式与add一样

add 

replace     #替换现在键的值

append    #在一个键的值后面新增值

prepend     #在一个键的值前面新增值

incr    #increment 在一个键的值加1

decr    #decrement 在一个键的值减1

delete #删除一个键

flush_all #清理所有键

stats    #显示状态,,可以只显示某一个的状态            

                stats

                stats slabs

                stats malloc

                stats items

                stats detail

                stats sizes

                stats reset    #重新计数?

version     #显示版本号

verbosity    #增加日志级别???显示更详细信息

quit    #退出



image.png

image.png

image.png




image.png

image.png

image.png

image.png


memcached的复杂性在于应用程序的,不在于memcached本身

php操作mysql,调用一个库,函数中传一大堆参数,我们使用某一个应用程序来连接上一个服务的时候,必须要利用这个服务的客户端库去编程,没法调用客户端,只能调用客户端库,

所以很多应用程序必须要1)提供命令行工具,2)提供库

memcached没有什么客户端,就是使用telnet连上去交互操作

我们php开发的时候,需要memcached的客户端库,才能简单的利用memcached


perl module    #使用这个模块cache::memcached来作为客户端库

    cache::memcached

 

php 扩展  两个库

    memcache

    memcached      #比memcache好用,先进,强大,所以一般用它


C,C++ 库,提供了接口,

    libmemcached    提供一堆命令行工具,客户端工具,比如连到memcached服务器上来作一些测试,作远程管理等

                    (mysql还有mysqladmin,它就是类似于这样)


memadmin     memcached基于web的管理界面,来看看命中率,清理缓存等,都可以在gui接口上实现      


[root@master ~]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      2791/memcached

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1755/rpcbind

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2594/nginx

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2114/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1833/cupsd

tcp        0      0 0.0.0.0:57879               0.0.0.0:*                   LISTEN      1777/rpc.statd

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2451/master

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      2090/php-fpm

tcp        0      0 :::3306                     :::*                        LISTEN      2381/mysqld

tcp        0      0 :::11211                    :::*                        LISTEN      2791/memcached

tcp        0      0 :::111                      :::*                        LISTEN      1755/rpcbind

tcp        0      0 :::22                       :::*                        LISTEN      2114/sshd

tcp        0      0 ::1:631                     :::*                        LISTEN      1833/cupsd

tcp        0      0 ::1:25                      :::*                        LISTEN      2451/master

tcp        0      0 :::42150                    :::*                        LISTEN      1777/rpc.statd

[root@master ~]#

[root@master ~]# killall memcached

[root@master ~]#

我们提供服务脚本


daemon,killproc 是 /etc/rc.d/init.d/functions 里面的函数

HUP 信号是让重新读配置文件的

可以弄个配置文件,在 /etc/rc.d/init.d/memcached 引入配置文件,在配置文件里面改参数


[root@master ~]# vim /etc/rc.d/init.d/memcached

#!/bin/bash

#

# Init file for memcached

#

# chkconfig: - 86 14

# description: Distributed memory caching daemon

#

# processname: memcached

# config: /etc/sysconfig/memcached

. /etc/rc.d/init.d/functions

## Default variables

PORT="11211"

USER="nobody"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""

RETVAL=0

prog="/usr/local/memcached/bin/memcached"

desc="Distributed memory caching"

lockfile="/var/lock/subsys/memcached"

start() {

        echo -n $"Starting $desc (memcached): "

        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE -o "$OPTIONS"

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch $lockfile

        return $RETVAL

}

stop() {

        echo -n $"Shutting down $desc (memcached): "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f $lockfile

        return $RETVAL

}

restart() {

        stop

        start

}

reload() {

        echo -n $"Reloading $desc ($prog): "

        killproc $prog -HUP

        RETVAL=$?

        echo

        return $RETVAL

}

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  condrestart)

        [ -e $lockfile ] && restart

        RETVAL=$?

        ;;

  reload)

        reload

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

   *)

        echo $"Usage: $0 {start|stop|restart|condrestart|status}"

        RETVAL=1

esac

exit $RETVAL


[root@master ~]# chmod +x /etc/rc.d/init.d/memcached    #给权限

[root@master ~]#

[root@master ~]# chkconfig --add memcached        #加到服务列表中

[root@master ~]#

[root@master ~]# service memcached start

Starting Distributed memory caching (memcached): /usr/local/memcached/bin/memcached: invalid option -- 'o'

Illegal argument "?"

                                                           [失败]


把 /usr/local/memcached/bin/memcached 里面的-o去了

[root@master ~]#

[root@master ~]# vim /etc/rc.d/init.d/memcached

#!/bin/bash

#

# Init file for memcached

#

# chkconfig: - 86 14

# description: Distributed memory caching daemon

#

# processname: memcached

# config: /etc/sysconfig/memcached

. /etc/rc.d/init.d/functions

## Default variables

PORT="11211"

USER="nobody"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""

RETVAL=0

prog="/usr/local/memcached/bin/memcached"

desc="Distributed memory caching"

lockfile="/var/lock/subsys/memcached"

start() {

        echo -n $"Starting $desc (memcached): "

        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS    #仅改了这一行去了-o,再去引号的

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch $lockfile

        return $RETVAL

}

stop() {

        echo -n $"Shutting down $desc (memcached): "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f $lockfile

        return $RETVAL

}

restart() {

        stop

        start

}

reload() {

        echo -n $"Reloading $desc ($prog): "

        killproc $prog -HUP

        RETVAL=$?

        echo

        return $RETVAL

}

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  condrestart)

        [ -e $lockfile ] && restart

        RETVAL=$?

        ;;

  reload)

        reload

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

   *)

        echo $"Usage: $0 {start|stop|restart|condrestart|status}"

        RETVAL=1

esac

exit $RETVAL

                      

[root@master ~]# service memcached start

Starting Distributed memory caching (memcached):           [确定]

[root@master ~]# service memcached restart

Shutting down Distributed memory caching (memcached):      [确定]

Starting Distributed memory caching (memcached):           [确定]

[root@master ~]#

[root@master ~]# netstat -tnlp            #看到11211了

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      3429/memcached

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1755/rpcbind

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2594/nginx

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2114/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1833/cupsd

tcp        0      0 0.0.0.0:57879               0.0.0.0:*                   LISTEN      1777/rpc.statd

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2451/master

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      2090/php-fpm

tcp        0      0 :::3306                     :::*                        LISTEN      2381/mysqld

tcp        0      0 :::11211                    :::*                        LISTEN      3429/memcached

tcp        0      0 :::111                      :::*                        LISTEN      1755/rpcbind

tcp        0      0 :::22                       :::*                        LISTEN      2114/sshd

tcp        0      0 ::1:631                     :::*                        LISTEN      1833/cupsd

tcp        0      0 ::1:25                      :::*                        LISTEN      2451/master

tcp        0      0 :::42150                    :::*                        LISTEN      1777/rpc.statd

[root@master ~]#

[root@master ~]# netstat -tunlp    #同时还看到udp的11211 ,,, /usr/local/memcached/bin/memcached命令中-u 0 ,就不监听udp的了

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      3429/memcached

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1755/rpcbind

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2594/nginx

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2114/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1833/cupsd

tcp        0      0 0.0.0.0:57879               0.0.0.0:*                   LISTEN      1777/rpc.statd

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2451/master

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      2090/php-fpm

tcp        0      0 :::3306                     :::*                        LISTEN      2381/mysqld

tcp        0      0 :::11211                    :::*                        LISTEN      3429/memcached

tcp        0      0 :::111                      :::*                        LISTEN      1755/rpcbind

tcp        0      0 :::22                       :::*                        LISTEN      2114/sshd

tcp        0      0 ::1:631                     :::*                        LISTEN      1833/cupsd

tcp        0      0 ::1:25                      :::*                        LISTEN      2451/master

tcp        0      0 :::42150                    :::*                        LISTEN      1777/rpc.statd

udp        0      0 0.0.0.0:11211               0.0.0.0:*                               3429/memcached

udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1755/rpcbind

udp        0      0 0.0.0.0:631                 0.0.0.0:*                               1833/cupsd

udp        0      0 0.0.0.0:43768               0.0.0.0:*                               1777/rpc.statd

udp        0      0 192.168.0.60:123            0.0.0.0:*                               2125/ntpd

udp        0      0 127.0.0.1:123               0.0.0.0:*                               2125/ntpd

udp        0      0 0.0.0.0:123                 0.0.0.0:*                               2125/ntpd

udp        0      0 0.0.0.0:658                 0.0.0.0:*                               1755/rpcbind

udp        0      0 127.0.0.1:703               0.0.0.0:*                               1777/rpc.statd

udp        0      0 :::11211                    :::*                                    3429/memcached

udp        0      0 :::111                      :::*                                    1755/rpcbind

udp        0      0 fe80::20c:29ff:fe03:7488:123 :::*                                    2125/ntpd

udp        0      0 ::1:123                     :::*                                    2125/ntpd

udp        0      0 :::123                      :::*                                    2125/ntpd

udp        0      0 :::44178                    :::*                                    1777/rpc.statd

udp        0      0 :::658                      :::*                                    1755/rpcbind

[root@master ~]#


[root@master ~]# vim /etc/sysconfig/memcached    #提供这个配置文件

PORT="11211"

USER="nobody"

MAXCONN="1024"

CACHESIZE="128"

OPTIONS=""


#编辑脚本 source 进来这个配置文件/etc/sysconfig/memcached

[root@master ~]# vim /etc/rc.d/init.d/memcached

#!/bin/bash

#

# Init file for memcached

#

# chkconfig: - 86 14

# description: Distributed memory caching daemon

#

# processname: memcached

# config: /etc/sysconfig/memcached

. /etc/rc.d/init.d/functions

## Default variables

PORT="11211"

USER="nobody"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""


[ -f /etc/sysconfig/memcached ] && . /etc/sysconfig/memcached    #就增加这一行,引入配置文件


RETVAL=0

prog="/usr/local/memcached/bin/memcached"

desc="Distributed memory caching"

lockfile="/var/lock/subsys/memcached"

start() {

        echo -n $"Starting $desc (memcached): "

        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch $lockfile

        return $RETVAL

}

stop() {

        echo -n $"Shutting down $desc (memcached): "

        killproc $prog

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f $lockfile

        return $RETVAL

}

restart() {

        stop

        start

}

reload() {

        echo -n $"Reloading $desc ($prog): "

        killproc $prog -HUP

        RETVAL=$?

        echo

        return $RETVAL

}

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  condrestart)

        [ -e $lockfile ] && restart

        RETVAL=$?

        ;;

  reload)

        reload

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

   *)

        echo $"Usage: $0 {start|stop|restart|condrestart|status}"

        RETVAL=1

esac

exit $RETVAL



不忙重启

[root@master ~]# telnet localhost 11211

Trying ::1...

Connected to localhost.

Escape character is '^]'.

stats

STAT pid 3429

STAT uptime 1917

STAT time 1620354212

STAT version 1.4.5

STAT pointer_size 32

STAT rusage_user 0.021996

STAT rusage_system 0.051992

STAT curr_connections 10

STAT total_connections 11

STAT connection_structures 11

STAT cmd_get 0

STAT cmd_set 0

STAT cmd_flush 0

STAT get_hits 0

STAT get_misses 0

STAT delete_misses 0

STAT delete_hits 0

STAT incr_misses 0

STAT incr_hits 0

STAT decr_misses 0

STAT decr_hits 0

STAT cas_misses 0

STAT cas_hits 0

STAT cas_badval 0

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 7

STAT bytes_written 0

STAT limit_maxbytes 67108864    #64M

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT conn_yields 0

STAT bytes 0

STAT curr_items 0

STAT total_items 0

STAT evictions 0

STAT reclaimed 0

END

quit

Connection closed by foreign host.

[root@master ~]#

[root@master ~]# service memcached restart    #重启

Shutting down Distributed memory caching (memcached):

                                                           [确定]

Starting Distributed memory caching (memcached):           [确定]

[root@master ~]#

[root@master ~]# telnet localhost 11211

Trying ::1...

Connected to localhost.

Escape character is '^]'.

stats

STAT pid 3567

STAT uptime 22

STAT time 1620354291

STAT version 1.4.5

STAT pointer_size 32

STAT rusage_user 0.000000

STAT rusage_system 0.005999

STAT curr_connections 10

STAT total_connections 11

STAT connection_structures 11

STAT cmd_get 0

STAT cmd_set 0

STAT cmd_flush 0

STAT get_hits 0

STAT get_misses 0

STAT delete_misses 0

STAT delete_hits 0

STAT incr_misses 0

STAT incr_hits 0

STAT decr_misses 0

STAT decr_hits 0

STAT cas_misses 0

STAT cas_hits 0

STAT cas_badval 0

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 7

STAT bytes_written 0

STAT limit_maxbytes 134217728    #现在128M,说明配置生效了

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT conn_yields 0

STAT bytes 0

STAT curr_items 0

STAT total_items 0

STAT evictions 0

STAT reclaimed 0

END

quit

Connection closed by foreign host.

[root@master ~]#


三、安装Memcache的PHP扩展


①安装PHP的memcache扩展        #也可以安装memcached扩展


# tar xf memcache-2.2.5.tgz        

# cd memcache-2.2.5

/usr/local/php/bin/phpize    #安装xcache也是这样子的,它是一个php模块,也是一个额外扩展

# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache

# make && make install


上述安装完后会有类似以下的提示:


Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/


②编辑/usr/local/php/lib/php.ini,在“动态模块”相关的位置添加如下一行来载入memcache扩展:

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so



而后对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内容:

<?php

$mem = new Memcache;

$mem->connect("127.0.0.1", 11211)  or die("Could not connect");


$version = $mem->getVersion();

echo "Server's version: ".$version."<br/>\n";


$mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");

echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";


$get_result = $mem->get('testkey');

echo "$get_result is from memcached server.";         

?>



如果有输出“Hello World is from memcached.”等信息,则表明memcached已经能够正常工作。



四、使用libmemcached的客户端工具:


访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等。


1) 编译安装libmemcached


# tar xf libmemcached-1.0.2.tar.gz 

# cd libmemcached-1.0.2

# ./configure 

# make && make install

# ldconfig


2) 客户端工具

# memcat --servers=127.0.0.1:11211 mykey

# memping 

# memslap

# memstat



五、Nginx整合memcached:


server {

        listen       80;

        server_name  www.magedu.com;


        #charset koi8-r;


        #access_log  logs/host.access.log  main;


        location / {

                set $memcached_key $uri;

                memcached_pass     127.0.0.1:11211;

                default_type       text/html;

                error_page         404 @fallback;

        }


        location @fallback {

                proxy_pass http://172.16.0.1;

        }

}




[root@master ~]# vim /etc/nginx/nginx.conf    #使用php功能

..................................................................................................

location ~ \.php$ {

            root           /web/htdocs;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

            include        fastcgi_params;

        }


..................................................................................................

[root@master ~]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      3567/memcached

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1755/rpcbind

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2594/nginx

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2114/sshd

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1833/cupsd

tcp        0      0 0.0.0.0:57879               0.0.0.0:*                   LISTEN      1777/rpc.statd

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2451/master

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      2090/php-fpm    #9000端口监听状态

tcp        0      0 :::3306                     :::*                        LISTEN      2381/mysqld

tcp        0      0 :::11211                    :::*                        LISTEN      3567/memcached

tcp        0      0 :::111                      :::*                        LISTEN      1755/rpcbind

tcp        0      0 :::22                       :::*                        LISTEN      2114/sshd

tcp        0      0 ::1:631                     :::*                        LISTEN      1833/cupsd

tcp        0      0 ::1:25                      :::*                        LISTEN      2451/master

tcp        0      0 :::42150                    :::*                        LISTEN      1777/rpc.statd

[root@master ~]#

[root@master ~]# vim /etc/nginx/fastcgi_params        #参数也配置好了

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  QUERY_STRING       $query_string;

fastcgi_param  REQUEST_METHOD     $request_method;

fastcgi_param  CONTENT_TYPE       $content_type;

fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

fastcgi_param  REQUEST_URI        $request_uri;

fastcgi_param  DOCUMENT_URI       $document_uri;

fastcgi_param  DOCUMENT_ROOT      $document_root;

fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REMOTE_ADDR        $remote_addr;

fastcgi_param  REMOTE_PORT        $remote_port;

fastcgi_param  SERVER_ADDR        $server_addr;

fastcgi_param  SERVER_PORT        $server_port;

fastcgi_param  SERVER_NAME        $server_name;

[root@master ~]# service nginx reload    #重载nginx

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

重新载入 nginx:                                           [确定]

[root@master ~]#

[root@master ~]# vim /web/htdocs/index.php

<h1>Test Page </h1>

<?php

phpinfo();


?>


http://192.168.0.60/  好像不对

image.png



[root@master ~]# vim /etc/nginx/nginx.conf   #重新修改下

..................................................................................................

        location / {

#           proxy_pass http://192.168.0.61/;

#           if ($request_method = "PUT"){

#               proxy_pass http://192.168.0.62;

#           }

            root /web/htdocs;

            index index.php index.html;

        }

..................................................................................................

 location ~ \.php$ {

            index index.php index.html;

            root           /web/htdocs;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

            include        fastcgi_params;

        }

..................................................................................................


[root@master ~]# service nginx reload    #重载

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

重新载入 nginx:                                           [确定]

[root@master ~]#


http://192.168.0.60/ 

image.png


我们把php的memcache扩展 装好之后,把配置文件 放在 /etc/php.d 下面就行了,可能跟我们的文档略有不一样????


image.png



http://pecl.php.net/package/memcache

http://pecl.php.net/get/memcache-2.2.6.tgz

[root@master ~]# wget http://pecl.php.net/get/memcache-2.2.6.tgz

--2021-05-07 12:22:54--  http://pecl.php.net/get/memcache-2.2.6.tgz

正在解析主机 pecl.php.net... 104.236.228.160

正在连接 pecl.php.net|104.236.228.160|:80... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:35957 (35K) [application/octet-stream]

正在保存至: “memcache-2.2.6.tgz”


100%[======================================>] 35,957       157K/s   in 0.2s


2021-05-07 12:22:55 (157 KB/s) - 已保存 “memcache-2.2.6.tgz” [35957/35957])


[root@master ~]#

[root@master ~]# tar xf memcache-2.2.6.tgz

[root@master ~]#

[root@master ~]# cd memcache-2.2.6

[root@master memcache-2.2.6]# 

[root@master memcache-2.2.6]# /usr/local/php/bin/phpize

Configuring for:

PHP Api Version:         20100412

Zend Module Api No:      20100525

Zend Extension Api No:   220100525

[root@master memcache-2.2.6]#

[root@master memcache-2.2.6]# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache

image.png

[root@master memcache-2.2.6]# make && make install

image.png

/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ 这个路径很关键


[root@master memcache-2.2.6]# pwd

/root/memcache-2.2.6

[root@master memcache-2.2.6]#

[root@master memcache-2.2.6]# ls        #没看到样例配置文件

acinclude.m4    CREDITS                      memcache.php

aclocal.m4      example.php                  memcache_queue.c

autom4te.cache  include                      memcache_queue.h

build           install-sh                   memcache_queue.lo

config9.m4      libtool                      memcache_session.c

config.guess    ltmain.sh                    memcache_session.lo

config.h        Makefile                     memcache_standard_hash.c

config.h.in     Makefile.fragments           memcache_standard_hash.lo

config.log      Makefile.global              missing

config.m4       Makefile.objects             mkinstalldirs

config.nice     memcache.c                   modules

config.status   memcache_consistent_hash.c   php_memcache.h

config.sub      memcache_consistent_hash.lo  README

configure       memcache.dsp                 run-tests.php

configure.in    memcache.la

config.w32      memcache.lo

[root@master memcache-2.2.6]# 

[root@master memcache-2.2.6]# mkdir /etc/php.d

[root@master memcache-2.2.6]#

[root@master memcache-2.2.6]# vim /etc/php.d/memcache.ini        #新建配置文件

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache.so


[root@master memcache-2.2.6]# service php-fpm restart        #重启  php-fpm

Gracefully shutting down php-fpm . done

Starting php-fpm  done

[root@master memcache-2.2.6]#


http://192.168.0.60/         看到了memcache扩展,,看到了memcache的各个指令

image.png


[root@master memcache-2.2.6]# vim /web/htdocs/test.php

<?php

$mem = new Memcache;

$mem->connect("127.0.0.1", 11211)  or die("Could not connect");

$version = $mem->getVersion();

echo "Server's version: ".$version."<br/>\n";

$mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");

echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";

$get_result = $mem->get('testkey');

echo "$get_result is from memcached server.";

?>


http://192.168.0.60/test.php

image.png


[root@master memcache-2.2.6]# telnet localhost 11211

Trying ::1...

Connected to localhost.

Escape character is '^]'.

get testkey

VALUE testkey 0 11

Hello World        #取到值了

END

quit

Connection closed by foreign host.

[root@master memcache-2.2.6]#


php 要配置程序自身能够使用memcached,才行使用



四、使用libmemcached的客户端工具:


访问memcached的传统方法是使用基于perl语言开发的Cache::memcached模块,这个模块在大多数perl代码中都能良好的工作,但也有着众所周知的性能方面的问题。libMemcached则是基于C语言开发的开源的C/C++代码访问memcached的库文件,同时,它还提供了数个可以远程使用的memcached管理工具,如memcat, memping,memstat,memslap等。


1) 编译安装libmemcached


# tar xf libmemcached-1.0.2.tar.gz 

# cd libmemcached-1.0.2

# ./configure 

# make && make install

# ldconfig


2) 客户端工具        #一大堆命令,马哥不演示了  使用--help获取命令用法?

# memcat --servers=127.0.0.1:11211 mykey

# memping 

# memslap

# memstat



五、Nginx整合memcached:    #把nginx数据缓存到memcached


server {

        listen       80;

        server_name  www.magedu.com;


        #charset koi8-r;


        #access_log  logs/host.access.log  main;


        location / {

                set $memcached_key $uri;        #设置键

                memcached_pass     127.0.0.1:11211;    #memcache服务器

                default_type       text/html;    #默认只缓存html的

                error_page         404 @fallback;    #缓存中没有,返回404??????,调用fallback这样一个location,由fallback来处理

        }


        location @fallback {

                proxy_pass http://172.16.0.1;    #传递给后端服务器,取回来后保存在memcached服务器当中,第二次取的时候,就能直接从memcached服务器中取了,,,,,,,,,,,,nginx不使用自己的缓存了,nginx自己的缓存由于缓存在磁盘上的,所以它的性能不好,memcached可以提供更好的缓存机制,马哥不演示了

        }

}





如何将php的session会话信息保存在memcached当中?


前提:

1、配置各php支持使用memcache;

2、安装配置好memcached服务器,这里假设其地址为172.16.200.11,端口为11211;



一、配置php将会话保存至memcached中


编辑php.ini文件,确保如下两个参数的值分别如下所示:

session.save_handler = memcache    #其实默认是file??

session.save_path = "tcp://172.16.200.11:11211?persistent=1&weight=1&timeout=1&retry_interval=15"        #本机的话,就使用localhost,,,,,,,,persistent=1表示持久连接方式,,,,,,,,,weight=1表示权重,,,,,,,,,timeout=1超时时间为1秒,,,,,,,,retry_interval=15 每隔15秒重试一次?????


二、测试


新建php页面setsess.php,为客户端设置启用session:  #可以弄好几台lnmp,然后使用lvs,负载均衡用户请求到不同的lnmp上,然后不断的获取这个页面,会发现会话信息都是保存在memcached当中,而且会话是一样的

<?php

session_start();

if (!isset($_SESSION['www.MageEdu.com'])) {

  $_SESSION['www.MageEdu.com'] = time();

}

print $_SESSION['www.MageEdu.com'];

print "<br><br>";

print "Session ID: " . session_id();

?>


新建php页面showsess.php,获取当前用户的会话ID:

<?php

session_start();

$memcache_obj = new Memcache;

$memcache_obj->connect('172.16.200.11', 11211);

$mysess=session_id();

var_dump($memcache_obj->get($mysess));

$memcache_obj->close();

?>



<?php 

// Generating cookies must take place before any HTML. 

// Check for existing "SessionId" cookie 

$session = $HTTP_COOKIE_VARS["SessionId"]; 

if ( $session == "" ) { 

// Generate time-based unique id. 

// Use user's IP address to make more unique. 

$session = uniqid ( getenv ( "REMOTE_ADDR" ) ); 

// Send session id - expires when browser exits 

SetCookie ( "SessionId", $session ); 

?> 

<HTML> 

<HEAD><TITLE>Session Test</TITLE></HEAD> 

<BODY> <br> 16 Current session id: <?php echo $session ?> 

</BODY></HTML>




[root@master memcache-2.2.6]# vim /etc/php.ini

............................................................................................................................

;session.save_handler = files

session.save_handler = memcache

session.save_path = "tcp://192.168.0.60:11211?persistent=1&weight=1&timeout=1&retry_interval=15"        #memcache如果是公共服务器最好使用公共地址

............................................................................................................................

;session.save_path = "/tmp"

............................................................................................................................

session.name = PHPSESSID    #将来好多地方用到

............................................................................................................................


[root@master memcache-2.2.6]# service php-fpm restart

Gracefully shutting down php-fpm . done

Starting php-fpm  done

[root@master memcache-2.2.6]#


[root@master memcache-2.2.6]# vim /web/htdocs/setsess.php

<?php

session_start();

if (!isset($_SESSION['www.MageEdu.com'])) {

  $_SESSION['www.MageEdu.com'] = time();

}

print $_SESSION['www.MageEdu.com'];

print "<br><br>";

print "Session ID: " . session_id();

?>


[root@master memcache-2.2.6]# vim /web/htdocs/showsess.php

<?php

session_start();

$memcache_obj = new Memcache;

$memcache_obj->connect('192.168.0.60', 11211);

$mysess=session_id();

var_dump($memcache_obj->get($mysess));

$memcache_obj->close();

?>


http://192.168.0.60/setsess.php

image.png


http://192.168.0.60/showsess.php

image.png


memcached不支持像mysql一样,看表中所有的值(select * from 表),

memcached不允许一下子查看每一个键对应的值, 只能根据一个键看一个值



马哥不验证lvs中获取的session的值 是否一样的了


会话信息保存在memcached当中(事实是保存在内存当中)比默认保存在文件中速度更快,

memcached算法实现负载均衡,那是程序员的问题,看程序员开发的程序能不能实现负载均衡,

到底使用取余的算法,还是一致性hash的算法,是程序员的问题


马哥不装memcached admin (memadmin)了,他又忍不住装了一下



image.png


image.png



https://github.com/junstor/memadmin

[root@master memcache-2.2.6]# wget https://codeload.github.com/junstor/memadmin/zip/refs/heads/master

--2021-05-07 15:56:52--  https://codeload.github.com/junstor/memadmin/zip/refs/heads/master

正在解析主机 codeload.github.com... 13.229.189.0

正在连接 codeload.github.com|13.229.189.0|:443... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:未指定 [application/zip]

正在保存至: “master”


    [     <=>                               ] 261,092      299K/s   in 0.9s


2021-05-07 15:56:54 (299 KB/s) - “master” 已保存 [261092]


[root@master memcache-2.2.6]# 

[root@master memcache-2.2.6]# mv master memadmin-master.zip

[root@master memcache-2.2.6]# mv memadmin-master.zip ~/

[root@master memcache-2.2.6]# cd

[root@master ~]#

[root@master ~]# unzip memadmin-master.zip

image.png


[root@master ~]# mv memadmin-master /web/htdocs/mmaster

[root@master ~]#

[root@master ~]# cd /web/htdocs/mmaster

[root@master mmaster]# ls

apps        images   index.php  LICENSE.txt  views

config.php  include  langs      README.txt

[root@master mmaster]#

[root@master mmaster]# vim config.php

<?php

if (!defined('IN_MADM')) exit();


$config['user'] = "admin"; // your username        #用户名

$config['passwd'] = "admin"; // your password    #密码


............................................................................................................................



http://192.168.0.60/mmaster/

image.png


 持久化连接表示一直在线,否则每一个命令发过去都断开了

image.png

image.png


image.png


image.png


参数描述
pid3567memcache服务器进程ID
uptime20514服务器已运行秒数
time1620374783服务器当前Unix时间戳
version1.4.5memcache版本
pointer_size32操作系统指针大小
rusage_user0.328949进程累计用户时间
rusage_system0.420936进程累计系统时间
curr_connections16当前连接数量
total_connections22Memcached运行以来连接总数
connection_structures17Memcached分配的连接结构数量
cmd_get15get命令请求次数
cmd_set10set命令请求次数
cmd_flush0flush命令请求次数
get_hits13get命令命中次数
get_misses2get命令未命中次数
delete_misses0delete命令未命中次数
delete_hits0delete命令命中次数
incr_misses0incr命令未命中次数
incr_hits0incr命令命中次数
decr_misses0decr命令未命中次数
decr_hits0decr命令命中次数
cas_misses0cas命令未命中次数
cas_hits0cas命令命中次数
cas_badval0使用擦拭次数
auth_cmds0认证命令处理的次数
auth_errors0认证失败数目
bytes_read2206读取总字节数
bytes_written2847发送总字节数
limit_maxbytes134217728分配的内存总大小(字节)
accepting_conns1接受新的连接
listen_disabled_num0失效的监听数
threads4当前线程数
conn_yields0连接操作主动放弃数目
bytes494当前存储占用的字节数
curr_items2当前存储的数据总数
total_items10启动以来存储的数据总数
evictions0LRU释放的对象数目
reclaimed0已过期的数据条目来存储新数据的数目


上图 是 stats 命令的结果


image.png



image.png


image.png



image.png


image.png


image.png

image.png

计算机功能非常有用,微博浏览次数加1,,直接加1,比重新改缓存更有效吧,,,卖一个商品的话,库存减1,

image.png


清空缓存

image.png


允许我们数据遍历,只能指定哪个slab进行遍历,,只能遍历前多少条记录,不能遍历所有

image.png

image.png




下图可以看看哪个slab里面,  key 有哪些正则表达式,,好像比默认的memcached功能更强大,

是php程序自己提供的功能,由php程序帮我们批量获取key的,跟memcached自己没有关系,,memcached自己默认不支持遍历的

image.png


memadm支持添加多台memcached服务器,每台服务器可以单独进行管理

可以安装监控服务器来监控,,比如catin???????zelex??????











普通分类: