`
您已经登录
  • 浏览: 43509 次
  • 性别: 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安装及java应用使用memcached

    1. **memcached介绍**:解释memcached的作用,它是如何通过将数据存储在内存中来减少数据库的读取压力,从而提高Web应用的响应速度。 2. **安装memcached**: - **系统要求**:说明支持的操作系统(如Linux、...

    memcached客户端文件及服务端

    **Memcached介绍** Memcached是一种高性能、分布式的内存对象缓存系统,用于在数据库和应用程序之间缓存数据,以减少对数据库的访问压力,提高应用的响应速度。它最初由Danga Interactive公司开发,现在已经成为...

    memcached+asp.net4.0

    1. **memcached介绍**:memcached是一种高性能的分布式内存缓存系统,最初设计用于加速动态Web应用程序,通过存储经常访问的数据到内存中,减少对数据库的依赖,提高响应速度。 2. **ASP.NET 4.0**:这是微软的.NET...

    memcached源代码下载.rar

    memcached介绍** `memcached`最初由Danga Interactive公司开发,现在已经成为开源社区的一个重要项目。它的设计目标是简化存储和检索数据的过程,通过将数据存储在内存中,避免了磁盘I/O操作,从而实现了快速响应...

    memcached-win64-1.4.4-14

    **Memcached介绍** Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库负载,提高网站性能。该系统通过在内存中存储数据,实现快速访问,尤其适用于处理高并发场景下的数据...

    memcached-1.5.4windows下64位编译

    1. **Memcached介绍**:Memcached是一种分布式内存缓存系统,用于临时存储Web应用中的数据,减少对数据库的访问,提高系统的整体性能。 2. **Windows编译**:由于memcached原生支持Unix/Linux环境,因此在Windows上...

    韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady

    一、Memcached介绍 Memcached是一款分布式内存对象缓存系统,广泛应用于高性能网站和应用中。它设计的目标是简化并加速动态Web应用程序的数据存储,通过将数据存储在内存中,避免频繁读取或写入数据库,从而提高...

    memcached linux windows 安装 使用 缓存 集群

    【Memcached介绍】 Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。通过在内存中存储常用数据,Memcached能够快速响应客户端请求,避免了频繁...

    memcachedlib.rar tomcat中要使用的memcached的jar文件

    1. **memcached介绍**:memcached是一个开源的、基于内存的分布式缓存系统,设计用于提高网站数据访问速度。它通过缓存经常访问的数据来减少对数据库的读取,从而提高了系统的整体性能。 2. **Java客户端**:Java...

    (SSM框架)memcached整合Spring基于Cache注解.

    1. **Memcached介绍**: Memcached是一款高性能、分布式的内存对象缓存系统,用于在动态系统中减少数据库负载,提升数据读取速度。它通过存储临时数据在内存中,避免了频繁访问数据库,提高了应用程序的响应速度。 ...

    nginx和memcached配置tomcat的jar包

    二、Memcached介绍与使用 Memcached是一个分布式内存对象缓存系统,用于减少数据库负载,提升Web应用性能。在Java应用中,我们通常使用Spymemcached库来操作Memcached。首先,将Spymemcached的jar包添加到Tomcat的`...

    memcached安装包win32+win64(包含msvcp71.dll,msvcr71.dll)

    **Memcached介绍** Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库负载,提高数据访问速度。通过在内存中存储经常访问的数据,Memcached能够快速响应请求,减少对数据库...

    memcached 在ASP.NET网站下的应用实例代码(c#)

    **memcached介绍** Memcached是一种高性能的分布式内存对象缓存系统,用于减少数据库负载,提高Web应用性能。它通过在内存中存储数据来加快数据访问速度,适用于需要频繁读取但不经常修改的数据。 **在ASP.NET中的...

    memcached文档中文版

    ### Memcached介绍 Memcached是一款高性能的分布式内存对象缓存系统,它通过缓存数据和对象来减少数据库访问次数,从而提升动态Web应用的响应速度。Memcached的键/值存储方式使得其可以用来缓存各种数据,如数据库...

    Memcached 介绍文档

    Memcached是一种高性能、分布式内存对象缓存系统,其设计初衷是为了加速动态Web应用程序,通过减轻数据库负载来提高网站性能。Memcached在多个大型互联网公司如Facebook、Yahoo、Amazon、LiveJournal和Mixi等中得到...

    memcached缓存编程实战.pptx

    Memcached 介绍 Memcached 是一个高性能的缓存系统,通过减少数据库的查询次数和降低系统的负载来提高网站的性能。Memcached 可以与多种编程语言集成,包括 Java、PHP、Python 等。 Memcached Java 客户端 ...

    memcached服务端已经多个客户端

    **memcached介绍** Memcached是一种高性能的分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升应用性能。它通过将数据存储在内存中,使得数据访问速度大大提高,尤其适用于读取密集型的应用场景。...

    memcached php

    1. **Memcached介绍**:Memcached是为了解决动态Web应用的数据库查询压力而设计的,它将数据存储在内存中,提供快速的访问。其特点是轻量级、高性能和分布式的特性。 2. **安装Memcached**:在服务器上安装...

    Memcached spring 的集成

    1. **Memcached介绍**: - Memcached是一个高性能的分布式内存对象缓存系统,它可以存储键值对数据,用于缓解数据库负载,提高Web应用的响应速度。 - Memcached使用简单的文本协议,支持多语言客户端,且基于内存...

    php扩展memecache+memcached.exe

    3. **Memcached介绍** Memcached比Memcache更现代,它提供了一个更为强大和稳定的服务。Memcached同样是一个分布式内存缓存系统,但其设计目标是简化存储和检索过程,提高性能。 4. **PHP扩展Memcached** PHP的...

Global site tag (gtag.js) - Google Analytics