标签:except libev 缓存机制 cas 网站 规模 soc list 键值对
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(); // 清空
}
那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源
标签:except libev 缓存机制 cas 网站 规模 soc list 键值对
原文地址:https://www.cnblogs.com/SimpleWu/p/9987991.html