认识 memcached

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的响应




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值