Memcached

简介

  • Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
  • Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果
  • 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

特征

  • memcached作为高速运行的分布式缓存服务器,具有以下的特点。
    协议简单
    基于libevent的事件处理
    内置内存存储方式
    memcached不互相通信的分布式

Memcached 存储命令

set 命令

该命令用于将 value 存储在指定的 key(键) 中。如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

  • 语法:
    set key flags exptime bytes [noreply]
    value
    参数说明如下:
    flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
    exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
    bytes:在缓存中存储的字节数
    noreply(可选): 该参数告知服务器不需要返回数据
    value:存储的值(始终位于第二行)
  • 实例
set runoob 0 900 9
memcached
STORED

get runoob
VALUE runoob 0 9
memcached

END
  • 输出
    成功,则输出:STORED。失败,则输出:ERROR

add 命令

该命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。

  • 语法:
    add key flags exptime bytes [noreply]
    value

  • 实例

add new_key 0 900 10
data_value

STORED

get new_key
VALUE new_key 0 10
data_value
END
  • 输出
    如果添加成功,输出:STORED。如果失败,输出:NOT_STORED 。

replace 命令

该命令用于替换已存在的 key(键) 的 value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。

  • 语法:
    replace key flags exptime bytes [noreply]
    value

  • 实例
    以下实例中我们使用的键位 ‘mykey’ 并存储对应的值 data_value。执行后我们替换相同的 key 的值为 ‘some_other_value’。

add mykey 0 900 10
data_value

STORED
get mykey
VALUE mykey 0 10
data_value
END

replace mykey 0 900 16
some_other_value
get mykey
VALUE mykey 0 16
some_other_value
END
  • 输出
    如果数据添加成功,则输出:STORED。如果数据添加失败,则输出:NOT_STORED。

append 命令

该命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。

  • 语法:
    append key flags exptime bytes [noreply]
    value
  • 实例
set runoob 0 900 9
memcached
STORED

get runoob
VALUE runoob 0 9
memcached
END

append runoob 0 900 5
redis
STORED

get runoob
VALUE runoob 0 14
memcachedredis
END
  • 输出
    如果数据添加成功,则输出:STORED
    如果该键在 Memcached 上不存在,则输出:NOT_STORED
    如果执行错误,则输出CLIENT_ERROR。

prepend 命令

该命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。

  • 语法:
    prepend key flags exptime bytes [noreply]
    value
  • 实例
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 14
memcached
END

prepend runoob 0 900 5
redis
STORED
get runoob
VALUE runoob 0 14
redismemcached
END
  • 输出
    如果数据添加成功,则输出:STORED
    如果该键在 Memcached 上不存在,则输出:NOT_STORED
    如果执行错误,则输出CLIENT_ERROR。

CAS(Check-And-Set 或 Compare-And-Swap)

该 命令用于执行一个"检查并设置"的操作
它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。
语法:

  • 基本语法格式:
    cas key flags exptime bytes unique_cas_token [noreply]
    value
    参数说明如下:
    bytes:在缓存中存储的字节数
    unique_cas_token通过 gets 命令获取的一个唯一的64位值。
  • 实例
    要在 Memcached 上使用 CAS 命令,你需要从 Memcached 服务商通过 gets 命令获取令牌(token)。
    gets 命令的功能类似于基本的 get 命令。两个命令之间的差异在于,gets 返回的信息稍微多一些:64 位的整型值非常像名称/值对的 “版本” 标识符。
  • 实例步骤如下:
    如果没有设置唯一令牌,则 CAS 命令执行错误。
    如果键 key 不存在,执行失败。
    添加键值对。
    通过 gets 命令获取唯一令牌。
    使用 cas 命令更新数据
    使用 get 命令查看数据是否更新
cas tp 0 900 9
ERROR             <− 缺少 token

cas tp 0 900 9 2
memcached
NOT_FOUND         <− 键 tp 不存在

set tp 0 900 9
memcached
STORED

gets tp
VALUE tp 0 9 1
memcached
END

cas tp 0 900 5 1
redis
STORED

get tp
VALUE tp 0 5
redis
END
  • 输出
    如果数据添加成功,则输出:STORED
    如果保存出错或语法错误:ERROR。
    如果在最后一次取值后另外一个用户也在更新该数据:EXISTS。
    如果Memcached 服务上不存在该键值:NOT_FOUND:

查找命令

get 命令

该命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。

  • 语法:
    get key
    多个 key 使用空格隔开,如下:
    get key1 key2 key3
  • 实例
set runoob 0 900 9
memcached
STORED

get runoob
VALUE runoob 0 9
memcached
END

