您的位置:首页 > 数据库 > Memcache

memcached 操作使用

2020-02-16 11:25 549 查看

memcached 解析 1.特征: 1.1 协议简单 1.2 内置内存储存方式 1.3 基于libevent 1.4 memcached 不互相通信的分布式 2.安装 sudo apt-get install memcached 2.1 memcached 帮助信息 memcache -h -d 守护进程 -m 分配内存大小 -c 最大并发运行数 默认为1024 -p 监听的端口 -l 监听的IP地址 -u 运行memcached 的用户 2.2后台运行 memcached -p 11211 -m 64m -d 2.3前台运行 memcached -p 11211 -m 64m -vv

3.memcached 保存命名 3.1 memcached set 命名 命令用于将 value(数据值) 存储在指定的 key(键) 中 set key flag exptime bytes [noreply] value

key:键值 key-value 结构中的 key,用于查找缓存值。 flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。 exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) bytes:在缓存中存储的字节数 noreply(可选): 该参数告知服务器不需要返回数据 value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

set runoob 0 900 9 memcached

get runoob VALUE runoob 0 9 memcached

3.2 memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。

add key flags exptime bytes [noreply] value

key:键值 key-value 结构中的 key,用于查找缓存值。 flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。 exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) bytes:在缓存中存储的字节数 noreply(可选): 该参数告知服务器不需要返回数据 value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

add new_key 0 900 10 data_value STORED get new_key VALUE new_key 0 10 data_value END

3.3 memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。 replace key flags exptime bytes [noreply] value

key:键值 key-value 结构中的 key,用于查找缓存值。 flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。 exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) bytes:在缓存中存储的字节数 noreply(可选): 该参数告知服务器不需要返回数据 value:存储的值(始终位于第二行)(可直接理解为key-value结构中的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

3.4 memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。 append key flags exptime bytes [noreply] value

key:键值 key-value 结构中的 key,用于查找缓存值。 flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。 exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) bytes:在缓存中存储的字节数 noreply(可选): 该参数告知服务器不需要返回数据 value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 14 memcached END append runoob 0 900 5 redis STORED get runoob VALUE runoob 0 14 memcachedredis

3.5 Memcached prepend Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 prepend key flags exptime bytes [noreply] value

key:键值 key-value 结构中的 key,用于查找缓存值。 flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。 exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) bytes:在缓存中存储的字节数 noreply(可选): 该参数告知服务器不需要返回数据 value:存储的值(始终位于第二行)(可直接理解为key-value结构中的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

3.6 Memcached CAS Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作

它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。

cas key flags exptime bytes unique_cas_token [noreply] value

key:键值 key-value 结构中的 key,用于查找缓存值。 flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。 exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) bytes:在缓存中存储的字节数 unique_cas_token通过 gets 命令获取的一个唯一的64位值。 noreply(可选): 该参数告知服务器不需要返回数据 value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value

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

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

set runoob 0 900 9 memcached STORED get runoob VALUE runoob 0 9 memcached

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

set runoob 0 900 9 memcached STORED gets runoob VALUE runoob 0 9 1 memcached

3.9 Memcached delete 命令用于删除已存在的 key(键)。

delete key [noreply

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

3.10 Memcached incr 与 decr 命令

Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。

incr key increment_value

key:键值 key-value 结构中的 key,用于查找缓存值。 increment_value: 增加的数值

set visitors 0 900 2 10 STORED 20000 get visitors VALUE visitors 0 2 10 END incr visitors 5 15 get visitors VALUE visitors 0 2 15

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

3.11 Memcached stats 命令

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

stats

stats STAT pid 1162 STAT uptime 5022 STAT time 1415208270 STAT version 1.4.14 STAT libevent 2.0.19-stable STAT pointer_size 64 STAT rusage_user 0.096006 STAT rusage_system 0.152009 STAT curr_connections 5 STAT total_connections 6 STAT connection_structures 6 STAT reserved_fds 20 STAT cmd_get 6 STAT cmd_set 4 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 4 STAT get_misses 2 STAT delete_misses 1 STAT delete_hits 1 STAT incr_misses 2 STAT incr_hits 1 STAT decr_misses 0 STAT decr_hits 1 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 262 STAT bytes_written 313 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 524288 STAT hash_is_expanding 0 STAT expired_unfetched 1 STAT evicted_unfetched 0 STAT bytes 142 STAT curr_items 2 STAT total_items 6 STAT evictions 0 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:已过期的数据条目来存储新数据的数目

3.12 Memcached stats items 命令

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

stats items

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

3.13 Memcached stats slabs Memcached stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等。

stats slabs

stats slabs STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 STAT 1:total_pages 1 STAT 1:total_chunks 10922 STAT 1:used_chunks 1 STAT 1:free_chunks 10921 STAT 1:free_chunks_end 0 STAT 1:mem_requested 71 STAT 1:get_hits 0 STAT 1:cmd_set 1 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 active_slabs 1 STAT total_malloced 1048512 END

3.14 Memcached stats sizes 命令用于显示所有item的大小和个数。

stats sizes

stats sizes STAT 96 1 END

3.15 Memcached flush_all 命令 命令用于用于清理缓存中的所有 key=>value(键=>值) 对。

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

3.16 Java 连接 Memcached 服务

import net.spy.memcached.MemcachedClient; import java.net.*;

连接实例 Java 连接 Memcached

import net.spy.memcached.MemcachedClient; import java.net.*;

public class MemcachedJava { public static void main(String[] args) { try{ // 本地连接 Memcached 服务 MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server sucessful.");

// 关闭连接
mcc.shutdown();

}catch(Exception ex){
System.out.println( ex.getMessage() );
}

} }该程序中我们使用 InetSocketAddress 连接 IP 为 127.0.0.1 端口 为 11211 的 memcached 服务。

执行以上代码,如果连接成功会输出以下信息:

Connection to server successful.set 操作实例 以下使用 java.util.concurrent.Future 来存储数据

import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{
// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 存储数据
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() );
}

} }执行程序,输出结果为:

Connection to server successful. set status:true

runoob value in cache - Free Educationadd 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数据
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"));

// 添加
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 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try {
//连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加第一个 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 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数据
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 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数据
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 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.CASValue; import net.spy.memcached.CASResponse; import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数据
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 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数据
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

import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.CASValue; import net.spy.memcached.CASResponse; import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数据
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 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数据
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 操作实例 import java.net.InetSocketAddress; import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava { public static void main(String[] args) {

try{

// 连接本地的 Memcached 服务
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
System.out.println("Connection to server sucessful.");

// 添加数字值
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());

} }

转载于:https://my.oschina.net/210920/blog/748828

  • 点赞
  • 收藏
  • 分享
  • 文章举报
chongni9875 发布了0 篇原创文章 · 获赞 0 · 访问量 288 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: