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应用也比较早比较稳定。
相关推荐
1. **memcached介绍**:解释memcached的作用,它是如何通过将数据存储在内存中来减少数据库的读取压力,从而提高Web应用的响应速度。 2. **安装memcached**: - **系统要求**:说明支持的操作系统(如Linux、...
**Memcached介绍** Memcached是一种高性能、分布式的内存对象缓存系统,用于在数据库和应用程序之间缓存数据,以减少对数据库的访问压力,提高应用的响应速度。它最初由Danga Interactive公司开发,现在已经成为...
1. **memcached介绍**:memcached是一种高性能的分布式内存缓存系统,最初设计用于加速动态Web应用程序,通过存储经常访问的数据到内存中,减少对数据库的依赖,提高响应速度。 2. **ASP.NET 4.0**:这是微软的.NET...
memcached介绍** `memcached`最初由Danga Interactive公司开发,现在已经成为开源社区的一个重要项目。它的设计目标是简化存储和检索数据的过程,通过将数据存储在内存中,避免了磁盘I/O操作,从而实现了快速响应...
**Memcached介绍** Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库负载,提高网站性能。该系统通过在内存中存储数据,实现快速访问,尤其适用于处理高并发场景下的数据...
1. **Memcached介绍**:Memcached是一种分布式内存缓存系统,用于临时存储Web应用中的数据,减少对数据库的访问,提高系统的整体性能。 2. **Windows编译**:由于memcached原生支持Unix/Linux环境,因此在Windows上...
一、Memcached介绍 Memcached是一款分布式内存对象缓存系统,广泛应用于高性能网站和应用中。它设计的目标是简化并加速动态Web应用程序的数据存储,通过将数据存储在内存中,避免频繁读取或写入数据库,从而提高...
【Memcached介绍】 Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。通过在内存中存储常用数据,Memcached能够快速响应客户端请求,避免了频繁...
1. **memcached介绍**:memcached是一个开源的、基于内存的分布式缓存系统,设计用于提高网站数据访问速度。它通过缓存经常访问的数据来减少对数据库的读取,从而提高了系统的整体性能。 2. **Java客户端**:Java...
1. **Memcached介绍**: Memcached是一款高性能、分布式的内存对象缓存系统,用于在动态系统中减少数据库负载,提升数据读取速度。它通过存储临时数据在内存中,避免了频繁访问数据库,提高了应用程序的响应速度。 ...
二、Memcached介绍与使用 Memcached是一个分布式内存对象缓存系统,用于减少数据库负载,提升Web应用性能。在Java应用中,我们通常使用Spymemcached库来操作Memcached。首先,将Spymemcached的jar包添加到Tomcat的`...
**Memcached介绍** Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库负载,提高数据访问速度。通过在内存中存储经常访问的数据,Memcached能够快速响应请求,减少对数据库...
**memcached介绍** Memcached是一种高性能的分布式内存对象缓存系统,用于减少数据库负载,提高Web应用性能。它通过在内存中存储数据来加快数据访问速度,适用于需要频繁读取但不经常修改的数据。 **在ASP.NET中的...
### Memcached介绍 Memcached是一款高性能的分布式内存对象缓存系统,它通过缓存数据和对象来减少数据库访问次数,从而提升动态Web应用的响应速度。Memcached的键/值存储方式使得其可以用来缓存各种数据,如数据库...
Memcached是一种高性能、分布式内存对象缓存系统,其设计初衷是为了加速动态Web应用程序,通过减轻数据库负载来提高网站性能。Memcached在多个大型互联网公司如Facebook、Yahoo、Amazon、LiveJournal和Mixi等中得到...
Memcached 介绍 Memcached 是一个高性能的缓存系统,通过减少数据库的查询次数和降低系统的负载来提高网站的性能。Memcached 可以与多种编程语言集成,包括 Java、PHP、Python 等。 Memcached Java 客户端 ...
**memcached介绍** Memcached是一种高性能的分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升应用性能。它通过将数据存储在内存中,使得数据访问速度大大提高,尤其适用于读取密集型的应用场景。...
1. **Memcached介绍**:Memcached是为了解决动态Web应用的数据库查询压力而设计的,它将数据存储在内存中,提供快速的访问。其特点是轻量级、高性能和分布式的特性。 2. **安装Memcached**:在服务器上安装...
1. **Memcached介绍**: - Memcached是一个高性能的分布式内存对象缓存系统,它可以存储键值对数据,用于缓解数据库负载,提高Web应用的响应速度。 - Memcached使用简单的文本协议,支持多语言客户端,且基于内存...
3. **Memcached介绍** Memcached比Memcache更现代,它提供了一个更为强大和稳定的服务。Memcached同样是一个分布式内存缓存系统,但其设计目标是简化存储和检索过程,提高性能。 4. **PHP扩展Memcached** PHP的...