gets 命令

该命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。

  • 语法:
    gets key
    多个 key 使用空格隔开,如下:
    gets key1 key2 key3
  • 实例
set runoob 0 900 9
memcached
STORED

gets runoob
VALUE runoob 0 9 1
memcached
END

在 使用 gets 命令的输出结果中,在最后一列的数字 1 代表了 key 为 runoob 的 CAS 令牌。

delete 命令

该命令用于删除已存在的 key(键)。

  • 语法:
    delete key [noreply]
  • 实例
    在以下实例中,我们使用 runoob 作为 key,过期时间设置为 900 秒。之后我们使用 delete 命令删除该 key。
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 9
memcached
END

delete runoob
DELETED
get runoob
END

delete runoob
NOT_FOUND
  • 输出
    DELETED:删除成功。
    ERROR:语法错误或删除失败。
    NOT_FOUND:key 不存在。

incr

该命令用于对已存在的 key(键) 的数字值进行自增或自减操作。
incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。

  • 语法:
    incr key increment_value
  • 参数说明如下:
    key:键值 key-value 结构中的 key,用于查找缓存值。
    increment_value: 增加的数值。
  • 实例
    在以下实例中,我们使用 visitors 作为 key,初始值为 10,之后进行加 5 操作。
set visitors 0 900 2
10
STORED
get visitors
VALUE visitors 0 2
10
END 

incr visitors 5
15
get visitors
VALUE visitors 0 2
15
END
  • 输出信息说明:
    NOT_FOUND:key 不存在。
    CLIENT_ERROR:自增值不是对象。
    ERROR其他错误,如语法错误等。

decr 命令

  • 基本语法格式:
    decr key decrement_value
  • 参数说明如下:
    key:键值 key-value 结构中的 key,用于查找缓存值。
    decrement_value: 减少的数值。
  • 实例
set visitors 0 900 2
10
STORED
get visitors
VALUE visitors 0 2
10
END

decr visitors 5
5
get visitors
VALUE visitors 0 1
5
END

在以上实例中,我们使用 visitors 作为 key,初始值为 10,之后进行减 5 操作。

  • 输出
    NOT_FOUND:key 不存在。
    CLIENT_ERROR:自增值不是对象。
    ERROR其他错误,如语法错误等。

统计命令

stats 命令

该命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。

  • 实例
    在以下实例中,我们使用了 stats 命令来输出 Memcached 服务信息。
stats
STAT pid 1162
。。。。。
STAT reclaimed 1
END
  • 详细解释:
    pid: memcache服务器进程ID
    uptime:服务器已运行秒数
    time:服务器当前Unix时间戳
    version:memcache版本
    pointer_size:操作系统指针大小
    rusage_user:进程累计用户时间
    rusage_system:进程累计系统时间
    curr_connections:当前连接数量
    total_connections:Memcached运行以来连接总数
    connection_structures:Memcached分配的连接结构数量
    cmd_get:get命令请求次数
    cmd_set:set命令请求次数
    cmd_flush:flush命令请求次数
    get_hits:get命令命中次数
    get_misses:get命令未命中次数
    delete_misses:delete命令未命中次数
    delete_hits:delete命令命中次数
    incr_misses:incr命令未命中次数
    incr_hits:incr命令命中次数
    decr_misses:decr命令未命中次数
    decr_hits:decr命令命中次数
    cas_misses:cas命令未命中次数
    cas_hits:cas命令命中次数
    cas_badval:使用擦拭次数
    auth_cmds:认证命令处理的次数
    auth_errors:认证失败数目
    bytes_read:读取总字节数
    bytes_written:发送总字节数
    limit_maxbytes:分配的内存总大小(字节)
    accepting_conns:服务器是否达到过最大连接(0/1)
    listen_disabled_num:失效的监听数
    threads:当前线程数
    conn_yields:连接操作主动放弃数目
    bytes:当前存储占用的字节数
    curr_items:当前存储的数据总数
    total_items:启动以来存储的数据总数
    evictions:LRU释放的对象数目
    reclaimed:已过期的数据条目来存储新数据的数目

stats items 命令

该命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。

  • 实例
    stats items
    STAT items:1:number 1
    STAT items:1:age 7
    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

flush_all 命令

该命令用于用于清理缓存中的所有 key=>value(键=>值) 对。
该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。
语法:
flush_all [time] [noreply]
实例
清理缓存:

set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 9
memcached
END
flush_all
OK
get runoob
END

Java 连接 Memcached 服务

  • set 操作实例
    以下使用 java.util.concurrent.Future 来存储数据
