w3cschool-memcached教程
https://www.w3cschool.cn/memcached/
Memcached 教程
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

手册简介
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
手册说明
Memcached是什么?
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
Memcached有什么特征?
memcached作为高速运行的分布式缓存服务器,具有以下的特点。
· 协议简单
· 基于libevent的事件处理
· 内置内存存储方式
· memcached不互相通信的分布式
协议
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。
因此,通过telnet也能在memcached上保存数据、取得数据。下面是例子。
$ telnet localhost 11211
Trying 127.0.0.1
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)
事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。关于事件处理这里就不再详细介绍,可以参考Dan Kegel的The C10K Problem。
存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
通信分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。本文也将介绍memcached的分布式。
Memcached set 命令
Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
语法:
set 命令的基本语法格式如下:
set key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
以下实例中我们设置:
- key → w3cschool
- flag → 0
- exptime → 900 (以秒为单位)
- bytes → 9 (数据存储的字节数)
- value → memcached
set w3cschool 0 900 9
memcached
STORED get w3cschool
VALUE w3cschool 0 9
memcached END
输出
如果数据设置成功,则输出:
STORED
输出信息说明:
- STORED:保存成功后输出。
- ERROR:在保持失败后输出。
Memcached add 命令
Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果 add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
语法:
add 命令的基本语法格式如下:
add key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
以下实例中我们设置:
- key → new_key
- flag → 0
- exptime → 900 (以秒为单位)
- bytes → 10 (数据存储的字节数)
- value → data_value
add new_key 0 900 10
data_value
STORED
get new_key
VALUE new_key 0 10
data_value
END
输出
如果数据添加成功,则输出:
STORED
输出信息说明:
- STORED:保存成功后输出。
- NOT_STORED :在保持失败后输出。
Memcached replace 命令
Memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。
语法:
replace 命令的基本语法格式如下:
replace key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
以下实例中我们设置:
- key → mykey
- flag → 0
- exptime → 900 (以秒为单位)
- bytes → 10 (数据存储的字节数)
- value → data_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
输出信息说明:
- STORED:保存成功后输出。
- NOT_STORED:执行替换失败后输出。
Memcached append 命令
Memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。
语法:
append 命令的基本语法格式如下:
append key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
实例如下:
- 首先我们在 Memcached 中存储一个键 w3cschool,其值为 memcached。
- 然后,我们使用 get 命令检索该值。
- 然后,我们使用 append 命令在键为 w3cschool 的值后面追加 "redis"。
- 最后,我们再使用 get 命令检索该值。
set w3cschool 0 900 9
memcached
STORED
get w3cschool
VALUE w3cschool 0 14
memcached
END
append w3cschool 0 900 5
redis
STORED
get w3cschool
VALUE w3cschool 0 14
memcachedredis
END
输出
如果数据添加成功,则输出:
STORED
输出信息说明:
- STORED:保存成功后输出。
- NOT_STORED:该键在 Memcached 上不存在。
- CLIENT_ERROR:执行错误。
Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
语法:
prepend 命令的基本语法格式如下:
prepend key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
实例如下:
- 首先我们在 Memcached 中存储一个键 w3cschool,其值为 memcached。
- 然后,我们使用 get 命令检索该值。
- 然后,我们使用 prepend 命令在键为 w3cschool 的值后面追加 "redis"。
- 最后,我们再使用 get 命令检索该值。
set w3cschool 0 900 9
memcached
STORED
get w3cschool
VALUE w3cschool 0 14
memcached
END
prepend w3cschool 0 900 5
redis
STORED
get w3cschool
VALUE w3cschool 0 14
redismemcached
END
输出
如果数据添加成功,则输出:
STORED
输出信息说明:
- STORED:保存成功后输出。
- NOT_STORED:该键在 Memcached 上不存在。
- CLIENT_ERROR:执行错误。
Memcached CAS 命令
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作
它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。
语法:
CAS 命令的基本语法格式如下:
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)
实例
要在 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
输出信息说明:
- STORED:保存成功后输出。
- ERROR:保存出错或语法错误。
- EXISTS:在最后一次取值后另外一个用户也在更新该数据。
- NOT_FOUND:Memcached 服务上不存在该键值。
Memcached get 命令
Memcached get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
语法:
get 命令的基本语法格式如下:
get key
多个 key 使用空格隔开,如下:
get key1 key2 key3
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
实例
在以下实例中,我们使用 w3cschool 作为 key,过期时间设置为 900 秒。
set w3cschool 0 900 9
memcached
STORED
get w3cschool
VALUE w3cschool 0 9
memcached
END
Memcached gets 命令
Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。
语法:
gets 命令的基本语法格式如下:
gets key
多个 key 使用空格隔开,如下:
gets key1 key2 key3
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
实例
在以下实例中,我们使用 w3cschool 作为 key,过期时间设置为 900 秒。
set w3cschool 0 900 9
memcached
STORED
gets w3cschool
VALUE w3cschool 0 9 1
memcached
END
Memcached delete 命令
Memcached delete 命令用于删除已存在的 key(键)。
语法:
delete 命令的基本语法格式如下:
delete key [noreply]
多个 key 使用空格隔开,如下:
delete key1 key2 key3
Memcached incr 与 decr 命令
Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。
incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。
如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。
incr 命令
语法:
incr 命令的基本语法格式如下:
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
Memcached stats 命令
Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。
语法:
stats 命令的基本语法格式如下:
stats
实例
在以下实例中,我们使用了 stats 命令来输出 Memcached 服务信息。
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:已过期的数据条目来存储新数据的数目
Memcached stats items 命令
Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。
语法:
stats items 命令的基本语法格式如下:
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 stats slabs 命令
Memcached stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等。
语法:
stats slabs 命令的基本语法格式如下:
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
Memcached stats sizes 命令
Memcached stats sizes 命令用于显示所有item的大小和个数。
该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。
语法:
stats sizes 命令的基本语法格式如下:
stats sizes
实例
stats sizes
STAT 96 1
END
Memcached flush_all 命令
Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对。
该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。
语法:
flush_all 命令的基本语法格式如下:
flush_all [time] [noreply]
实例
清理缓存:
set w3cschool 0 900 9
memcached
STORED
get w3cschool
VALUE w3cschool 0 9
memcached
END
flush_all
OK
get w3cschool
END
Java 连接 Memcached 服务
使用 Java 程序连接 Memcached,需要在你的 classpath 中添加 Memcached jar 包。
以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。
连接实例
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("w3cschool", 900, "Free Education"); // 查看存储状态
System.out.println("set status:" + fo.get()); // 输出值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 关闭连接
mcc.shutdown(); }catch(Exception ex){
System.out.println( ex.getMessage() );
}
}
}
执行程序,输出结果为:
Connection to server successful.
set status:true
W3Cschool value in cache - Free Education
add 操作实例
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("w3cschool", 900, "Free Education"); // 打印状态
System.out.println("set status:" + fo.get()); // 输出
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 添加
Future fo = mcc.add("w3cschool", 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("w3cschool", 900, "Free Education"); // 输出执行 add 方法后的状态
System.out.println("add status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 添加新的 key
fo = mcc.replace("w3cschool", 900, "Largest Tutorials' Library"); // 输出执行 set 方法后的状态
System.out.println("replace status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 关闭连接
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("w3cschool", 900, "Free Education"); // 输出执行 set 方法后的状态
System.out.println("set status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 对存在的key进行数据添加操作
Future fo = mcc.append("w3cschool", 900, " for All"); // 输出执行 set 方法后的状态
System.out.println("append status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool 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("w3cschool", 900, "Education for All"); // 输出执行 set 方法后的状态
System.out.println("set status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 对存在的key进行数据添加操作
Future fo = mcc.prepend("w3cschool", 900, "Free "); // 输出执行 set 方法后的状态
System.out.println("prepend status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool 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("w3cschool", 900, "Free Education"); // 输出执行 set 方法后的状态
System.out.println("set status:" + fo.get()); // 使用 get 方法获取数据
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 通过 gets 方法获取 CAS token(令牌)
CASValue casValue = mcc.gets("w3cschool"); // 输出 CAS token(令牌) 值
System.out.println("CAS token - " + casValue); // 尝试使用cas方法来更新数据
CASResponse casresp = mcc.cas("w3cschool", casValue.getCas(), 900, "Largest Tutorials-Library"); // 输出 CAS 响应信息
System.out.println("CAS Response - " + casresp); // 输出值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 关闭连接
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("w3cschool", 900, "Free Education"); // 输出执行 set 方法后的状态
System.out.println("set status:" + fo.get()); // 使用 get 方法获取数据
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 关闭连接
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("w3cschool", 900, "Free Education"); // 输出执行 set 方法后的状态
System.out.println("set status:" + fo.get()); // 从缓存中获取键为 W3Cschool 的值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 通过 gets 方法获取 CAS token(令牌)
CASValue casValue = mcc.gets("w3cschool"); // 输出 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("w3cschool", 900, "World's largest online tutorials library"); // 输出执行 set 方法后的状态
System.out.println("set status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool value in cache - " + mcc.get("w3cschool")); // 对存在的key进行数据添加操作
Future fo = mcc.delete("w3cschool"); // 输出执行 delete 方法后的状态
System.out.println("delete status:" + fo.get()); // 获取键对应的值
System.out.println("w3cschool 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());
}
}
w3cschool-memcached教程的更多相关文章
- JavaScript 实例 | w3cschool菜鸟教程
JavaScript 实例 | w3cschool菜鸟教程 http://www.w3cschool.cc/js/js-examples.html
- w3cschool菜鸟教程离线版chm手册正式发布
w3cschool菜鸟教程是一个提供了最全的的web技术基础教程网站.网站包含了HTML教程.CSS教程.Javascript教程.PHP教程等各种建站基础教程.同时也提供了大量的在线实例,通过实例, ...
- w3cschool在线教程
做网页开发的,没有不知道w3cschool的,如果你还不知道,那么就应该早点看下面推荐的文章,菜鸟可以帮你提升你的技能,老鸟可以温故而知新. 第一个是:http://www.w3school.com. ...
- W3School Memcached教程(安装/基本操作/高级操作/命令)
来自W3School的Memcached教程,基本上涵盖了从安装到状态监控的教程. 不过最全的应该是官方提供在GitHub上的Wiki教程,一切的标准都来自官方,参考:https://github.c ...
- W3Cschool菜鸟教程离线版下载链接
请在电脑上打开以下链接进行下载w3cschool 离线版(chm):http://pan.baidu.com/s/1bniwRCV(最新,2014年10月21日更新)w3cschool 离线版(htm ...
- 后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记
Memcached的知识点大致可以分为三个部分. 服务器部分:环境搭建. 概念:存储的数据类型,指令,内存的替换策略. 集成:与Java语言的集成. 1.搭建环境 1.1 Linux环境 在Linux ...
- 4.windows环境下如何安装memcached教程(转载+自己整理)
Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached.百度经验:jingyan. ...
- Memcached 教程
http://www.runoob.com/memcached/memcached-tutorial.html
- windows环境下如何安装memcached教程
Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached. 工具/原料 memcach ...
- HTML5 Canvas | w3cschool菜鸟教程
HTML5 Canvas <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形.. 在画布上(Canvas)画一个红色矩形,梯度矩形,彩色矩形,和一些彩色的文字. ...
随机推荐
- 在美国和以色列的技术支持下BP机可以爆炸,那么苹果手机是否也可以被远程引爆
要知道,这一切在技术上都是可以实现的. 由此可见,带电池的产品,最为稳妥的办法就是购买在中国组装的产品,否则其安全性是无法保证的.有人可能会说美国政府不会单独的通过这种方法去定向的杀害某个中国普通人, ...
- 《JVM第9课》垃圾回收器
先来看一张图,串行代表两个垃圾回收器按顺序执行,并行代表同时执行.STW代表工作线程暂停,Stop The World的意思. 垃圾回收器 执行顺序 执行方式 作用区域 使用算法 说明 Serial ...
- Spring AI 再更新:如何借助全局参数实现智能数据库操作与个性化待办管理
引言 好的,今天我们继续聊一下Spring AI的相关内容.在10月的时候,我使用Spring AI搭建了一个简易版的个人助理系统,整体来说效果还是非常不错的.通过这次尝试,我对业务系统与AI结合的探 ...
- pyenv-win-master\pyenv-win\libexec\pyenv-install.vbs(161, 5) Microsoft VBScript 运行时错误: 文件未找到
Windows 10 运行 pyenv install 3.11.2 提示 pyenv-win-master\pyenv-win\libexec\pyenv-install.vbs(161, 5) M ...
- Python如何获取request response body
在Python中,我们可以使用多个库来发送HTTP请求并获取响应体(response body).其中,最常用的库之一是 requests.这个库提供了简单易用的接口来发送HTTP请求,并可以方便地获 ...
- P5524 Ynoi2012 NOIP2015 充满了希望
P5524 Ynoi2012 NOIP2015 充满了希望 数组开大见祖宗. 思路 不难发现只有询问才会产生贡献,而询问的值来自于距离它最近的且能覆盖这个询问的点的覆盖操作. 可以每个询问操作保存一个 ...
- 纯HTML5+CSS3实现一棵自己跳舞的树
代码没有多少,也没有用到任何图片,就实现了一棵可以自己跳舞的树.文件组成就简简单单的一个html和一个css html部分并不是很复杂,就是一些空的div,然后加上html模板也就那么十来行代码 最关 ...
- MPLS多协议标签交换
多协议标签交换 MPLS(Multiprotocol Label Switching)是一种网络协议,用于在数据包交换网络中高效地进行数据路由转发.MPLS通过引入标签(Label)来对数据包进行标识 ...
- Elasticsearch之基本使用
这里大概解答下各个目录.配置文件的作用: 目录 配置文件 描述 bin 放置脚本文件,如启动脚本 elasticsearch, 插件安装脚本等. config elasticserch.yml e ...
- 【实战问题】-- 并发的时候分布式锁setnx细节
前面讲解到实战问题]-- 设计礼品领取的架构设计以及多次领取现象解决?,如果出现网络延迟的情况下,多个请求阻塞,那么恶意攻击就可以全部请求领取接口成功,而针对这种做法,我们使用setnx来解决,确保只 ...