1.Linux 链接单个memcached 服务
安装略
启动memcached 命令:
memcached -d -m 1000 -u root -l 192.168.0.122 -p 11200 -c 256 -P /tmp/memcached.pid
-d 选项是启动一个守护进程,
-m 是分配给Memcache使用的内存数量,单位是MB,这里是1000MB
-u 是运行Memcache的用户,这里是root
-l 是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址192.168.0.122
-p 是设置Memcache监听的端口,这里设置了12000,最好是1024以上的端口
-c 选项是最大运行的并发连接数,默认是1024,这里设置了256,按照你服务器的负载量来设定
-P 是设置保存Memcache的pid文件
kill `cat /tmp/memcached.pid`
Telnet 链接memcached
telnet 192.168.0.122 11200
2.查看memcached 基本命令
limit_maxbytes、bytes
memcached在存储的时候是可以设置失效时间的,但如果存储已经满了,那旧数据即使没有到过期时间,也会被移除。所以需要观察memcached存储是否已经满了,同时这对扩容也是有意义的参考。limit_maxbytes即总的存储大小,而bytes就是已经使用的大小,从这两个数据就可以看出在memcached启动时,我们为它分配的内存是否足够使用
cmd_get、cmd_set
memcached启动后,我们对它一共做了多少次读取操作呢?从这两个参数可以观察出来
get_hits、get_misses
使用memcached后,我们需要评估我们使用的策略是否合理。不能够使用中间缓存后,后端的数据库还是有较大的访问量,这样的话中间缓存就变得没有意义了。get_hits表示命中了多少次读取,即来memcached取到了多少有效数据;get_misses表示没有命中的次数,即此次来取数据的时候,memcached并没有你所查询的数据。如果没有清零统计数据的话,cmd_get = get_hits + get_misses
stats
STAT pid 1611 进程id
STAT uptime 83639 服务运行秒数
STAT time 1496418658 当前系统时间
STAT version 1.4.4 服务版本
STAT pointer_size 64 操作系统位大小
STAT rusage_user 473.557008 进程累计用户时间
STAT rusage_system 168.555375 进程累计系统时间
STAT curr_connections 43 当前打开连接数
STAT total_connections 662 曾打开连接数
STAT connection_structures 49 服务器分配的连接结构数
STAT cmd_get 12703916 执行get命令总数
STAT cmd_set 661694 执行set命令总数
STAT cmd_flush 0 指向flush_all命令总数
STAT get_hits 4030288 get命中次数
STAT get_misses 8673628 get未命中次数
STAT delete_misses 0 delete未命中次数
STAT delete_hits 0 delete命中次数
STAT incr_misses 0 incr未命中次数
STAT incr_hits 0 incr命中次数
STAT decr_misses 0 decr未命中次数
STAT decr_hits 0 decr命中次数
STAT cas_misses 0 cas未命中次数
STAT cas_hits 0 cas命中次数
STAT cas_badval 0 使用擦拭次数
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 255478175 读取字节总数
STAT bytes_written 23294688078 写入字节总数
STAT limit_maxbytes 5242880000 分配的内存数(字节)
STAT accepting_conns 1 目前接受的链接数
STAT listen_disabled_num 0
STAT threads 4 线程数
STAT conn_yields 0
STAT bytes 39882766 存储item字节数
STAT curr_items 466015 item个数
STAT total_items 661694 item总数
STAT evictions 0 为获取空间删除item的总数
END
stats slabs
显示各个slab的信息,包括chunk的大小、数目、使用情况等
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 43
STAT 1:total_chunks 469646
STAT 1:used_chunks 466013
STAT 1:free_chunks 1
STAT 1:free_chunks_end 3632
STAT 1:mem_requested 39881531
STAT 1:get_hits 4045670
STAT 1:cmd_set 661773
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 8:chunk_size 480
STAT 8:chunks_per_page 2184
STAT 8:total_pages 1
STAT 8:total_chunks 2184
STAT 8:used_chunks 1
STAT 8:free_chunks 0
STAT 8:free_chunks_end 2183
STAT 8:mem_requested 414
STAT 8:get_hits 599
STAT 8:cmd_set 1
STAT 8:delete_hits 0
STAT 8:incr_hits 0
STAT 8:decr_hits 0
STAT 8:cas_hits 0
STAT 8:cas_badval 0
STAT 11:chunk_size 944
STAT 11:chunks_per_page 1110
STAT 11:total_pages 1
STAT 11:total_chunks 1110
STAT 11:used_chunks 1
STAT 11:free_chunks 1
STAT 11:free_chunks_end 1108
STAT 11:mem_requested 821
STAT 11:get_hits 601
STAT 11:cmd_set 2
STAT 11:delete_hits 0
STAT 11:incr_hits 0
STAT 11:decr_hits 0
STAT 11:cas_hits 0
STAT 11:cas_badval 0
STAT active_slabs 3
STAT total_malloced 47182176
END
stats items
显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)
STAT items:1:number 466013
STAT items:1:age 58
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:8:number 1
STAT items:8:age 84055
STAT items:8:evicted 0
STAT items:8:evicted_nonzero 0
STAT items:8:evicted_time 0
STAT items:8:outofmemory 0
STAT items:8:tailrepairs 0
STAT items:11:number 1
STAT items:11:age 84055
STAT items:11:evicted 0
STAT items:11:evicted_nonzero 0
STAT items:11:evicted_time 0
STAT items:11:outofmemory 0
STAT items:11:tailrepairs 0
END
stats cachedump slab_id limit_num
显示某个slab中的前limit_num个key列表,显示格式如下
3.memcached 认识
memcache 是一个免费、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。它是一个存储键值对的hashmap,在内存中对任意的数据使用key-value存储。
memcached采用一种集中式的缓存集群管理,也被称作互不通信的分布式架构,缓存与应用分离部署,缓存系统部署在一组专门的服务器上,应用程序通过一致性hash等路由算法选择缓存服务器远程访问缓存数据,缓存服务器之间不通信,缓存集群的规模可以很容易地实现扩容,具有良好的可伸缩性。
远程通信设计需要考虑两个要素1,通信协议 tcp udp http 2,通信序列化协议,数据传输的两端,必须使用彼此可识别的数据序列化方式
memcached 使用tcp 协议通信,序列化协议则是一套基于文本的自定协议。
所谓分布式 完全通过客户端程序的实现 路由算法
memcached访问模型(借鉴:http://www.importnew.com/22771.html,感谢)
memcached 写缓存过程
1,应用程序输入需要写缓存的数据
2,Api 将key 输入路由算法模块,路由算法根据key和memcached 集群服务器列表得到一台服务器编号
3,由服务器编号得到memcached 及其IP地址和端口号
4,API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作。
这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0和Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大
实现原理
首先认识 数据存放在内存中,因为访问数据比关系型数据库要快,关系型数据库可以数据持久性,IO操作速度慢,数据放内存只要机器重启数据就没了,而且还会手及其位数的限制 32位最多只能2G 64位无上限。
memcached 高效内存管理,采用内存分配方式是国定空间分配
涉及到slab_class slab page chunk
1.1、memcached 将内存空间氛围一组slab
通过 stats slabs 查看
1.2、每个slab下又有若干个page page默认1M
1.3、每个page里面包含一组chunk chunk是真正存数据的地方,同一个slab下chunk大小固定
1.4、有相同大小chunk的slab 组成一起称作slab_class
一个数据放在那里通过这个数据的value决定,当放slab时,首先slab要申请内存,申请内存以page为单位,page按chunk的大小进行切分,变成chunk数组,最后从数组中选择一个用于存储。
如果这个slab中没有chunk可以分配了怎么办,如果MemCache启动没有追加-M(禁止LRU,这种情况下内存不够会报Out Of Memory错误),那么MemCache会把这个slab中最近最少使用的chunk中的数据清理掉,然后放上最新的数据。
几点说明:
1、MemCache的内存分配chunk里面会有内存浪费,88字节的value分配在128字节(紧接着大的用)的chunk中,就损失了30字节,但是这也避免了管理内存碎片的问题
2、MemCache的LRU算法不是针对全局的,是针对slab的
3、应该可以理解为什么MemCache存放的value大小是限制的,因为一个新数据过来,slab会先以page为单位申请一块内存,申请的内存最多就只有1M,所以value大小自然不能大于1M了
再总结MemCache的特性和限制
上面已经对于MemCache做了一个比较详细的解读,这里再次总结MemCache的限制和特性:
1、MemCache中可以保存的item数据量是没有限制的,只要内存足够
2、MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制
3、Key最大为250个字节,超过该长度无法存储
4、单个item最大数据是1MB,超过1MB的数据不予存储
5、MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效
6、不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作
7、MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序
8、MemCache设置添加某一个Key值的时候,传入expiry为0表示这个Key值永久有效,这个Key值也会在30天之后失效
4.memcached 与 缓存
后续再补充
5.memcached命令端 使用
set 添加一个新的条目到memcached,或是用新的数据替换掉已存在的条目
eg:
set search000 0 20 6
111111
key → search000
flag → 0 (可以将此标志用做特殊用途,此标志对服务器来说是不透明的)
exptime → 20 (以秒为单位)
bytes → 6 (数据存储的字节数)
value → 111111
add 仅当key不存在的情况下存储数据。如果一个key已经存在,将得到NOT_STORED的响应
get 从memcached中返回数据。从缓存中返回数据时,将在第一行得到key的名字,flag的值和返回的value的长度。真正的数据在第二行,最后返回END。如果key并不存在,那么在第一行就直接返回END
get search3Q028360
VALUE search3Q028360 32 6
107000
END
replace 仅当key已经存在的情况下存储数据。如果一个key不存在,将得到NOT_STORED的响应