Author:SimpleWu
Memcached set命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
set key flags exptime bytes [noreply] value
Memcached add命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
add key flags exptime bytes [noreply] value
Memcached replace命令用于替换已存在的 key(键) 的 value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。
replace key flags exptime bytes [noreply] value
Memcached append命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。
append key flags exptime bytes [noreply] value
Memcached prepend命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
prepend key flags exptime bytes [noreply] value
Memcached CAS(Check-And-Set 或 Compare-And-Swap)命令用于执行一个"检查并设置"的操作
它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。
cas key flags exptime bytes unique_cas_token [noreply] value
参数说明如下:
Memcached get命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
get key
多个 key 使用空格隔开
get key1 key2 key3
Memcached gets命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。
gets key
多个 key 使用空格隔开
gets key1 key2 key3
Memcached delete命令用于删除已存在的 key(键)。
delete key [noreply]
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
示了很多状态信息,下边详细解释每个状态项:
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
Memcached flush_all命令用于清理缓存中的所有 key=>value(键=>值) 对。
该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。
flush_all [time] [noreply]
要使用Java连接memcached服务,一般常见的有两种方式:
两种方式的对比:
Memcached-Java-Client方式,较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。
spymemcached方式,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。
项目中加入spymemcached依赖
<!-- spymemcached --> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>spymemcached</artifactId> <version>2.8.4</version> </dependency>
spymemcached操作memcache,连接memcached服务器,并写入数据,检索出数据。
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException { //添加memcached的服务的地址和端口号 InetSocketAddress address = new InetSocketAddress("127.0.0.1", 11211); //创建memcachedClient客户端连接对象 MemcachedClient client = new MemcachedClient(address); //存储数据 @SuppressWarnings("rawtypes") Future future = client.set("SimpleWu", 900, "lovelyWu98k@gmail.com"); //查看存储状态 System.out.println("status:" + future.get()); //输出值 System.out.println("value in cache:" + client.get("SimpleWu")); //client.delete("hello"); //删除 //client.flushall(); //清除所有数据 client.shutdown(); //关闭连接 }
同样使用Maven来导入Memcached-Java-Client的jar包。
<!-- Memcached-Java-Client --> <dependency> <groupId>com.whalin</groupId> <artifactId>Memcached-Java-Client</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.6.4</version> </dependency>
使用Memcached-java-client操作memcached服务器。添加数据到memcached,然后检索出数据。
public static void main(String[] args) { SockIOPool pool = SockIOPool.getInstance(); //创建memcache连接池 String[] addresses = { "127.0.0.1:11211" }; //服务器地址,可以添加多个 Integer[] weights = {3}; //添加权重 pool.setServers(addresses); //服务器地址 pool.setWeights(weights); //权重信息 pool.setInitConn( 5 ); //初始连接数 pool.setMinConn( 5 ); //最小连接数 pool.setMaxConn( 250 ); //最大连接数 pool.setMaxIdle( 1000 * 60 * 60 * 6 ); //最大处理时间。 pool.setMaintSleep( 30 ); // 设置主线程的睡眠时间 pool.setNagle(false); //是否缓冲 pool.setSocketTO(3000); //Socket阻塞读取数据的超时时间 pool.setSocketConnectTO(0); //连接建立时对超时的控制 pool.initialize(); //初始化 MemCachedClient client = new MemCachedClient(); // 使用MemCacheClient client.add("SimpleWu", "lovelyWu98k@gmail.com"); // 添加 System.out.println(client.get("SimpleWu")); client.delete("hello"); // 删除 client.flushAll(); // 清空 }
java具体命令使用参考
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源