关于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\r\n” 回应。它的效果是使已经存在的项目立即失效(缺省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。 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:\t" + obj2);

System.out.println("Non-CAS 1:\t" + 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:\t" + casValue2.getCas());

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

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

System.out.println("Value 1:\t" + 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>

关于 Memcached 的一些使用的更多相关文章

  1. 支持 .NET Core 的 Memcached 客户端 EnyimMemcachedCore

    1. 介绍 EnyimMemcachedCore 是一个支持 .NET Core 的 Memcached 客户端,是从 EnyimMemcached 迁移至 .NET Core的,源代码托管在 Git ...

  2. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  3. ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存

    ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...

  4. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  5. 企业做数据缓存是使用Memcached还是选Redis?

    企业是使用Memcached还是选Redis? 在构建一款现代且由数据库驱动的Web应用程序并希望使其拥有更为出色的性能表现时,这个问题总会时不时出现.并给每一位开发人员带来困扰.在考虑对应用程序的性 ...

  6. NoSql1 在Linux(CentOS)上安装memcached及使用

    前言:       今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...

  7. Memcached简介

    在Web服务开发中,服务端缓存是服务实现中所常常采用的一种提高服务性能的方法.其通过记录某部分计算结果来尝试避免再次执行得到该结果所需要的复杂计算,从而提高了服务的运行效率. 除了能够提高服务的运行效 ...

  8. Linux 服务器 安装 memcached

    linux centos 一.memcached的安装 1.下载 memcached-1.4.33.tar.gz.libevent-2.0.22-stable.tar.gz 安装 memcached ...

  9. Memcached和Redis比较

    一.存储 Memcached基本只支持简单的key-value存储方式.Redis除key-value之外,还支持list,set,sorted set,hash等数据结构:Redis支持数据的备份, ...

  10. 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展

    上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...

随机推荐

  1. 敏捷开发之道(三)极限编程XP续

    上次的博文敏捷开发之道(二)极限编程XP中,我们了解了XP的实践中的其中四个,今天我们来一起学习一下剩余的实践. --接上文 5).结对编程 结对编程就是由结对的开发人员使用同一台电脑共同完成一项任务 ...

  2. res/drawable目录下图片的Uri

    http://liuyun025.iteye.com/blog/1280838 有时候,我们要用到res/drawable目录下的图片Uri,而这个Uri该如何生存呢?下面就是这Uri的生成方法: U ...

  3. linux 删除某种规则命名的文件

    由于android开发需要删除以IMG_开头命名的图片文件,因此用到此命令 命令格式: rm IMG_*

  4. segment fault

    http://blog.chinaunix.net/uid-23069658-id-3959636.html

  5. 【BZOJ】【3524】【POI2014】Couriers

    可持久化线段树 裸可持久化线段树,把区间第K大的rank改成num即可……(往儿子走的时候不减少) 苦逼的我……MLE了一次(N*30),RE了一次(N*10)……数组大小不会开…… 最后开成N*20 ...

  6. STL中的stack(堆栈)

    转载:http://blog.csdn.net/morewindows/article/details/6950881 栈(statck)这种数据结构在计算机中是相当出名的.栈中的数据是先进后出的(F ...

  7. javascript数学计算

    ◎Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数:◎Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数:◎Math.round()执行标准舍入,即它总 ...

  8. Leetcode#78 Subsets

    原题地址 有两种方法: 1. 对于序列S,其子集可以对应为一个二进制数,每一位对应集合中的某个数字,0代表不选,1代表选,比如S={1,2,3},则子集合就是3bit的所有二进制数. 所以,照着二进制 ...

  9. Matlab 高斯分布 均匀分布 以及其他分布 的随机数

    Matlab 高斯分布 均匀分布 以及其他分布 的随机数 betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd 卡方分布的随机数生成器 exprnd 指数分布 ...

  10. State of Hyperparameter Selection

    State of Hyperparameter Selection DANIEL SALTIEL VIEW NOTEBOOK Historically hyperparameter determina ...