zoukankan      html  css  js  c++  java
  • memcached 学习笔记 1

    一 简介

    1 What is Memcached?

    Free & open source, high-performance, distributed memory object caching system, generic in nature, 

    but intended for use in speeding up dynamic web applications by alleviating 【减轻 缓解】 database load.

    Memcached is an in-memory key-value store for small chunks 【块】

    of arbitrary 【任意的】data (strings, objects) from results of database calls, API calls, or page rendering.

    Memcached is simple yet powerful. Its simple design promotes uick deployment, ease of development, 

    and solves many problems facing large data caches. Its API is available for most popular languages.

    memcached 是以 LiveJournal 旗下 Danga Interactive 公司 的 Brad Fitzpatric 为首开发的一款软件。

    现在已成为 mixi、 hatena、 Facebook、 Vox、 LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。

    许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。

     但随着数据量的增大、 访问的集中, 就会出现 RDBMS 的负担加重、数据库响应恶化、网站显示延迟等重大影响。

    这时就该 memcached 大显身手了。 memcached 是高性能的分布式内存缓存服务器。

    一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、 提高可扩展性,如图。

    Memcached是分布式的,也就是说它不是本地的。

    它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。

    2为什么会有Memcache和memcached两种名称

    其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。

    一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。

    3.memcached的特征

    memcached作为高速运行的分布式缓存服务器,具有以下的特点:

    1)协议简单:memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。

    1)基于libevent的事件处理:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。

       即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

     

    2)内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。

       由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。

       另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

       memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

     

    3)memcached不互相通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。

       各个memcached不会互相通信以共享信息。那么,分布式是完全取决于客户端的实现。

    二 简单使用(windows 下)

    1 下载文件

    到http://code.jellycan.com/memcached/ 下载memcached的windows版

    再下载一个java_memcached-release.jar

    java_memcached-release_1.6.zip

    memcached-1.2.1-win32.zip

     

    2  解压memcached-1.2.1-win32.zip 

    D:jtmemcachedmemcached-1.2.1

    3 启动

    D:jtmemcachedmemcached-1.2.1:>memcached.exe -d install

    D:jtmemcachedmemcached-1.2.1:>memcached.exe -l 127.0.0.1 -m 32 -d start    

    第一行是安装memcached成为服务,这样才能正常运行,否则运行失败!

    执行后参看服务列表:

    第二行是启动memcached的,作为测试我们就简单的只分配32M((默认64M))内存了,然后监听本机端口和以守护进行运行。

    执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。

    ­p 使用的 TCP 端口 。 默认为 11211

    ­m 最大内存大小。 默认为 64M

    ­d 作为 daemon 在后台启动

    2 java的使用

    在java_memcached-release_1.6.zip中有java_memcached-release_1.6.jar  

    复制到java项目的lib目录下,然后我们来编写代码

      1 package com.jt.memcached.mem;
      2 
      3 import java.util.Date;
      4 import com.danga.MemCached.MemCachedClient;
      5 import com.danga.MemCached.SockIOPool;
      6 
      7 /**
      8  * 使用memcached的缓存实用类.
      9  */
     10 public class MemCached {
     11 
     12     // 创建全局的唯一实例
     13     protected static MemCachedClient mcc = new MemCachedClient();
     14 
     15     protected static MemCached memCached = new MemCached();
     16 
     17     // 设置与缓存服务器的连接池
     18     static {
     19         // 服务器列表和其权重
     20         String[] servers = { "127.0.0.1:11211" };
     21         Integer[] weights = { 3 };
     22 
     23         // 获取socke连接池的实例对象
     24         SockIOPool pool = SockIOPool.getInstance();
     25 
     26         // 设置服务器信息
     27         pool.setServers(servers);
     28         pool.setWeights(weights);
     29 
     30         // 设置初始连接数、最小和最大连接数以及最大处理时间
     31         pool.setInitConn(5);
     32         pool.setMinConn(5);
     33         pool.setMaxConn(250);
     34         pool.setMaxIdle(1000 * 60 * 60 * 6);
     35 
     36         // 设置主线程的睡眠时间
     37         pool.setMaintSleep(30);
     38 
     39         // 设置TCP的参数,连接超时等
     40         pool.setNagle(false);
     41         pool.setSocketTO(3000);
     42         pool.setSocketConnectTO(0);
     43 
     44         // 初始化连接池
     45         pool.initialize();
     46 
     47         // 压缩设置,超过指定大小(单位为K)的数据都会被压缩
     48         mcc.setCompressEnable(true);
     49         mcc.setCompressThreshold(64 * 1024);
     50     }
     51 
     52     /**
     53      * 保护型构造方法,不允许实例化!
     54      */
     55     protected MemCached() {
     56 
     57     }
     58 
     59     /**
     60      * 获取唯一实例.
     61      */
     62     public static MemCached getInstance() {
     63         return memCached;
     64     }
     65 
     66     /**
     67      * 添加一个指定的值到缓存中.
     68      */
     69     public boolean add(String key, Object value) {
     70         return mcc.add(key, value);
     71     }
     72 
     73     /**
     74      * 添加一个指定的值到缓存中并指定过期时间
     75      */
     76     public boolean add(String key, Object value, Date expiry) {
     77         return mcc.add(key, value, expiry);
     78     }
     79 
     80     /**
     81      * 替换指定的值
     82      */
     83     public boolean replace(String key, Object value) {
     84         return mcc.replace(key, value);
     85     }
     86 
     87     /**
     88      * 替换指定的值并指定过期时间
     89      */
     90     public boolean replace(String key, Object value, Date expiry) {
     91         return mcc.replace(key, value, expiry);
     92     }
     93 
     94     /**
     95      * 根据指定的关键字获取对象.
     96      */
     97     public Object get(String key) {
     98         return mcc.get(key);
     99     }
    100 }

    测试:

     1 package com.jt.memcached.demo;
     2 
     3 import java.util.Date;
     4 import org.junit.Test;
     5 import com.jt.memcached.mem.MemCached;
     6 import com.jt.memcached.mem.User;
     7 
     8 public class MemcachedDemo {
     9 
    10     MemCached cache = MemCached.getInstance();
    11 
    12     @Test
    13     public void cachedData() {
    14 
    15         cache.add("hello", 234);
    16         System.out.println("cached success!");
    17     }
    18 
    19     @Test
    20     public void getData() {
    21         System.out.print("get value : " + cache.get("hello"));
    22     }
    23 
    24     @Test
    25     public void cachedUser() {
    26 
    27         User user = new User("jtKevin", 23, new Date());
    28         cache.add("user", user);
    29         System.out.println("cached a user success!");
    30     }
    31 
    32     @Test
    33     public void getUser() {
    34         User cachedUser = (User) cache.get("user");
    35         System.out.println("cached user:" + cachedUser);
    36     }
    37 //cached user:User [name=jtKevin, age=23, hiredDate=Mon Aug 17 12:36:29 CST 2015]
    38 }

    User类:

     1 package com.jt.memcached.mem;
     2 
     3 import java.io.Serializable;
     4 import java.util.Date;
     5 
     6 public class User implements Serializable {
     7 
     8     private static final long serialVersionUID = 1L;
     9 
    10     private String name;
    11     private int age;
    12     private Date hiredDate;
    13 
    14     public User() {
    15         super();
    16     }
    17 
    18     public User(String name, int age, Date hiredDate) {
    19         super();
    20         this.name = name;
    21         this.age = age;
    22         this.hiredDate = hiredDate;
    23     }
    24 
    25     public String getName() {
    26         return name;
    27     }
    28 
    29     public void setName(String name) {
    30         this.name = name;
    31     }
    32 
    33     public int getAge() {
    34         return age;
    35     }
    36 
    37     public void setAge(int age) {
    38         this.age = age;
    39     }
    40 
    41     public Date getHiredDate() {
    42         return hiredDate;
    43     }
    44 
    45     public void setHiredDate(Date hiredDate) {
    46         this.hiredDate = hiredDate;
    47     }
    48 
    49     public static long getSerialversionuid() {
    50         return serialVersionUID;
    51     }
    52 
    53     @Override
    54     public String toString() {
    55         return "User [name=" + name + ", age=" + age + ", hiredDate=" + hiredDate + "]";
    56     }
    57 }
    View Code

    注意:

    1 memcached是在服务器端的内存中缓存对象的,不是缓存或硬盘;

     

    2 memcached的pool可以关联多个server,

    String[] servers = {"10.20.185.12:11001","10.20.185.25:11001"};  
    Integer[] weights = {3,7};  

    该配置表示30%的缓存在放在第一台服务器,70%的将放在第二台服务器,这样便可以充分利用不同服务器的内存了;

     

    3我最困惑的是client是如何得到相应的pool的,后然看了点源码才知道是这样的。client是通过pool的name关联到某个pool的,

    上面的例子中在SockIOPool pool = SockIOPool.getInstance();  和MemCachedClient client=new MemCachedClient();虽然都没写poolName,

    但就是新建了一个”default“的pool,然后client关联到了这个”default“的pool。当然我们在新建这两个对象时可以给定具体的poolName。

     

    三 Memcached的命令参数说明

    memcached 1.4.2  

    -p       监听的TCP端口(默认: 11211)  

    -U       监听的UDP端口(默认: 11211, 0表示不监听)  

    -s      用于监听的UNIX套接字路径(禁用网络支持)  

    -a      UNIX套接字访问掩码,八进制数字(默认:0700)  

    -l      监听的IP地址。(默认:INADDR_ANY,所有地址)  

    -d            作为守护进程来运行。  

    -r            最大核心文件限制。  

    -u       设定进程所属用户。(只有root用户可以使用这个参数)  

    -m       单个数据项的最大可用内存,以MB为单位。(默认:64MB)  

    -M       内存用光时报错。(不会删除数据)  

    -c       最大并发连接数。(默认:1024)  

    -k            锁定所有内存页。注意你可以锁定的内存上限。  

                  试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。  

                  (不是前面的 -u  参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)  

    -v            提示信息(在事件循环中打印错误/警告信息。)  

    -vv           详细信息(还打印客户端命令/响应)  

    -vvv          超详细信息(还打印内部状态的变化)  

    -h            打印这个帮助信息并退出。  

    -i            打印memcached和libevent的许可。  

    -P      保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。  

    -f      块大小增长因子。(默认:1.25)  

    -n     分配给key+value+flags的最小空间(默认:48)  

    -L            尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。  

                  为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。  

    -D      使用  作为前缀和ID的分隔符。  

                  这个用于按前缀获得状态报告。默认是":"(冒号)。  

                  如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。  

    -t       使用的线程数(默认:4)  

    -R            每个连接可处理的最大请求数。  

    -C            禁用CAS。  

    -b            设置后台日志队列的长度(默认:1024)  

    -B            绑定协议 - 可能值:ascii,binary,auto(默认)  

    -I            重写每个数据页尺寸。调整数据项最大尺寸。 

     

     

    四 Memcached常用命令及使用说明

    存储命令

     

    存储命令的格式:

    <command name> <key> <flags> <exptime> <bytes>

    <data block>

     

    参数说明如下:

    <command name>

    set/add/replace

    <key>

    查找关键字

    <flags>

    客户机使用它存储关于键值对的额外信息

    <exptime>

    该数据的存活时间,0表示永远

    <bytes>

    存储字节数

    <data block>

    存储的数据块(可直接理解为key-value结构中的value)

    1、添加

    (1)、无论如何都存储的set

    这个set的命令在memcached中的使用频率极高。

    set命令不但可以简单添加,如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用

    可以通过“get 键名”的方式查看添加进去的记录:

    我们也可以通过delete命令删除掉,然后重新添加。

     

    (2)、只有数据不存在时进行添加的add

    (3)、只有数据存在时进行替换的replace

     

    2、删除

    可以看到,删除已存在的键值和不存在的记录可以返回不同的结果。

     

    读取命令

    1、get

    get命令的key可以表示一个或者多个键,键之间以空格隔开

    2、gets

    可以看到,gets命令比普通的get命令多返回了一个数字(上图中为13)。

    这个数字可以检查数据是否发生改变。当key对应的数据改变时,这个多返回的数字也会改变。

     

    状态命令

    查看 memcached 的内部状态

    memcached 有个名为 stats 的命令,使用它可以获得各种各样的信息。 执行命令的方法很多,用

    telnet 最为简单:

    $ telnet  主机名 端口号

    连接到 memcached 之后, 输入 stats 再按回车, 即可获得包括资源利用率在内的各种信息。 此外,

    输入"stats slabs"或"stats items"还可以获得关于缓存记录的信息。结束程序请输入 quit。

     1 telnet 127.0.0.1 11211
     2 
     3 stats
     4 
     5 STAT pid 18006
     6 
     7 STAT uptime 702   //memcached运行的秒数
     8 
     9 STAT time 1292904537 //memcached服务器所在主机当前系统的时间,单位是秒。
    10 
    11 STAT version 1.4.5
    12 
    13 STAT pointer_size 64  //服务器所在主机操作系统的指针大小,一般为32或64
    14 
    15 STAT rusage_user 0.003999
    16 
    17 STAT rusage_system 0.013997
    18 
    19 STAT curr_connections 10   //表示当前的连接数
    20 
    21 STAT total_connections 11   //表示从memcached服务启动到当前时间,系统打开过的连接的总数。
    22 
    23 STAT connection_structures 11
    24 
    25 STAT cmd_get 0   //查询缓存的次数,平均每秒缓存次数cmd_get/uptime
    26 
    27 STAT cmd_set 0   //设置key=>value的次数
    28 
    29 STAT cmd_flush 0
    30 
    31 STAT get_hits 0  //缓存命中的次数,缓存命中率=get_hits/cmd_get*100%
    32 
    33 STAT get_misses 0  //cmd_get-get_hits
    34 
    35 STAT delete_misses 0
    36 
    37 STAT delete_hits 0
    38 
    39 STAT incr_misses 0
    40 
    41 STAT incr_hits 0
    42 
    43 STAT decr_misses 0
    44 
    45 STAT decr_hits 0
    46 
    47 STAT cas_misses 0
    48 
    49 STAT cas_hits 0
    50 
    51 STAT cas_badval 0
    52 
    53 STAT auth_cmds 0
    54 
    55 STAT auth_errors 0
    56 
    57 STAT bytes_read 7  //memcached服务器从网络读取的总的字节数
    58 
    59 STAT bytes_written 0  //memcached服务器发送到网络的总的字节数。
    60 
    61 STAT limit_maxbytes 67108864  //memcached服务缓存允许使用的最大字节数
    62 
    63 STAT accepting_conns 1
    64 
    65 STAT listen_disabled_num 0
    66 
    67 STAT threads 4
    68 
    69 STAT conn_yields 0
    70 
    71 STAT bytes 0
    72 
    73 STAT curr_items 0
    74 
    75 STAT total_items 0
    76 
    77 STAT evictions 0
    78 
    79 STAT reclaimed 0
    80 
    81 END
    82 
    83 Quit
  • 相关阅读:
    职场篇:聚焦与复盘
    职场篇:直面情绪杀手【已补更】
    .NetCore实践篇:成功解决分布式监控ZipKin聚合依赖问题(三)
    职场篇:为何我们需要思想大洗礼?
    职场篇:从温水煮青蛙说起
    .NetCore实践篇:分布式监控系统zipkin踩坑之路(二)
    postman application/json;
    yapi 个人空间 这个分组的问题
    yapi 的分组的理解!
    yapi的安装
  • 原文地址:https://www.cnblogs.com/wihainan/p/4792312.html
Copyright © 2011-2022 走看看