- 浏览: 730842 次
- 性别:
- 来自: 重庆
-
文章分类
- 全部博客 (113)
- 移动支付 (1)
- 系统安全 (1)
- JAVA-Team研发环境 (2)
- 配置管理 (3)
- 开发 (3)
- 页面脚本开发 (5)
- 系统脚本开发 (1)
- 数据库 (6)
- 分布式 (8)
- JAVA基础及算法 (7)
- 开发集成及部署 (4)
- activeMQ (0)
- Thrift (1)
- memcached (11)
- linux (16)
- LVS (4)
- 日志 (4)
- hadoop (7)
- tcpdump (1)
- wireshark (1)
- test (0)
- Android BaseActivity (0)
- 云存储 (1)
- HTTP (3)
- S3 (1)
- xml (2)
- 序列化 (1)
- 部署 (0)
- 系统架构 (9)
- 存储 (0)
- 设计模式 (1)
- Spring (2)
- J2EE (4)
- maven (3)
- MYSQL (2)
- LDAP (2)
- JQuery (1)
- easyui (1)
- web前端 (1)
- tomcat (1)
- nosql (2)
- 开发技巧 (1)
- JPA (1)
- hibernate (1)
- Quartz (1)
最新评论
-
xinglianxlxl:
对我有用,非常感谢
xstream初步使用 -
liangbo11:
eclipse都无法启动
JDK扩展DCEVM让WEB程序完全不重启调试 -
Love_wh1314:
果然是这个问题。。。维护别人的代码,开始还以为自己改错了,结 ...
JQuery 实践问题 - toLowerCase 错误 -
tonyyan:
谢谢分享!
MAVEN Scope使用 -
908311595:
多谢楼主分享
xstream初步使用
Memcached 支持两种主要的协议,经典的 ASCII 文本协议和新的二进制协议。文本协议非常简单,能很方便的编写客户端和调试问题,但是二进制协议提供更强大的功能。
文本协议的 TCP 协议应用比较广泛,本文主要详细介绍 TCP 文本协议。如果想了解 UDP 协议和二进制协议,请参考官方文档。
官方文本协议: http://github.com/memcached/memcached/blob/master/doc/protocol.txt
官方二进制协议: http://code.google.com/p/memcached/wiki/BinaryProtocolRevamped
协议命令格式
<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n
- <command name> : "set", "add", "replace", "append" or "prepend"
- "set" :“存储这个数据”,一般是更新已有的缓存,也可以用于新增。
- "add" :新增缓存,缓存中不存在新增的KEY。
- Replace:替换现有的缓存,缓存中一定已经存储KEY
- Append:在现有的缓存数据后添加缓存数据。
- Prepend:在现有的缓存数据前添加缓存数据
- Cas:check and set操作,存储缓存,前提是在check后没有其它人修改过数据,用于多客户端同时设置相同的KEY时的原子操作。
- <key>:缓存的KEY
- <flags>:最开始是16位的无符号整数,现在的版本一般是32位。用户客户端存储自定义标记数据。
- <exptime>:缓存过期时间。0表示永不过期,可以是Unix time或当前服务器时间的偏移量(秒为单位),如果你想设置当前时间后1分钟过期,则此参数为60。
- <bytes>:缓存数据的长度
- <cas unique>:unique 64-bit value of an existing entry,cas操作的时候回传的值,用于服务器端判断缓存是否改变。
- "noreply":服务器不响应处理结果。
- <data block>\r\n: 缓存数据块,\r\n结束
- "STORED\r\n":表示存储成功
- "NOT_STORED\r\n":表示未存储,但并不是错误。如:对已经有的KEY使用add
- "EXISTS\r\n":表示使用cas命令设置数据未成功,在你最后一次获取数据后,数据已经被其它人修改。
- "NOT_FOUND\r\n":表示使用cas存储数据时候,key不存储
错误指令
每一个由客户端发送的命令,都可能收到来自服务器的错误字串回复。这些错误字串会以三种形式出现:
ERROR\r\n
意味着客户端发送了不存在的命令名称。
"CLIENT_ERROR <error>\r\n
意味着输入的命令行里存在一些客户端错误,例如输入未遵循协议。 <error> 部分是人类易于理解的错误解说
SERVER_ERROR <error>\r\n
意味着一些服务器错误,导致命令无法执行。 <error> 部分是人类易于理解的错误解说。在一些严重的情形下(通常应该不会遇到),服务器将在发送这行错误后关闭连接。这是服务器主动关闭连接的唯一情况
add/set/replace/append/prepend
保持指令包括: add,set , Replace ,append, Prepend 。在分布式环境中,这些命令都不能保证原则性操作,需要使用 cas 对缓存进行存储操作。
Add/set/Replace/append/Prepend <key> flags <exptime> <bytes>\r\n data\r\n
add : 添加新的缓存,不能覆盖。如果添加一个存在的缓存,服务器不会执行和报错,只会返回 NOT_STORED 。
telnet localhost 11211 add key 0 0 5 12345 STORED add key 0 0 1 1 NOT_STORED
set :设置缓存,功能和 add 基本相同,可能 覆盖 。
set key 0 0 2 12 STORED
replace
: 仅当键已经存在时, replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应
replace key 0 0 3 123 STORED replace key1 0 0 3 123 NOT_STORED //key1 不存在
append :是在现有缓存数据后面新增数据。如果 key 不存在,服务器响应 NOT_STORED
get key VALUE key 0 3 123 END append key 0 0 2 45 STORED get key VALUE key 0 5 12345 END
prepend 是在现有缓存数据前面新增数据。如果 key 不存在,服务器响应 NOT_STORED
get key VALUE key 0 5 12345 prepend key 0 0 7 prepend STORED get key VALUE key 0 12 prepend12345 END prepend key1 0 0 1 1 NOT_STORED
get/gets
get <key>*\r\n // 获取缓存的值 gets <key>*\r\n // 获取缓存的值和版本号 <cas unique>
key是缓存的key,命令以\r\n结束。
返回
VALUE <key> <flags> <bytes> [<cas unique>]\r\n <data block>\r\n
<flags>是你添加和设置缓存的时候设置的值。一般用于自定义标记缓存数据的特殊意义,对memcached服务无意义,客户端自定义其含义。例如:设置缓存的时候,设置1表示该数据是对象json序列化,2表示二进制序列化。
<cas unique>:是一个64位的整数,在服务器端唯一,每次针对缓存的操作就会加一,类似于svn的版本号的东东。
例:
[root@hadoop00 bin]# telnet 192.168.221.10 11211 Trying 192.168.221.10... Connected to hadoop00 (192.168.221.10). Escape character is '^]'. add key1 0 0 12 hello first! STORED get key1 VALUE key1 0 12 hello first! END gets key1 VALUE key1 0 12 2 hello first! END set key1 1 0 13 hello second! STORED gets key1 VALUE key1 1 13 3 hello second! END
第 1 段:添加缓存 key1=hello first!,flags=0
第 2 段: get 获取缓存 key1 的值, flags=0
第 3 段: gets 获取缓存 key1 的值, flags=0 ; cas unique=2
第 4 段: set 缓存 key1 的值为 hello second! ,设置 flags=1
第 5 段: gets 获取 key1 的值, flags=1; cas unique=3
delete
delete:删除一个存在的缓存
get key VALUE key 0 12 prepend12345 END delete key DELETED get key END
incr/decr
如果缓存数据中存储的是数字形式的字符串,则可以使用 incr/decr 对数据进行递增和递减操作,服务器响应操作过的结果。操作后的值不会为负数。
格式: incr/decr key number\r\n
add key 0 0 2 10 STORED incr key 1 // 递增 1 11 decr key 2 // 递减 2 9 add key1 0 0 2 aa STORED incr key1 1 // 对非数字的缓存操作会返回错误 CLIENT_ERROR cannot increment or decrement non-numeric value
stats
命令 "stats" 被用于查询服务器的运行状态和其他内部数据。有两种格式。不带参数的:
stats\r\n
stats <args>\r\n // 具体参数据说在变动,不过也意义不打,直接用无参数就可以了。
Key |
数据类型 |
说明 |
pid |
32u |
服务器进程 ID |
uptime |
32u |
服务器运行时间,单位秒 |
time |
32u |
服务器当前的 UNIX 时间 |
version |
string |
服务器的版本号 |
pointer_size |
32u |
服务器操作系统位数 |
curr_connections |
32u |
当前连接数 |
total_connections |
32u |
服务器启动后总连接数 |
connection_structures |
32u |
服务器分配的连接结构的数量 |
cmd_get |
64u |
获取请求总数 |
cmd_set |
64u |
存储请求总数 |
cmd_flush |
64u |
|
get_hits |
64u |
获取成功的总次数,命中次数 |
get_misses |
64u |
获取失败的总次数 |
delete_misses |
64u |
删除失败次数 |
delete_hits |
64u |
删除命中 |
incr_misses |
64u |
递增失败次数 |
incr_hits |
64u |
递增命中 |
decr_misses |
64u |
递减命中 |
decr_hits |
64u |
递减失败次数 |
cas_misses |
64u |
Cas 原子设置操作失败次数 |
cas_hits |
64u |
Cas 命中 |
cas_badval |
64u |
Cas 操作找到 key, 但是版本过期,没有设置成功 |
auth_cmds |
64u |
认证次数(包括成功和失败) |
auth_errors |
64u |
认证失败次数 |
bytes_read |
64u
|
总共获取的数据量 |
bytes_written |
64u |
总写入数量数 |
limit_maxbytes |
32u |
总允许写入的数据量,和分配的内存有关 |
accepting_conns |
|
未找到文档,官方协议为说明 |
listen_disabled_num |
|
未找到文档,官方协议为说明 |
threads |
|
未找到文档,官方协议为说明 |
conn_yields |
|
未找到文档,官方协议为说明 |
bytes |
64u |
已用缓存空间 |
curr_items |
32u |
当前缓存 item 数量 |
total_items |
32u |
从服务启动后,总的存储缓存 item 数量 |
evictions |
64u |
通过删除 item 释放内存的次数 |
flush_all
“ flush_all ” 命令有一个可选的数字参数。它总是执行成功,服务器会发送 “OK\r\n” 回应。它的效果是使已经存在的项目立即失效(缺 省),或在指定的时间后。此后执行取回命令,将不会有任何内容返回(除非重新存储同样的键名)。 flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行。 flush_all 效果具体如下:它导致所有更新时间早于 flush_all 所设定时间的项目,在被执行取回命令时命令被忽略。
flush_all OK flush_all 10 OK
version
版本查询: version \r\n
version VERSION 1.4.4-14-g9c660c0
quit
CAS 协议解决这种并发修改问题。有线程试图修改当前 key-value 对的 value 时,先由 gets 方法得到 item 的版本号,操作完成提交 数据时,使用 cas 方法谨慎变更,如果在本地对 item 操作过程中这个 key-value 对在 Memcached server 端被其它线程更改过,就放弃此次修改 (乐观锁)
cas 命令只能用于修改已经有的参数,对应新增操作会返回: NOT_FOUND
add caskey 0 0 1 //添加一个缓存key=caskey 1 STORED gets caskey //获取caskey的数据和版本号 VALUE caskey 0 1 15 //15是当前版本号 1 END set caskey 0 0 26 //模拟其它线程修改了caskey的值 anther thread modify value STORED cas caskey 0 0 1 15 //当前线程通过版本号15设置数据失败 2 EXISTS
发表评论
-
Memcached学习笔记
2011-07-10 02:04 2813公司很多项目都会使用缓存,而且都是在分布式环境中使用,比较全面 ... -
Memcached学习笔记 — 第六部分-Memcached缓存模型
2011-07-10 01:51 2130缓存机制: Slab Allocation ... -
Memcached学习笔记 — 第五部分-Memcached分布式实现
2011-07-10 01:43 8607memcached 虽然称为 “ 分布式 ” ... -
Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(5)-主要API解析
2011-07-10 01:38 4583找了很久都找不到官 ... -
Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(4)-版本差异
2011-07-09 22:38 5046Memcached Java Client 版本差异 ... -
Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(3)-Spring整合
2011-07-09 22:22 5074Memcached Java Client Spring ... -
Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(2)-性能测试
2011-07-09 22:03 3034Memcached JJAVA Client 性能测试 ... -
Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(1)-介绍及使用
2011-07-09 03:28 10389介绍 Memcached java client ... -
Memcached学习笔记 — 第二部分:Memcached服务器安装
2011-07-09 02:17 7124Windows版本安装 windows 上安装 ... -
Memcached学习笔记 — 第一部分:Memcached基础
2011-07-09 02:07 3009本文是基于网上资料和自己的理解整理的学习笔记, ...
相关推荐
【PHP Memcached缓存技术详解】 在Web开发中,数据缓存是一种常用的技术手段,用于提升网站性能,减少数据库负载。PHP Memcached扩展是PHP与Memcached缓存服务器交互的一个接口,它允许开发者将数据存储在内存中,...
**Memcached教程详解** Memcached是一款高性能、分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升网站性能。它通过将数据缓存在内存中,避免了反复读取数据库,从而显著提高了数据访问速度。在本教程...
### Redis 学习笔记知识点概览 #### 一、Redis 简介及特性 - **Redis**(Remote Dictionary Server)是一种开源的、基于内存的数据结构存储系统,它支持多种数据结构,如字符串(strings)、散列(hashes)、列表...
### MySQL开发学习笔记知识点梳理 #### 一、基础知识概述 - **数据库定义**: 数据库(database)是用于存储数据的仓库,它可以高效地存储和处理数据。主要存储介质有两种:磁盘和内存(RAM)。 - **数据库分类**: - *...
这份"Java生产环境下性能监控与调优详解课程笔记(完整版)"涵盖了多个重要的知识点,旨在帮助开发者和运维人员提升Java应用的性能。 一、Java性能监控工具 1. JVisualVM:集成在JDK中的一个多用途工具,可以进行...
### MySQL数据库学习笔记知识点概述 #### 一、数据库分类及关系型数据库介绍 - **数据库类型**:数据库根据规模和用途可分为大型、中型和小型数据库。此外还有非关系型数据库。 - **大型数据库**:如Oracle和DB2...
### Redis学习笔记整理 #### 一、Redis环境搭建 ##### 1.1 简介 Redis是一款开源的键值(Key-Value)型数据库系统,因其高性能和丰富的数据结构而广受欢迎。它不仅可以作为数据库使用,还可以作为一种数据结构服务器...
这份学习笔记涵盖了多个关键领域,包括亿级流量网站的架构设计、微服务架构、代码重构和设计模式等,这些都是现代软件开发的核心技术。 首先,亿级流量网站架构核心技术.pdf 提到了如何处理大规模用户访问的问题。...
全局静态化是对整个网站进行静态化,而局部静态化只针对部分页面。 实现页面静态化的方法多样。PHP自带的输出缓冲区(OB,Output Buffering)机制是一个常用手段。通过开启OB,所有的输出会被暂时保存,直到程序...
这部分可能涉及内存缓存(如Redis或Memcached)的使用,以及缓存策略(如LRU、LFU等)和缓存失效策略的讨论。 3. **分布式部署**: - 分布式部署是大型电商网站不可或缺的一部分,因为它可以提供高可用性和水平...
MediaWiki配置过程详解 MediaWiki是一款强大的开源Wiki引擎,被广泛应用在各种知识库和文档管理系统中,如知名的维基百科。它的灵活性和可扩展性使其成为搭建社区协作平台的理想选择。下面我们将详细介绍MediaWiki...
【描述】虽然描述信息较为简略,但可以推测该压缩包可能包含两部分教程或笔记,即"Spring Boot快速集成第三方技术详解(1).vep"和"Spring Boot快速集成第三方技术详解(2).vep"。这两份文件很可能提供了详细的步骤...
【MySQL学习笔记基础阶段】 1. **什么是数据库** 数据库是用于高效存储和处理数据的介质,主要分为磁盘和内存。在计算机科学中,数据库是按照数据结构来组织、存储和管理数据的仓库。 2. **数据库的分类** ...
《PHP课外学习资料详解》 PHP(Hypertext Preprocessor,超文本预处理器)是一种广泛应用于Web开发的开源脚本语言,尤其擅长于服务器端的编程。PHP以其易学易用、灵活性高以及与MySQL数据库的完美结合而受到开发者...
其中包括了Javanosql讲解、阿里巴巴架构演进、nosql数据模型、Nosql四大分类(CAP、BASE)、Redis入门五大基本数据类型(String、List、Set、Hash、Zset)、三种特殊数据类型(geohash、hyperloglog、bitmap)、...
【笔记管理工具“notes”详解】 在数字时代,有效地管理和组织个人或团队的笔记变得越来越重要。"notes"可能指的是一个开源或者自定义的笔记应用,用于存储、分类和检索各种信息。在这个“notes-master”压缩包中,...