`
您已经登录
  • 浏览: 43033 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

memcached介绍

阅读更多

memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。它是基于libevent的事件处理;内置内存存储方式,如果系统重启内存内的信息会消失;内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存;每个memcache服务之间不能相互通信;memcache与客户端通过ASCII协议(文本)和二进制协议进行通信 。

 
memcached内存存储介绍:
item     存储在memcached中的一个数据单元,包含key,value,flag。
page    分配给slab的内存空间,对应实际的物理空间,默认大小为1M。
chunk  用于缓存记录的内存空间。
slab     相同特定大小的chunk组。
可以对上述概念这样理解slab = page*N;page = chunk*N = 1M


 

 

memcached中的数据存放:

1.memcached根据收到的数据item的大小,选择最适合数据大小的slab(刚好能放下这个itme的slab)。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。


 

 
 

2.如果这个item对应大小的slab未出现过,则申请1个page并将该item存入新申请的slab的chunk中(注意,这1M空间不论是否达到memcached使用内存都可以申请成功) 

3.如果item对应大小的slab出现过,则在该slab中优先选择expired(free_chunks)和delete(在1.2.2版本中delete的chunk存在着不能被重复利用的问题)的chunk进行存储,其次将选择未使用过的chunk(free_chunks_end)进行存储。 通过命令stats slabs可以查看free_chunks,free_chunks_end,used_chunks,chunk_size等信息。

4.如果item对应的slab出现过,但是对应的slab已经存储满了,那么会申请一个新的page加入原有的slab,这个page被分为对应大小的chunk,继续存储。

5.如果item对应的slab出现过,但是对应的slab已经存储满了并且memcache也达到了最大内存使用。将使用lru算法,清除item(可能将未过期的item清除)。 
 

 
memcached在Linux下的安装:
首先memcached依赖libevent的socket处理,所以必须安装libevent。通过下载libevent的tar包解压后编译安装。也可以通过yum安装,
但这里必须yum安装libevent和libevent-dev。
然后 下载最新的memcache:http://memcached.org/,解压tar包并进入memcache目录通过./configure编译后make并make install安装。  
在安装完后详细信息中会告诉你安装的具体目录,也可以通过ls -a /usr/local/bin /usr/bin/ | grep memcached来查看是否被安装。默认安装在/usr/local/bin下。
 
memcached是其启动的命令,有以下几个参数:
参数
含义
-m <num>
使用多大的RAM来进行存储,单位是MB。这数字并不是严格意义上的最大值,memcached可能会在此之上增加一些内存使用。默认64m
-d
加上此参数表示以守护线程启动(daemon)
-v / -vv / -vvv
打印相信的日志信息,多个v就更详细
-p <num>
对应打开的端口,默认端口11211
-u <username>
用户名
-h
查看帮助信息
-U
UDP的监听端口,默认为11211,0表示关闭
-P <file> 帮pid保存到指定的file文件中
-l <addr>
绑定的ip地址(默认所以都可以),可以在这里指定端口ip:port
-c <num>
同一时间最大的连接数(默认1024)
-A 
客户端可以使用“shutdown”命令关闭memcached服务
-i
打印memcached和libevent的license
-C
关闭cas客户端命令
-F
关闭flush_all客户端命令
-f
指定Growth Factor,指定slab之间的差异度
-M
当内存耗尽时返回ERROR,相当于禁用了LRU算法。

客户端可以通过telnet直接连接memcache服务:此时通过文本指令协议操作
通过简单的客户端命令可以进行数据操作等动作,命令的格式为 
command_name  key  [flags]  [exptime]  [bytes]  [cas唯一标识]
[data_block]
command_name  表示命令名如:get,set等
key                      表示设置的关键字,最大支持250个字符
flags                    客户机使用它存储关于键值对的额外信息,存储命令时使用
exptime               在服务器上存储的时间,0为无限期,单位秒,存储命令时使用
bytes                   存取的字数,存储命令时使用
cas唯一标识         通过gets命令获取,在cas命令时用来保证操作的原子性
data_block           根据bytes指定的字数存入相应的信息,存储命令时使用
 
一,存储命令
命令
含义
set
设置值,如果key存在,更新对应值。如:
set  wj  0  0  4
1234
STORED
add
添加值,只有key不存在时才成功。如:
add  jw  0  0  4
1234
STORED
replace
替换值,只有key存在时才成功。如:
replace  wj  0  0  4
4321
STORED
 
replace  tt  0  0  4
1234
NOT_STORED
append
在已有的数据后添加。如:
append  wj  0  0  3
AAA
STORED
prepend
在已有的数据前添加。
cas
check/compare  and  set,通过gets命令可以获得对应item的唯一标识,然后通过cas加上这个标识来保证在多并发下操作的原子性,不被其他线程干扰。如:
gets wj
VALUE  wj  0  3  7                        (7就是给定的唯一标识)
END
cas  wj  0  0  4  7                          (在cas命令最后加上这个唯一标识)
1234
STORED
二, 索引命令
命令
含义
get
获得对应key的值,可以同时get多个key,如:
get  uname  username
VALUE  uname  0  1
Y
VALUE  username  0  2
XY
END
gets
相比get会多出一个唯一标识,如:
gets uname
VALUE  uname  0  1  7
Y
END
delete
删除一个item,如果指定的key存在的话
incr/decr
最item的value是数字的进行加/减运算,如:
incr  a  2        (a本来是12)
14
三,统计命令
命令
含义
stats
显示当前的一些统计数据:
pid                       进程号
uptime                服务器运行时间
time                     服务器当前的时间戳
version                版本
libevent               libevent的版本
pointer_size        操作系统字体大小
rusage_user        进程累计用户时间
rusage_user        进程累计系统时间
curr_connections    系统当前打开的连接数
total_connections   系统曾经打开的连接数
connection_structures  服务器分配的连接构造数
cmd_get        get命令(获取)总请求次数
cmd_set         set命令(保存)总请求次数
get_hits          get的总命中次数
get_misses     get的未命中次数
evictions         为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
bytes_read            总读取字节数(请求字节数)
bytes_written        总发送字节数(结果字节数)
limit_maxbytes     分配给memcache的内存大小(字节)
threads                 当前线程数
bytes                    一个item存储的字节数
curr_items            当前的item数
total_items             item总数 
accepting_conns   目前接受的链接数
等等......
stats items
查看memcache中的items的一些信息,如:
STAT items:1:number 3                                      item的个数
STAT items:1:age 20867                                     最久的item存储时间
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:1:reclaimed 0 
STAT items:1:expired_unfetched 0 
STAT items:1:evicted_unfetched 0
END
stats slabs
查看memcache中的slabs的一些信息,如,STAT之后的数字是slab class对应的标识
STAT 1:chunk_size 96                          slab中含chunk的大小
STAT 1:chunks_per_page 10922          每个page中含有的chunk的个数
STAT 1:total_pages 1                            96字节的slab分配了几个page空间
STAT 1:total_chunks 10922                  此slab包含的chunk个数
STAT 1:used_chunks 2                          被使用的chunk个数
STAT 1:free_chunks 10920                    到期回收的空间
STAT 1:free_chunks_end 0                    完全未分配的空间
STAT 1:mem_requested 140
STAT 1:get_hits 0
STAT 1:cmd_set 2
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 1:touch_hits 0
STAT 4:chunk_size 192                          这是另外一个192字节的slab
STAT 4:chunks_per_page 5461
STAT 4:total_pages 1
STAT 4:total_chunks 5461
STAT 4:used_chunks 1
STAT 4:free_chunks 5460
STAT 4:free_chunks_end 0
STAT 4:mem_requested 168
STAT 4:get_hits 0
STAT 4:cmd_set 1
STAT 4:delete_hits 0
STAT 4:incr_hits 0
STAT 4:decr_hits 0
STAT 4:cas_hits 0
STAT 4:cas_badval 0
STAT 4:touch_hits 0
STAT active_slabs 2
STAT total_malloced 2097024
END
stats sizes
对每个slab的简单描述,如:
STAT 96 2
STAT 192 1
END
有两个slab,分别为96字节slab和192字节slab,其中96字节包含2个数据,192字节包含1个数据。
stats settings 
查看当前运行实例的参数设置,如:
STAT maxbytes 67108864
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT inter NULL
STAT verbosity 0
STAT oldest 2828
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT growth_factor 1.25
STAT chunk_size 48
STAT num_threads 4
STAT num_threads_per_udp 4
STAT stat_key_prefix :
STAT detail_enabled no
STAT reqs_per_event 20
STAT cas_enabled yes
STAT tcp_backlog 1024
STAT binding_protocol auto-n
STAT auth_enabled_sasl no
STAT item_size_max 1048576
STAT maxconns_fast no
STAT hashpower_init 0
STAT slab_reassign no
STAT slab_automove 0
STAT tail_repair_time 3600
STAT flush_enabled yes
END

stats cachedump slab_id limit_num

根据对应的slab_id给出limit_num个被存储的数据,符合后进先出原则。如:
stats cachedump 1 2 
ITEM d [3 b; 1394602414 s] 
ITEM b [4 b; 1394602414 s] 
END
fulsh_all (num)
在指定的num秒后清除已经存在的item,不加num是马上清楚已经存在的item。
shutdown
关闭服务器,需要启动memcached时加上-A参数才能有效
四,二进制协议
出来上述文本协议外,memcached1.4开始支持二进制协议,具体协议内容如下:
 

客户端API介绍:
XMemcached,基于nio的java客户端实现。支持所有的memcached协议指令,包括memcached1.4新增的二进制协议。是一个中国人设计开发的。

import java.io.IOException;
import java.util.concurrent.TimeoutException;
import net.rubyeye.xmemcached.CASOperation;
import net.rubyeye.xmemcached.GetsResponse;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.utils.AddrUtil;
 
public class XmemcachedDemo {
 
 public static void main(String[] args) throws IOException {
  MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("192.168.18.184:11211"));
  MemcachedClient client = null;
  try {
   client = builder.build();
   client.add("a", 0, "123"); //如果key存在,不覆盖原来的值,
                          //第二个参数是过期时间,0表示不过期,第三参数是任意序列号的java对象
   client.set("b", 0, "456"); //如果key存在,覆盖
   
   String a = client.get("a", 2000); //设置超时时间为2000毫秒,默认1秒
   System.out.println(a);
   
   GetsResponse<Long> response = client.gets("b");
   long cas = response.getCas(); //与cas命令相似,取得唯一标识cas以保持原子性,类似乐观锁
   
   if(!client.cas("b", 0, "789", cas)){ //对b设置新的值,判断cas值是否相等,如果不等就不能进行更新
    System.out.println("FAIL-STORE");
   }else{
    String b = client.get("b");
    System.out.println(b);
   }
   //不需要使用gets方法就直接调用cas,getMaxTries方法返回重写尝试的次数,getNewValue返回最新的值
   Boolean bool = client.cas( "b" , 0, new CASOperation<String>() {
               public int getMaxTries() {
                   return 1;
               }
               public String getNewValue( long currentCAS, String currentValue) {
                System.out.println("current value:" + currentValue);
                   return "000";
               }
            });
   System.out.println(bool);
   String b = String.valueOf(client.get("b"));
   System.out.println(b);
   
   client.deleteWithNoReply("a"); //删除a,并告诉服务器不需要应答,效率高,适合批量删除
   
   System.out.println(1== client.incr( "c" , 5, 1)); //当c存在时+5(第二参数),不存在时c=1(第三参数不填默认为0)
   System.out.println(3== client.incr( "c" , 2));
   System.out.println(client.get("c"));
  } catch (IOException e) {
   e.printStackTrace();
  } catch (TimeoutException e) { //超过设置的超时时间,就出现此异常
   e.printStackTrace();
  } catch (InterruptedException e) {//连接断开就出现此异常
   e.printStackTrace();
  } catch (MemcachedException e) {//memcached内部出现的异常
   e.printStackTrace();
  }finally {
   client.shutdown(); //关闭此时与memcached服务器的连接
  }
 
 }
}
 
memcached的分布式是通过客户端来实现的,xmemcached默认提供的分布策略是按照key的哈希值模以连接数得到的余数,对应的连接就是将要存储的节点。使用默认的分布策略无需任何设置和编码。还可以对分布式处理时设置权重。
xmemcached同样提供了一致性hash(consistent hash): 
//int数组设置各个server对应的权重
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
                                        AddrUtil.getAddresses("server1:11211 server2:11211 server3:11211"), new int[]{1,2});
//设置客户端分布策略是一致性hash
builder.setSessionLocator(new KetamaMemcachedSessionLocator());
//添加下面这行,采用BinaryCommandFactory即可使用二进制协议 
builder.setCommandFactory(new BinaryCommandFactory());
//设置连接池个数,默认为1
builder.setConnectionPoolSize(2);
 
另外一个用的比较多的memcached客户端是spymemcached。还有官方的memcached client for java应用也比较早比较稳定。
 
  • 大小: 23.4 KB
  • 大小: 11 KB
  • 大小: 49 KB
分享到:
评论

相关推荐

    Memcached 介绍文档

    详细介绍了Memcached的使用,原理及出处

    Memcached 原理和使用详解

    详细介绍了分布式缓存系统memcached的原理和详细使用方法。主要包括1、Memcached介绍;2、Memcached安装3、使用一些技巧等内容

    MemCached Cache Java Client封装优化历程

    Memcached 介绍 Memcached是一种集中式Cache,支持分布式横向扩展。这里需要有点说明,很多开发者觉得Memcached是一种分布式Cache,但是其实Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的...

    memcached权威指南

    第一章:memcached 介绍....................................................................................................................1 1.1 memcached 是什么?...........................................

    memcached高性能内存k-v缓存服务器

    memcached介绍 memcached安装 memcached操作 内存存储机制 数据过期与删除机制 php操作memcached 多服务器集群算法 缓存无底洞效应 缓存雪崩 老数据被踢现象 结课作业

    Memcached原理和使用详解

    Memcached介绍 Memcached安装和使用 一些技巧 C++\PH一些例子

    Memcached安装和配置

    详细介绍安装Memcached及Memcached配置

    memcached1

    先简单的介绍下什么是memcached。 Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每...

    PHP内存缓存技术memcached 的安装和工作原理介绍

    PHP内存缓存技术memcached 的安装和工作原理介绍

    memcached软件windows版本,具体看介绍

    将这个压缩包解压,就出来一个“鹿头”的memcached.exe文件,没错!就是它了。运行它,会出现一个窗口,这个窗口一直打开着就说明memcached的服务端就一直运行着,那么它就能接收客户端的请求

    memcached的介绍和使用.docx

    memcached的介绍和使用.docx

    Memcache入门到精通[张振华.Jack]

    Memcached介绍、应用场景、运行机制 Memcached安装 Memcached启动,参数 Memcached连接、监控 Memcached客户端命令 Memcached的Java客户端实例 Memcached的客户端分布式原理 Memcached的服务器端运行原理 Memcached...

    memcached管理session资源

    MSM--Memcached_Session_Manager介绍及使用,所使用的jar包以及tomcat中的context.xml的配置

    memcached144And145

    因此我们以下介绍两个不同版本 1.4.4 及 1.4.5的不同安装方法: memcached 版本安装 1、解压下载的安装包到指定目录。 2、在 1.4.5 版本以前 memcached 可以作为一个服务安装,使用管理员权限运行以下命令: c:\...

    memcached_exporter-0.6.0.linux-amd64.tar.gz

    在使用 Memcached 过程中需要对 Memcached 运行状态进行监控,以便了解 Memcached 服务是否运行正常,排查 Memcached 故障等。 Prometheus 监控服务提供基于 ...本文为您介绍如何使用 Prometheus 监控服务 Memcached。

    Linux下安装memcached详细步骤

    介绍Linux下memcached详细安装步骤,自己的实际安装经验。

    Java环境下Memcached应用详解.docx

    这里将介绍Java环境下Memcached应用,Memcached主要是集群环境下的缓存解决方案,希望本文对大家有所帮助。 本文将对在Java环境下Memcached应用进行详细介绍。Memcached主要是集群环境下的缓存解决方案,可以运行在...

    memcached部署

    memcached部署,详细介绍了memcached缓存的使用,为以后的云负载均衡做一个基础。

    tomcat8+memcached共享session(套装)

    悉心整理,亲测。请放心使用。 tomcat8+memcached共享session(套装) memcached较全面介绍.docx Nginx+Tomcat+Memcached部署.docx

Global site tag (gtag.js) - Google Analytics