public class MemcachedJava {
   public static void main(String[] args) {
      try{
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
        // 存储数据
         Future fo = mcc.set("runoob", 900, "Free Education");
         // 查看存储状态
         System.out.println("set status:" + fo.get());
         
         // 输出值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

add 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加数据
         Future fo = mcc.set("runoob", 900, "Free Education");

         // 打印状态
         System.out.println("set status:" + fo.get());//true

         // 输出
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 添加
         Future fo = mcc.add("runoob", 900, "memcached");

         // 打印状态
         System.out.println("add status:" + fo.get());

         // 添加新key
         fo = mcc.add("codingground", 900, "All Free Compilers");

         // 打印状态
         System.out.println("add status:" + fo.get());
         
         // 输出
         System.out.println("codingground value in cache - " + mcc.get("codingground"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex){
         System.out.println(ex.getMessage());
      }
   }
}

replace 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
      try {
         //连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加第一个 key=》value 对
         Future fo = mcc.set("runoob", 900, "Free Education");

         // 输出执行 add 方法后的状态
         System.out.println("add status:" + fo.get());

         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 添加新的 key
         fo = mcc.replace("runoob", 900, "Largest Tutorials' Library");

         // 输出执行 set 方法后的状态
         System.out.println("replace status:" + fo.get());

         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

append 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
        // 添加数据
         Future fo = mcc.set("runoob", 900, "Free Education");

         // 输出执行 set 方法后的状态
         System.out.println("set status:" + fo.get());

         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 对存在的key进行数据添加操作
         Future fo = mcc.append("runoob", 900, " for All");

         // 输出执行 set 方法后的状态
         System.out.println("append status:" + fo.get());
         
         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("codingground"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}

prepend 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加数据
         Future fo = mcc.set("runoob", 900, "Education for All");

         // 输出执行 set 方法后的状态
         System.out.println("set status:" + fo.get());

         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 对存在的key进行数据添加操作
         Future fo = mcc.prepend("runoob", 900, "Free ");

         // 输出执行 set 方法后的状态
         System.out.println("prepend status:" + fo.get());
         
         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("codingground"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}

CAS 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加数据
         Future fo = mcc.set("runoob", 900, "Free Education");

         // 输出执行 set 方法后的状态
         System.out.println("set status:" + fo.get());
            
         // 使用 get 方法获取数据
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 通过 gets 方法获取 CAS token(令牌)
         CASValue casValue = mcc.gets("runoob");

         // 输出 CAS token(令牌) 值
         System.out.println("CAS token - " + casValue);

         // 尝试使用cas方法来更新数据
         CASResponse casresp = mcc.cas("runoob", casValue.getCas(), 900, "Largest Tutorials-Library");
         
         // 输出 CAS 响应信息
         System.out.println("CAS Response - " + casresp);

         // 输出值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}

get 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加数据
         Future fo = mcc.set("runoob", 900, "Free Education");

         // 输出执行 set 方法后的状态
         System.out.println("set status:" + fo.get());

         // 使用 get 方法获取数据
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}

gets 操作实例、CAS

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加数据
         Future fo = mcc.set("runoob", 900, "Free Education");

         // 输出执行 set 方法后的状态
         System.out.println("set status:" + fo.get());
            
         // 从缓存中获取键为 runoob 的值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 通过 gets 方法获取 CAS token(令牌)
         CASValue casValue = mcc.gets("runoob");

         // 输出 CAS token(令牌) 值
         System.out.println("CAS value in cache - " + casValue);

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}

delete 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加数据
         Future fo = mcc.set("runoob", 900, "World's largest online tutorials library");

         // 输出执行 set 方法后的状态
         System.out.println("set status:" + fo.get());

         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("runoob"));

         // 对存在的key进行数据添加操作
         Future fo = mcc.delete("runoob");

         // 输出执行 delete 方法后的状态
         System.out.println("delete status:" + fo.get());

         // 获取键对应的值
         System.out.println("runoob value in cache - " + mcc.get("codingground"));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}

Incr/Decr 操作实例

public class MemcachedJava {
   public static void main(String[] args) {
   
      try{
   
         // 连接本地的 Memcached 服务
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         // 添加数字值
         Future fo = mcc.set("number", 900, "1000");

         // 输出执行 set 方法后的状态
         System.out.println("set status:" + fo.get());

         // 获取键对应的值
         System.out.println("value in cache - " + mcc.get("number"));

         // 自增并输出
         System.out.println("value in cache after increment - " + mcc.incr("number", 111));

         // 自减并输出
         System.out.println("value in cache after decrement - " + mcc.decr("number", 112));

         // 关闭连接
         mcc.shutdown();
         
      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值