11211端口
memcache:简单来说就是一个键值存储的服务器,能够存储众多的键值对
根据键名来查找内容,所以键名不能相同。(URL作为键,页面内容作为值)
tcp是长连接,每次从缓存中获取数据都需要三次握手,很浪费时间,所以也支持UDP,但是无论是TCP还是UDP都要通过IP报文发送,所以Mencache服务端一定会监听在某个套接字上。
http使用文本类型传输数据,FTP使用文本类型或者二进制类型传输数据
memcache早期使用文本类型传输数据,但是现在两种都支持。
XML:集群的大多数配置文件格式,任何一个协议如果支持xml来传输数据的话,那么客户端和服务器端都要有一个XML引擎。就是服务器复杂起来,但是MEMcache存在就是为了高性能,所以越简单越好,所以不会使用xml来传输数据。
memcached:是一个缓存服务器,但本身无法决定缓存任何数据。一般依赖客户端,一半依赖与服务器端,存储是由服务端存储的,而至于怎么存储,存储谁是由客户端决定的。所以一个应用程序在开发的时候,压根就不会用memcached,那么它能不能往memcached中缓存数据???不能,因为能否缓存数据取决于应用程序自身。
服务端只负责存储,提供检索能力,提供了怎么去检索,但是至于怎么存,存多长时间,什么时候过期,memcached服务不管,客户端在设定一个缓存的时候,客户端提供它的键是什么,还有缓存时长,还有标志位,还有值。
memcached服务是基于lazy模型的:只要当前系统上只要有足够的空间可以用,就不会清理**(无论过没过期)但是数据失效了,也就是查不出来了,但是数据并没有被清理**,以及基于LRU算法**(最近最少使用)**的清理机制。
memcached仅仅是一个不通信分布式内存缓存服务器,并不保证数据的持久存储,假设memcached服务器坏了,只影响业务(速度)之外,是不影响数据本身的。
memcached尽可能使用内存来缓存数据,所以是一个内存缓存服务器。memcache存储数据的基本上限和下限,最小48Byte、最大1M,但是数据大小可能不同,memcached怎么在内存中管理这些数据呢?
在Linux内核当中,使用了两种方式来管理内存的碎片机制的:
1、budd system:伙伴系统(避免内存外碎片(页面之间的碎片))
一个进程需要四个页面(一个页面默认是4K),另外一个进程需要8个页面,4个页面的执行完了,但是另一个进程需要10个页面,就没有多余的页面给分配,就有4个页面的页面碎片。budd system就可以相邻的页面碎片连在一块。
2、slab allocator:slab分配器(避免内存内碎片)
但是有些文件(比如文件的Innod需要大概128个字节)用不了一个页面,那怎么般?那就事先把4K的页面实现划分成N个128字节的块,需要了直接拿来存储,用完了就放在那空着。不同数据结构的数据需要划分不同的页面来进行存储。
**现在的memcached支持使用增长因子来定义增长的幅度,每一类页面我们成为slab class,每一类页面中的块成为slab chunk。**一旦存满了,就该清理了,首先清理过期的,然后在使用LRU算法进行清理。
memcached怎么存储和查找数据:
1、首先使用除法,用键除以服务器总数,就是存取该数据的服务器号(从0开始),弊端太大。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0oZf3Hc-1580300222246)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20191101200147611.png)]
2、一致性哈希算法:
找一个环,上面有N个点位,彼此之间挨着,但是是离散的(10324)范围是从0~232,你有几个服务器,就对应的放在换上的某个点上,缓存数据的时候,使用它的键除以232取余,分散在环上的任意一个点上,按照顺时针存储在最近的服务器。万一一个服务器挂了,只影响一点点范围的数据。
memcache的工作:
1、要在内存中缓存
2、内存要使用slab alloactor将一个页面分配成许多不同的块(slab chunk),每个chunk是用来存储一类数据的。
memcache只适合存储键值数据,而且只是个缓存,不是存储,她是一个cache,不是一个store,Mysql是store,
使用memcache的一些企业:LiveJournal(他自己工作的公司),Wikipedia(全球最大的维基站点),Twitter(推特)Youtube,Mixi(日本最大的社交站点)。
memcached本身是事件驱动的,在客户端连接的时候,也使用事件驱动(event-driven),而他利用的是libevent的库,libevent能够提供event-driven相关功能的库叫做libevent库。
所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然是事件。
make && makeinstall
rpm -q libevent
tar …gz
cd memcached-
./configure --prefix=安装位置 --enable=sasl(借助于sasl进行认证,事先要确保sasl的开发库要装上(sasl-devel)) --with-libevent=
提供服务脚本:
vim /etc/rc.d/init.d/memcached
memcached:
-p:tcp端口,默认为11211
-U:UDP端口,默认为11211,0为不监听UDP端口
-u:以那个用户的身份运行
-m #:以MB为单位,指定memcache可用的最大内存空间。
-l (ip_addr):指定进程监听的IP地址
-d:以服务模式运行
-c:支持最大的并发连接数,默认为1024
-f #:设定slab Allocator定义预先设定分配内存空间大小固定的块时使用的增长因子。
-n:指定最小的slab chunk大小:单位是字节
-S:启用sasl进行用户认证
然后使用-d放在后台运行
使用telnet localhost 11211进行连接memcached
使用add添加键值,使用get获取键值。
使用客户端来将数据缓存至memcached:
perl:调用cache::memcached模块
PHP:有两个可扩展库:memcache、memcached(一般用这个)
C/C++:调用libmemecached模块(可以提供类似于mysqladmin的客户端工具)
使用客户端来将数据缓存至memcached:
perl:调用cache::memcached模块
PHP:有两个可扩展库:memcache、memcached(一般用这个)
C/C++:调用libmemecached模块(可以提供类似于mysqladmin的客户端工具)
memadmin:图形化方式来管理