• 关于 Memcached 的一些使用


    关于Memcached的一些用法,

    Memcached 在Windows下的版本费了很大劲,才找到。win32,win64都有。本来想自己build的,但是Cygwin下载包也是费老劲了,下不下来。

    在Linux上可以使用rpm/yum直接安装,很方面,如果喜欢自己build的话,那么官网就有源码,也很方便:http://memcached.org/

    也可以在github上找到:https://github.com/memcached/memcached

    不过自己build的话Memcached需要libevent的库,libevent的下载地址:http://libevent.org/

    关于 Memcached 的一些日常使用的语法和方式参见:

    http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html

    命令的语法格式:

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

    <value>

    解释说明:

    <command> 就是要执行的命令,如 set, append, prepend等

    <key> 就是类似Map中的Key,一个键,查找的关键字

    <flags> 客户机使用它存储键值对的额外信息

    <exptime> 这个键值对存活的时间,过期被回收,单位? (0表示永不过期)

    <bytes> 表示存储字节数,(如果超过设置的字节数,会报错)

    <value> 类似Map中的Value,真正存储的值。

    例如:

    set username 0 0 8

    xiaobing

    通过get 可以得到信息

    get username。

    常用的命令有:

    set

    add

    get

    gets

    delete

    replace

    还有一个cas命令:cas即checked and set的意思,只有当最后一个参数和gets所获取的参数匹配时才能存储,否则返回“EXISTS”。

    stats

    stats items

    stats items 执行的结果如下:

    红色框标出的数字是用意义的,叫slab_id,

    stats cachedump slab_id limit_num

    slab_id 就是上边红框的数字, limit_num 是要查询多少条记录出来, 0 表示查询所有。

    stats slabs

    stats sizes

    stats reset

    append 向后追加

    prepend 往前追加

    set username 0 0 8 

    xiaobing

    get username 

    结果是:xiaobing

    append username 0 0 5 

    sheng

    get username

    结果是:xiaobingsheng

    prepend username 0 0 5

    sheng

    get username

    结果是: shengxiaobingsheng

    flush_all

    该命令有一个可选的数字参数。它总是执行成功,服务器会发送 “OK ” 回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。 flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行(这是由memcached的懒惰检测和删除机制决定的)。

    flush_all 效果是它导致所有更新时间早于 flush_all 所设定时间的项目,在被执行取回命令时命令被忽略。

    4、其他命令

    memcached还有很多命令,比如对于存储为数字型的可以通过incr/decr命令进行增减操作等等,这里只列出开发和运维中经常使用的命令,其他的不再一一举例说明。

    Memcached java client 这个包里可以有:

    <groupId>net.spy</groupId>
    <artifactId>spymemcached</artifactId>
    <packaging>jar</packaging>
    <version>2.12.0</version>

    使用方法:

    • public static void main(String[] args) throws IOException {    
    •         MemcachedClient cache = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));    
    •         for (int i = 1; i < 10; i++) {    
    •             cache.set("T0001" + i, 3600, new User(i + ""));     
    •         }    
    •         User myObject = (User) cache.get("T00011");    
    •         System.out.println("Get object from mem :" + myObject);     
    •     }

    Memcached 启动时常用的配置:

    一、基本参数

    在我们第一次安装Memcached时,一般都是用过这个命令:

    我在本地启动只使用 -p 11211 -l localhost 折两个参数, 没有加log啊, 更多详细的参数可以 -h

    memcached-win32-1.4.4-14>memcached.exe -p 11211 -l localhost

    我们先来解释这几个参数的含义吧。

    如何连接 memcached 呢: 使用telnet 命令:

    telnet localhot 11211 

    这样就可以了, 练好之后,可以先 stats 看看状态哦。

    -m 指定缓存所使用的最大内存容量,单位是Megabytes,默认是64MB

    -u 只有以root身份运行时才指定该参数

    -d 以daemon的形式运行

    -l 指定监听的地址

    -p 指定监听的TCP端口号,默认是11211

    二、其他常用的参数

    -t 指定线程数,默认是4个

    -h 打印帮助信息

    -c 最大同时连接数,默认是1024.

    -U 指定监听的UDP端口号,默认是11211

    -M 内存耗尽时显示错误,而不是删除项


    一开始说的“-d”参数需要进行进一步的解释

    -d install 安装memcached

    -d uninstall 卸载memcached

    -d start 启动memcached服务

    -d restart 重启memcached服务

    -d stop 停止memcached服务

    -d shutdown 停止memcached服务

    http://blog.csdn.net/wxwzy738/article/details/23703635

    1. 什么是CAS协议

    很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写。Google.com一下,CAS是什么?CAS是Check And Set的缩写。

    2. CAS协议原文

    http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

    3. CAS的基本原理

    基本原理非常简单,一言以蔽之,就是“版本号”。每个存储的数据对象,多有一个版本号。我们可以从下面的例子来理解:

    如果不采用CAS,则有如下的情景:

    第一步,A取出数据对象X;

    第二步,B取出数据对象X;

    第三步,B修改数据对象X,并将其放入缓存;

    第四步,A修改数据对象X,并将其放入缓存。

    我们可以发现,第四步中会产生数据写入冲突。


    如果采用CAS协议,则是如下的情景。

    第一步,A取出数据对象X,并获取到CAS-ID1;

    第二步,B取出数据对象X,并获取到CAS-ID2;

    第三步,B修改数据对象X,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“一致”,就将修改后的带有CAS-ID2的X写入到缓存。

    第四步,A修改数据对象Y,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“不一致”,则拒绝写入,返回存储失败。


    这样CAS协议就用了“版本号”的思想,解决了冲突问题。

    1. 非CAS

    首先看一个不是CAS的Memcached程序实例。实例的问题原型,见上一篇博文。

    程序实例:

     

    package com.sinosuperman.memcached;    

    import java.io.IOException;    

    import java.net.InetSocketAddress;    

    import net.spy.memcached.MemcachedClient;    

    public class Test {    

    public static void main(String[] args) throws IOException {    

            MemcachedClient cache = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));    

            cache.set("x", 1800, "Love");    

            String obj1 = (String) cache.get("x");    

            String obj2 = (String) cache.get("x");    

            obj2 = "Michael";    

            cache.set("x", 1800, obj2);    

            System.out.println("Non-CAS 2: " + obj2);    

            System.out.println("Non-CAS 1: " + obj1);    

        }    

    }  

    运行结果:

    2011-12-18 23:12:39.836 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue  

    2011-12-18 23:12:39.843 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@b09e89  

    Non-CAS 2:  Michael  

    Non-CAS 1:  Love  

     可见在多个Client操作时,一定会引起写不一致性的问题。

    2. CAS

    程序实例:

     

    package com.sinosuperman.memcached;    

    import java.io.IOException;    

    import java.net.InetSocketAddress;    

    import net.spy.memcached.CASValue;    

    import net.spy.memcached.MemcachedClient;    

    public class Test {    

    @SuppressWarnings("unchecked")    

    public static void main(String[] args) throws IOException {    

            MemcachedClient cache = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));    

            cache.set("y", 1800, "Love");    

            CASValue casValue1 = cache.gets("y");    

            CASValue casValue2 = cache.gets("y");    

            cache.cas("y", casValue2.getCas(), casValue2.getValue());    

            System.out.println("CAS 2: " + casValue2.getCas());    

            System.out.println("Value 2: " + casValue2.getValue());    

            System.out.println("CAS 1: " + casValue1.getCas());    

            System.out.println("Value 1: " + casValue1.getValue());    

        }    

    }    

    运行结果:

    2011-12-18 23:07:14.528 INFO net.spy.memcached.MemcachedConnection:  Added {QA sa=/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue  

    2011-12-18 23:07:14.541 INFO net.spy.memcached.MemcachedConnection:  Connection state changed for sun.nio.ch.SelectionKeyImpl@1621e42  

    CAS 2:  11  

    Value 2:    Love  

    CAS 1:  11  

    Value 1:    Love  

    这里还有一篇关于 memcached 的介绍: http://os.51cto.com/art/201205/335034_all.htm

    Memcached 和Spring整合:


    <bean id="memcachedclient" class="net.spy.memcached.spring.memcachedclientfactorybean">
    <property name="servers" value="10.1.1.116:12000,10.1.1.116:12001,10.1.1.116:12002,10.1.1.116:12003" />
    <property name="protocol" value="binary" />
    <property name="transcoder">
    <bean class="net.spy.memcached.transcoders.serializingtranscoder">
    <property name="compressionthreshold" value="1024"/>
    </bean>
    </property>
    <property name="optimeout" value="1000" />
    <property name="timeoutexceptionthreshold" value="1998" />
    <property name="hashalg">
    <value type="net.spy.memcached.defaulthashalgorithm">ketama_hash</value>
    </property>
    <property name="locatortype" value="consistent" />
    <property name="failuremode" value="redistribute" />
    <property name="usenaglealgorithm" value="false" />
    </bean>

  • 相关阅读:
    VC6.0图形处理7边缘检测
    VC6.0图像处理0bmp文件分析
    java版QQ 欢迎点评
    VC6.0图像处理3灰度变换
    VC6.0图形处理6图像增强
    VC6.0图像处理1浏览图片
    VC6.0图像处理4镜像
    一个软件行业中层主管在年底给团队成员的一封信
    SQL的EXISTS与in、not exists与not in 效率比较和使用
    按某字段合并字符串
  • 原文地址:https://www.cnblogs.com/icenter/p/5331357.html
Copyright © 2020-2023  润新知