summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authordormando <dormando@rydia.net>2022-08-25 14:27:48 -0700
committerdormando <dormando@rydia.net>2022-08-25 14:27:48 -0700
commit0fd38f9986795f41fe7b8a4191789c52db953da0 (patch)
tree1ea2720021917dfa52ddd02fafbce61b76eb5b2a /doc
parentcfe751ef9fa05b19ec70d4314718d1b3df23f38c (diff)
downloadmemcached-0fd38f9986795f41fe7b8a4191789c52db953da0.tar.gz
docs: don't rebuild binprot XML anymore
xml2rfc's toolchain has bitrotted and I don't intend on changing the binary protocol documentation anymore. Instead I've included the .txt files from 1.6.16 and commented out the build docs. Even if I adjust the call args for xml2rfc it complains about the copyright being old and I don't want to think about that :(
Diffstat (limited to 'doc')
-rw-r--r--doc/Makefile.am30
-rw-r--r--doc/protocol-binary-range.txt280
-rw-r--r--doc/protocol-binary.full1498
-rw-r--r--doc/protocol-binary.txt1736
4 files changed, 3529 insertions, 15 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 3539fc8..5359daa 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -10,24 +10,24 @@ EXTRA_DIST += $(SPECIFICATIONS)
BUILT_SOURCES =
MOSTLYCLEANFILES =
-if BUILD_SPECIFICATIONS
-BUILT_SOURCES += $(SPECIFICATIONS)
-MOSTLYCLEANFILES += $(SPECIFICATIONS)
-endif
+#if BUILD_SPECIFICATIONS
+#BUILT_SOURCES += $(SPECIFICATIONS)
+#MOSTLYCLEANFILES += $(SPECIFICATIONS)
+#endif
-RFC2629_XSL = $(srcdir)/xml2rfc/rfc2629-noinc.xsl
-RFC2629_DTD = $(srcdir)/xml2rfc/rfc2629.dtd
+#RFC2629_XSL = $(srcdir)/xml2rfc/rfc2629-noinc.xsl
+#RFC2629_DTD = $(srcdir)/xml2rfc/rfc2629.dtd
-%.txt: %.full $(RFC2629_DTD)
- @XML2RFC@ -d $(RFC2629_DTD) -c $(builddir) $< $@
-
-%.full: %.xml $(RFC2629_XSL)
- @XSLTPROC@ --nonet $(RFC2629_XSL) $< > $@
+#%.txt: %.full $(RFC2629_DTD)
+# @XML2RFC@ -d $(RFC2629_DTD) -c $(builddir) $< $@
+#
+#%.full: %.xml $(RFC2629_XSL)
+# @XSLTPROC@ --nonet $(RFC2629_XSL) $< > $@
# Prevent make from deleting intermediate files
-all-full: $(SPECIFICATIONS:.txt=.full)
+#all-full: $(SPECIFICATIONS:.txt=.full)
-clean-local:
- rm -f $(SPECIFICATIONS:.txt=.full)
+#clean-local:
+# rm -f $(SPECIFICATIONS:.txt=.full)
-.PHONY: all-full
+#.PHONY: all-full
diff --git a/doc/protocol-binary-range.txt b/doc/protocol-binary-range.txt
new file mode 100644
index 0000000..53f52a1
--- /dev/null
+++ b/doc/protocol-binary-range.txt
@@ -0,0 +1,280 @@
+
+
+
+
+Network Working Group Aaron Stone, Ed.
+Internet-Draft Six Apart, Ltd.
+Intended status: Informational December 14, 2007
+Expires: June 16, 2008
+
+
+ Memcache Binary Protocol: Extensions for UDP
+ draft-stone-memcache-udp-01
+
+Abstract
+
+ This memo explains extensions to the memcache binary protocol for use
+ in a UDP environment.
+
+ Memcache is a high performance key-value cache. It is intentionally
+ a dumb cache, optimized for speed only. Applications using memcache
+ do not rely on it for data -- a persistent database with guaranteed
+ reliability is strongly recommended -- but applications can run much
+ faster when cached data is available in memcache.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on June 16, 2008.
+
+Copyright Notice
+
+ Copyright (c) 2007 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+
+
+
+Aaron Stone Expires June 16, 2008 [Page 1]
+
+Internet-Draft Memcache Over UDP December 2007
+
+
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 1.1. Conventions Used In This Document . . . . . . . . . . . . 2
+ 2. Defined Values . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2.1. Magic Byte . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2.2. Response Status . . . . . . . . . . . . . . . . . . . . . 3
+ 2.3. Command Opcodes . . . . . . . . . . . . . . . . . . . . . 3
+ 2.4. Data Types . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. Commands . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.1. Get Response . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.2. Get Range Request . . . . . . . . . . . . . . . . . . . . 4
+ 3.3. Get Range Response . . . . . . . . . . . . . . . . . . . 4
+ 4. Security Considerations . . . . . . . . . . . . . . . . . . . 5
+ 5. Normative References . . . . . . . . . . . . . . . . . . . . 5
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 5
+
+1. Introduction
+
+ Memcache is a high performance key-value cache. It is intentionally
+ a dumb cache, optimized for speed only. Applications using memcache
+ do not rely on it for data -- a persistent database with guaranteed
+ reliability is strongly recommended -- but applications can run much
+ faster when cached data is available in memcache.
+
+ Sites may find that, due to their network architecture or application
+ usage patterns, the stateless [UDP] protocol better suits their
+ needs. This document provides extensions and descriptions of use of
+ the memcache protocol [MEMCACHE] in a UDP environment.
+
+ It is a goal of this document to provide sufficient information in
+ each UDP packet as to avoid any requirement for statefulness on the
+ part of the server nor significant caching of outstanding packets on
+ the part of the client.
+
+1.1. Conventions Used In This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [KEYWORDS].
+
+
+
+
+
+
+
+Aaron Stone Expires June 16, 2008 [Page 2]
+
+Internet-Draft Memcache Over UDP December 2007
+
+
+2. Defined Values
+
+2.1. Magic Byte
+
+ The magic bytes remains the same as in [MEMCACHE].
+
+2.2. Response Status
+
+ Additional status values:
+
+ 0x0004 Value is larger than a single response packet
+
+2.3. Command Opcodes
+
+ Additional opcode values:
+
+ 0x0C Get Range
+ 0x0D Set Range
+
+2.4. Data Types
+
+ There are no new data types in this extension.
+
+3. Commands
+
+3.1. Get Response
+
+ This section extends the behavior of the Get and GetQ commands as
+ described in [MEMCACHE].
+
+ When a Get or GetQ request is made via UDP, and the value of the key
+ for which the request was made is larger than can be placed into a
+ single UDP packet (noting that the protocol header must also be
+ counted), a Get Range response packet MUST be sent instead of the Get
+ response packet. In this instance:
+
+ 1. The Status field of the response header MUST be 0x0004.
+ 2. The Offset field of the GetR response extras MUST be 0.
+ 3. The Length field of the GetR response extras, and the data
+ contained in the Value field of the packet, SHOULD be the maximum
+ allowed length of a UDP packet, less the space required by the
+ header and extras; however it MAY be any amount below this
+ maximum.
+ 4. The Total value length field of the response extras MUST be the
+ actual length of the complete value.
+
+ The client, upon receipt of a Get Range response bearing Status 0x004
+ and a Message ID corresponding to its Get request, shall then know
+
+
+
+Aaron Stone Expires June 16, 2008 [Page 3]
+
+Internet-Draft Memcache Over UDP December 2007
+
+
+ that it has received only the first portion of the value. The client
+ MAY choose to request the remaining portion of the value by sending
+ one or more Get Range requests.
+
+3.2. Get Range Request
+
+ The Get Range request is primarily intended for use over a UDP
+ transport to request byte ranges of the value for a key. In the
+ event that the Data version check fails to match that of the key, an
+ error MUST be returned.
+
+ Extra data for get range request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Flags |
+ +---------------+---------------+---------------+---------------+
+ 4| Data version check |
+ | |
+ +---------------+---------------+---------------+---------------+
+ 12| Offset |
+ +---------------+---------------+---------------+---------------+
+ 16| Length |
+ +---------------+---------------+---------------+---------------+
+ Total 20 bytes
+
+3.3. Get Range Response
+
+ The Get Range request is primarily intended for use over a UDP
+ transport to indicate the location of the bytes of the value for a
+ key contained in a given packet. A client receives enough
+ information in each Get Range extras to construct an appropriately
+ sized buffer in its own memory and blindly insert the contents of the
+ packet at the given byte offset.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Aaron Stone Expires June 16, 2008 [Page 4]
+
+Internet-Draft Memcache Over UDP December 2007
+
+
+ Extra data for get range response:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Flags |
+ +---------------+---------------+---------------+---------------+
+ 4| Data version check |
+ | |
+ +---------------+---------------+---------------+---------------+
+ 12| Offset |
+ +---------------+---------------+---------------+---------------+
+ 16| Length |
+ +---------------+---------------+---------------+---------------+
+ 20| Total value length |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+4. Security Considerations
+
+ This document does not introduce any new security considerations
+ beyond those discussed in [MEMCACHE].
+
+5. Normative References
+
+ [KEYWORDS]
+ Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [MEMCACHE]
+ Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [UDP] Postel, J., "User Datagram Protocol", STD 6, RFC 768,
+ August 1980.
+
+Author's Address
+
+ Aaron Stone (editor)
+ Six Apart, Ltd.
+ 548 4th Street
+ San Francisco, CA 94107
+ USA
+
+ Email: aaron@serendipity.palo-alto.ca.us
+
+
+
+
+
+Aaron Stone Expires June 16, 2008 [Page 5]
diff --git a/doc/protocol-binary.full b/doc/protocol-binary.full
new file mode 100644
index 0000000..7e8c017
--- /dev/null
+++ b/doc/protocol-binary.full
@@ -0,0 +1,1498 @@
+<?xml version="1.0"?>
+<?rfc toc="yes"?><?rfc strict="yes"?><?rfc symrefs="yes"?><?rfc sortrefs="yes" ?><?rfc compact="yes" ?><?rfc subcompact="yes" ?><rfc category="info" docName="draft-stone-memcache-binary-01" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en">
+ <front>
+ <title> Memcache Binary Protocol </title>
+
+ <author fullname="Aaron Stone" surname="Stone" role="editor">
+ <organization>Six Apart, Ltd.</organization>
+ <address>
+ <postal>
+ <street>548 4th Street</street>
+ <city>San Francisco</city>
+ <region>CA</region>
+ <code>94107</code>
+ <country>USA</country>
+ </postal>
+ <email>aaron@serendipity.palo-alto.ca.us</email>
+ </address>
+ </author>
+ <author fullname="Trond Norbye" surname="Norbye" role="editor">
+ <organization>Sun Microsystems, INC</organization>
+ <address>
+ <postal>
+ <street>Haakon VII g. 7B</street>
+ <city>Trondheim</city>
+ <code>NO-7485 Trondheim</code>
+ <country>Norway</country>
+ </postal>
+ <email>trond.norbye@sun.com</email>
+ </address>
+ </author>
+ <date day="28" month="August" year="2008"/>
+ <area>Applications</area>
+ <keyword>memcache memcached cache</keyword>
+ <abstract>
+ <t>
+ This memo explains the memcache binary protocol for informational
+ purposes.
+ </t>
+ <t>
+ Memcache is a high performance key-value cache. It is intentionally a
+ dumb cache, optimized for speed only. Applications using memcache do
+ not rely on it for data -- a persistent database with guaranteed
+ reliability is strongly recommended -- but applications can run much
+ faster when cached data is available in memcache.
+ </t>
+ </abstract>
+ </front>
+
+ <middle>
+ <section anchor="introduction" title="Introduction" toc="default">
+ <t>
+ Memcache is a high performance key-value cache. It is intentionally a
+ dumb cache, optimized for speed only. Applications using memcache should
+ not rely on it for data -- a persistent database with guaranteed
+ reliability is strongly recommended -- but applications can run much
+ faster when cached data is available in memcache.
+ </t>
+ <t>
+ Memcache was originally written to make
+ <xref target="LJ">LiveJournal</xref> faster. It now powers all of
+ the fastest web sites that you love.
+ </t>
+ <section anchor="conventions" title="Conventions Used In This Document" toc="default">
+ <t>
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in
+ <xref target="KEYWORDS"/>.
+ </t>
+ </section>
+ </section>
+
+ <section anchor="packet" title="Packet Structure" toc="default">
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>General format of a packet:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0/ HEADER /
+ / /
+ / /
+ / /
+ +---------------+---------------+---------------+---------------+
+ 24/ COMMAND-SPECIFIC EXTRAS (as needed) /
+ +/ (note length in the extras length header field) /
+ +---------------+---------------+---------------+---------------+
+ m/ Key (as needed) /
+ +/ (note length in key length header field) /
+ +---------------+---------------+---------------+---------------+
+ n/ Value (as needed) /
+ +/ (note length is total body length header field, minus /
+ +/ sum of the extras and key length body fields) /
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+ </artwork>
+ </figure>
+
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Request header:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Magic | Opcode | Key length |
+ +---------------+---------------+---------------+---------------+
+ 4| Extras length | Data type | Reserved |
+ +---------------+---------------+---------------+---------------+
+ 8| Total body length |
+ +---------------+---------------+---------------+---------------+
+ 12| Opaque |
+ +---------------+---------------+---------------+---------------+
+ 16| CAS |
+ | |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+ </artwork>
+ </figure>
+
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Response header:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Magic | Opcode | Key Length |
+ +---------------+---------------+---------------+---------------+
+ 4| Extras length | Data type | Status |
+ +---------------+---------------+---------------+---------------+
+ 8| Total body length |
+ +---------------+---------------+---------------+---------------+
+ 12| Opaque |
+ +---------------+---------------+---------------+---------------+
+ 16| CAS |
+ | |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+ </artwork>
+ </figure>
+
+ <t>
+ Header fields:
+ <list hangIndent="20" style="hanging">
+ <t hangText="Magic">Magic number.</t>
+ <t hangText="Opcode">Command code.</t>
+ <t hangText="Key length">Length in bytes of the text key that follows the command extras.</t>
+ <t hangText="Status">Status of the response (non-zero on error).</t>
+ <t hangText="Extras length">Length in bytes of the command extras.</t>
+ <t hangText="Data type">Reserved for future use (Sean is using this soon).</t>
+ <t hangText="Reserved">Really reserved for future use (up for grabs).</t>
+ <t hangText="Total body length">Length in bytes of extra + key + value.</t>
+ <t hangText="Opaque">Will be copied back to you in the response.</t>
+ <t hangText="CAS">Data version check.</t>
+ </list>
+ </t>
+ </section>
+
+ <section anchor="values" title="Defined Values" toc="default">
+ <section anchor="value-magic" title="Magic Byte" toc="default">
+ <t>
+ <list hangIndent="8" style="hanging">
+ <t hangText="0x80">Request packet for this protocol version</t>
+ <t hangText="0x81">Response packet for this protocol version</t>
+ </list>
+ </t>
+
+ <t>
+ Magic byte / version. For each version of the protocol, we'll use a
+ different request/response value pair. This is useful for protocol
+ analyzers to distinguish the nature of the packet from the direction
+ which it is moving. Note, it is common to run a memcached instance on
+ a host that also runs an application server. Such a host will both
+ send and receive memcache packets.
+ </t>
+
+ <t>
+ The version should hopefully correspond only to different meanings of
+ the command byte. In an ideal world, we will not change the header
+ format. As reserved bytes are given defined meaning, the protocol
+ version / magic byte values should be incremented.
+ </t>
+
+ <t>
+ Traffic analysis tools are encouraged to identify memcache packets
+ and provide detailed interpretation if the magic bytes are recognized
+ and otherwise to provide a generic breakdown of the packet. Note, that
+ the key and value positions can always be identified even if the magic
+ byte or command opcode are not recognized.
+ </t>
+ </section>
+
+ <section anchor="value-status" title="Response Status" toc="default">
+ <t>
+ Possible values of this two-byte field:
+ <list hangIndent="8" style="hanging">
+ <t hangText="0x0000">No error</t>
+ <t hangText="0x0001">Key not found</t>
+ <t hangText="0x0002">Key exists</t>
+ <t hangText="0x0003">Value too large</t>
+ <t hangText="0x0004">Invalid arguments</t>
+ <t hangText="0x0005">Item not stored</t>
+ <t hangText="0x0006">Incr/Decr on non-numeric value.</t>
+ <t hangText="0x0081">Unknown command</t>
+ <t hangText="0x0082">Out of memory</t>
+ </list>
+ </t>
+ </section>
+
+ <section anchor="value-opcodes" title="Command Opcodes" toc="default">
+ <t>
+ Possible values of the one-byte field:
+ <list hangIndent="8" style="hanging">
+ <t hangText="0x00">Get</t>
+ <t hangText="0x01">Set</t>
+ <t hangText="0x02">Add</t>
+ <t hangText="0x03">Replace</t>
+ <t hangText="0x04">Delete</t>
+ <t hangText="0x05">Increment</t>
+ <t hangText="0x06">Decrement</t>
+ <t hangText="0x07">Quit</t>
+ <t hangText="0x08">Flush</t>
+ <t hangText="0x09">GetQ</t>
+ <t hangText="0x0A">No-op</t>
+ <t hangText="0x0B">Version</t>
+ <t hangText="0x0C">GetK</t>
+ <t hangText="0x0D">GetKQ</t>
+ <t hangText="0x0E">Append</t>
+ <t hangText="0x0F">Prepend</t>
+ <t hangText="0x10">Stat</t>
+ <t hangText="0x11">SetQ</t>
+ <t hangText="0x12">AddQ</t>
+ <t hangText="0x13">ReplaceQ</t>
+ <t hangText="0x14">DeleteQ</t>
+ <t hangText="0x15">IncrementQ</t>
+ <t hangText="0x16">DecrementQ</t>
+ <t hangText="0x17">QuitQ</t>
+ <t hangText="0x18">FlushQ</t>
+ <t hangText="0x19">AppendQ</t>
+ <t hangText="0x1A">PrependQ</t>
+ </list>
+ </t>
+ <t>
+ As a convention all of the commands ending with "Q" for
+ Quiet. A quiet version of a command will omit responses
+ that are considered uninteresting. Whether a given response
+ is interesting is dependent upon the command. See the
+ descriptions of the
+ <xref target="command-get">set commands</xref>
+ and <xref target="command-set">set commands</xref> for
+ examples of commands that include quiet variants.
+ </t>
+ </section>
+
+ <section anchor="value-types" title="Data Types" toc="default">
+ <t>
+ Possible values of the one-byte field:
+ <list hangIndent="8" style="hanging">
+ <t hangText="0x00">Raw bytes</t>
+ </list>
+ </t>
+ </section>
+ </section>
+
+ <section title="Commands" toc="default">
+ <section anchor="command-introduction" title="Introduction" toc="default">
+ <t>
+ All communication is initiated by a request from the client,
+ and the server will respond to each request with zero or
+ multiple packets for each request. If the status code of a response
+ packet is non-nil, the body of the packet will contain a textual error
+ message. If the status code is nil, the command opcode will define the
+ layout of the body of the message.
+ </t>
+ <section anchor="command-introduction-example" title="Example" toc="default">
+ <t>
+ The following figure illustrates the packet layout for
+ a packet with an error message.
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Packet layout:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x09 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x4e ('N') | 0x6f ('o') | 0x74 ('t') | 0x20 (' ') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x66 ('f') | 0x6f ('o') | 0x75 ('u') | 0x6e ('n') |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x64 ('d') |
+ +---------------+
+ Total 33 bytes (24 byte header, and 9 bytes value)
+
+Field (offset) (value)
+Magic (0) : 0x81
+Opcode (1) : 0x00
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Status (6,7) : 0x0001
+Total body (8-11) : 0x00000009
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key : None
+Value (24-32): The textual string "Not found"
+ </artwork>
+ </figure>
+ </section>
+ </section>
+
+ <section anchor="command-get" title="Get, Get Quietly, Get Key, Get Key Quietly" toc="default">
+ <t>
+ Request:
+ </t>
+ <t>
+ <list style="empty">
+ <t>MUST NOT have extras.</t>
+ <t>MUST have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ Response (if found):
+ </t>
+ <t>
+ <list style="empty">
+ <t>MUST have extras.</t>
+ <t>MAY have key.</t>
+ <t>MAY have value.</t>
+ </list>
+ </t>
+
+ <t>
+ <list style="symbols">
+ <t>4 byte flags</t>
+ </list>
+ </t>
+
+ <t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Extra data for the get commands:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Flags |
+ +---------------+---------------+---------------+---------------+
+
+ Total 4 bytes
+ </artwork>
+ </figure>
+ </t>
+
+ <t>
+ The get command gets a single key. The getq command is both mum
+ on cache miss and quiet, holding its response until a non-quiet
+ command is issued. Getk and getkq differs from get and getq by
+ adding the key into the response packet.
+ </t>
+
+ <t>
+ You're not guaranteed a response to a getq/getkq cache hit until
+ you send a non-getq/getkq command later, which uncorks the
+ server and bundles up IOs to send to the client in one go.
+ </t>
+
+ <t>
+ Clients should implement multi-get (still important for
+ reducing network roundtrips!) as n pipelined requests, the
+ first n-1 being getq/getkq, the last being a regular
+ get/getk. That way you're guaranteed to get a response, and
+ you know when the server's done. You can also do the naive
+ thing and send n pipelined get/getks, but then you could potentially
+ get back a lot of "NOT_FOUND" error code packets.
+ Alternatively, you can send 'n' getq/getkqs, followed by a
+ 'noop' command.
+ </t>
+
+ <section anchor="command-get-example" title="Example" toc="default">
+ <t>
+ To request the data associated with the key "Hello" the
+ following fields must be specified in the packet.
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>get request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x6f ('o') |
+ +---------------+
+
+ Total 29 bytes (24 byte header, and 5 bytes key)
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x00
+Key length (2,3) : 0x0005
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000005
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key (24-29): The textual string: "Hello"
+Value : None
+ </artwork>
+ </figure>
+ <t>If the item exist on the server the following packet is returned,
+ otherwise a packet with status code != 0 will be returned (see
+ <xref target="command-introduction">Introduction</xref>)
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>get/getq response:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x04 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x09 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0xde | 0xad | 0xbe | 0xef |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x57 ('W') | 0x6f ('o') | 0x72 ('r') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x64 ('d') |
+ +---------------+
+
+ Total 33 bytes (24 byte header, 4 byte extras and 5 byte value)
+
+Field (offset) (value)
+Magic (0) : 0x81
+Opcode (1) : 0x00
+Key length (2,3) : 0x0000
+Extra length (4) : 0x04
+Data type (5) : 0x00
+Status (6,7) : 0x0000
+Total body (8-11) : 0x00000009
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000001
+Extras :
+ Flags (24-27): 0xdeadbeef
+Key : None
+Value (28-32): The textual string "World"
+ </artwork>
+ </figure>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>getk/getkq response:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x04 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x09 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0xde | 0xad | 0xbe | 0xef |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x6f ('o') | 0x57 ('W') | 0x6f ('o') | 0x72 ('r') |
+ +---------------+---------------+---------------+---------------+
+ 36| 0x6c ('l') | 0x64 ('d') |
+ +---------------+---------------+
+
+ Total 38 bytes (24 byte header, 4 byte extras, 5 byte key
+ and 5 byte value)
+
+Field (offset) (value)
+Magic (0) : 0x81
+Opcode (1) : 0x00
+Key length (2,3) : 0x0005
+Extra length (4) : 0x04
+Data type (5) : 0x00
+Status (6,7) : 0x0000
+Total body (8-11) : 0x0000000E
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000001
+Extras :
+ Flags (24-27): 0xdeadbeef
+Key (28-32): The textual string: "Hello"
+Value (33-37): The textual string: "World"
+ </artwork>
+ </figure>
+ </section>
+ </section>
+
+ <section anchor="command-set" title="Set, Add, Replace" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST have extras.</t>
+ <t>MUST have key.</t>
+ <t>MUST have value.</t>
+ </list>
+ </t>
+
+ <t>
+ <list style="symbols">
+ <t>4 byte flags</t>
+ <t>4 byte expiration time</t>
+ </list>
+ </t>
+
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Extra data for set/add/replace:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Flags |
+ +---------------+---------------+---------------+---------------+
+ 4| Expiration |
+ +---------------+---------------+---------------+---------------+
+ Total 8 bytes
+ </artwork>
+ </figure>
+
+ <t>
+ If the Data Version Check (CAS) is nonzero, the requested
+ operation MUST only succeed if the item exists and has a CAS value
+ identical to the provided value.
+ </t>
+
+ <t>
+ Add MUST fail if the item already exist.
+ </t>
+
+ <t>
+ Replace MUST fail if the item doesn't exist.
+ </t>
+
+ <t>
+ Set should store the data unconditionally if the item exists
+ or not.
+ </t>
+
+ <t>
+ Quiet mutations only return responses on failure. Success
+ is considered the general case and is suppressed when in
+ quiet mode, but errors should not be allowed to go
+ unnoticed.
+ </t>
+
+ <section anchor="command-set-example" title="Example" toc="default">
+ <t>The following figure shows an add-command for
+ <list style="empty">
+ <t>Key: "Hello"</t>
+ <t>Value: "World"</t>
+ <t>Flags: 0xdeadbeef</t>
+ <t>Expiry: in two hours</t>
+ </list>
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Add request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x02 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x08 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x12 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0xde | 0xad | 0xbe | 0xef |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x00 | 0x00 | 0x1c | 0x20 |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 36| 0x6f ('o') | 0x57 ('W') | 0x6f ('o') | 0x72 ('r') |
+ +---------------+---------------+---------------+---------------+
+ 40| 0x6c ('l') | 0x64 ('d') |
+ +---------------+---------------+
+
+ Total 42 bytes (24 byte header, 8 byte extras, 5 byte key and
+ 5 byte value)
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x02
+Key length (2,3) : 0x0005
+Extra length (4) : 0x08
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000012
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras :
+ Flags (24-27): 0xdeadbeef
+ Expiry (28-31): 0x00001c20
+Key (32-36): The textual string "Hello"
+Value (37-41): The textual string "World"
+ </artwork>
+ </figure>
+ <t>
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code. If the command
+ succeeds, the CAS value for the item is returned in the CAS-field
+ of the packet.
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Successful add response:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x02 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+
+ Total 24 bytes
+
+Field (offset) (value)
+Magic (0) : 0x81
+Opcode (1) : 0x02
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Status (6,7) : 0x0000
+Total body (8-11) : 0x00000000
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000001
+Extras : None
+Key : None
+Value : None
+ </artwork>
+ </figure>
+ </section>
+ </section>
+
+ <section anchor="command-delete" title="Delete" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST NOT have extras.</t>
+ <t>MUST have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ Delete the item with the specific key.
+ </t>
+
+ <section anchor="command-delete-example" title="Example" toc="default">
+ <t>The following figure shows a delete message for the
+ item "Hello".</t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Delete request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x04 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x6f ('o') |
+ +---------------+
+
+ Total 29 bytes (24 byte header, 5 byte value)
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x04
+Key length (2,3) : 0x0005
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000005
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key : The textual string "Hello"
+Value : None
+ </artwork>
+ </figure>
+ <t>
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+ </t>
+ </section>
+ </section>
+
+ <section anchor="command-incr" title="Increment, Decrement" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST have extras.</t>
+ <t>MUST have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ <list style="symbols">
+ <t>8 byte value to add / subtract</t>
+ <t>8 byte initial value (unsigned)</t>
+ <t>4 byte expiration time</t>
+ </list>
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Extra data for incr/decr:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Amount to add |
+ | |
+ +---------------+---------------+---------------+---------------+
+ 8| Initial value |
+ | |
+ +---------------+---------------+---------------+---------------+
+ 16| Expiration |
+ +---------------+---------------+---------------+---------------+
+ Total 20 bytes
+ </artwork>
+ </figure>
+
+ <t>
+ These commands will either add or remove the specified
+ amount to the requested counter.
+ </t>
+ <t>
+ If the counter does not exist, one of two things may happen:
+ </t>
+ <t>
+ <list style="numbers">
+ <t>If the expiration value is all one-bits (0xffffffff), the
+ operation will fail with NOT_FOUND.</t>
+ <t>For all other expiration values, the operation will succeed
+ by seeding the value for this key with the provided initial
+ value to expire with the provided expiration time. The flags
+ will be set to zero.</t>
+ </list>
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>incr/decr response body:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 64-bit unsigned response. |
+ | |
+ +---------------+---------------+---------------+---------------+
+ Total 8 bytes
+ </artwork>
+ </figure>
+ <section anchor="command-incr-example" title="Example" toc="default">
+ <t>The following figure shows an incr-command for
+ <list style="empty">
+ <t>Key: "counter"</t>
+ <t>Delta: 0x01</t>
+ <t>Initial: 0x00</t>
+ <t>Expiry: in two hours</t>
+ </list>
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Increment request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x05 | 0x00 | 0x07 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x14 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x1b |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 36| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 40| 0x00 | 0x00 | 0x1c | 0x20 |
+ +---------------+---------------+---------------+---------------+
+ 44| 0x63 ('c') | 0x6f ('o') | 0x75 ('u') | 0x6e ('n') |
+ +---------------+---------------+---------------+---------------+
+ 48| 0x74 ('t') | 0x65 ('e') | 0x72 ('r') |
+ +---------------+---------------+---------------+
+ Total 51 bytes (24 byte header, 20 byte extras, 7 byte key)
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x05
+Key length (2,3) : 0x0007
+Extra length (4) : 0x14
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x0000001b
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras :
+ delta (24-31): 0x0000000000000001
+ initial (32-39): 0x0000000000000000
+ expiration (40-43): 0x00001c20
+Key : Textual string "counter"
+Value : None
+ </artwork>
+ </figure>
+ <t>
+ If the key doesn't exist, the server will respond with the
+ initial value. If not the incremented value will be returned.
+ Let's assume that the key didn't exist, so the initial value
+ is returned.
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Increment response:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x05 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x08 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 32 bytes (24 byte header, 8 byte value)
+
+Field (offset) (value)
+Magic (0) : 0x81
+Opcode (1) : 0x05
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Status (6,7) : 0x0000
+Total body (8-11) : 0x00000008
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000005
+Extras : None
+Key : None
+Value : 0x0000000000000000
+ </artwork>
+ </figure>
+ </section>
+ </section>
+
+ <section anchor="command-quit" title="quit" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST NOT have extras.</t>
+ <t>MUST NOT have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ Close the connection to the server.
+ </t>
+
+ <section anchor="command-quit-example" title="Example" toc="default">
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Quit request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x07 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x07
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000000
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key : None
+Value : None
+ </artwork>
+ </figure>
+ <t>
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code. The server will
+ then close the connection.
+ </t>
+ </section>
+ </section>
+
+ <section anchor="command-flush" title="Flush" toc="default">
+ <t>
+ <list style="empty">
+ <t>MAY have extras.</t>
+ <t>MUST NOT have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ <list style="symbols">
+ <t>4 byte expiration time</t>
+ </list>
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Extra data for flush:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Expiration |
+ +---------------+---------------+---------------+---------------+
+ Total 4 bytes
+ </artwork>
+ </figure>
+ <t>
+ Flush the items in the cache now or some time in the future as
+ specified by the expiration field. See the documentation of the
+ textual protocol for the full description on how to specify the
+ expiration time.
+ </t>
+ <section anchor="command-flush-example" title="Example" toc="default">
+ <t>
+ To flush the cache (delete all items) in two hours, the set
+ the following values in the request
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Flush request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x08 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x04 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x04 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x00 | 0x00 | 0x1c | 0x20 |
+ +---------------+---------------+---------------+---------------+
+ Total 28 bytes (24 byte header, 4 byte body)
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x08
+Key length (2,3) : 0x0000
+Extra length (4) : 0x04
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000004
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras :
+ Expiry (24-27): 0x00001c20
+Key : None
+Value : None
+ </artwork>
+ </figure>
+ <t>
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+ </t>
+ </section>
+ </section>
+ <section anchor="command-noop" title="noop" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST NOT have extras.</t>
+ <t>MUST NOT have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ Used as a keep alive. Flushes outstanding getq/getkq's.
+ </t>
+ <section anchor="command-noop-example" title="Example" toc="default">
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Noop request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x0a | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x0a
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000000
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key : None
+Value : None
+ </artwork>
+ </figure>
+ <t>
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+ </t>
+ </section>
+ </section>
+
+ <section anchor="command-version" title="version" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST NOT have extras.</t>
+ <t>MUST NOT have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ Request the server version.
+ </t>
+ <t>
+ The server responds with a packet containing the version string
+ in the body with the following format: "x.y.z"
+ </t>
+ <section anchor="command-version-example" title="Example" toc="default">
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Version request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x0b | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x0b
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000000
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+ </artwork>
+ </figure>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Version response:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x0b | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x31 ('1') | 0x2e ('.') | 0x33 ('3') | 0x2e ('.') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x31 ('1') |
+ +---------------+
+ Total 29 bytes (24 byte header, 5 byte body)
+
+Field (offset) (value)
+Magic (0) : 0x81
+Opcode (1) : 0x0b
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Status (6,7) : 0x0000
+Total body (8-11) : 0x00000005
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key : None
+Value : Textual string "1.3.1"
+ </artwork>
+ </figure>
+ </section>
+ </section>
+
+ <section anchor="command-append" title="Append, Prepend" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST NOT have extras.</t>
+ <t>MUST have key.</t>
+ <t>MUST have value.</t>
+ </list>
+ </t>
+
+ <t>
+ These commands will either append or prepend the specified
+ value to the requested key.
+ </t>
+
+ <section anchor="command-append-example" title="Example" toc="default">
+ <t>The following example appends '!' to the 'Hello' key.</t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Append request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x0e | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x06 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x6f ('o') | 0x21 ('!') |
+ +---------------+---------------+
+ Total 30 bytes (24 byte header, 5 byte key, 1 byte value)
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x0e
+Key length (2,3) : 0x0005
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000006
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key (24-28): The textual string "Hello"
+Value (29) : "!"
+ </artwork>
+ </figure>
+ <t>
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+ </t>
+ </section>
+ </section>
+
+ <section anchor="command-stat" title="Stat" toc="default">
+ <t>
+ <list style="empty">
+ <t>MUST NOT have extras.</t>
+ <t>MAY have key.</t>
+ <t>MUST NOT have value.</t>
+ </list>
+ </t>
+
+ <t>
+ Request server statistics. Without a key specified the server will
+ respond with a "default" set of statistics information. Each piece
+ of statistical information is returned in its own packet (key
+ contains the name of the statistical item and the body contains the
+ value in ASCII format). The sequence of return packets is terminated
+ with a packet that contains no key and no value.
+ </t>
+ <section anchor="command-stat-example" title="Example" toc="default">
+ <t>The following example requests all statistics from the server</t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Stat request:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x10 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+Field (offset) (value)
+Magic (0) : 0x80
+Opcode (1) : 0x10
+Key length (2,3) : 0x0000
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Reserved (6,7) : 0x0000
+Total body (8-11) : 0x00000000
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key : None
+Value : None
+ </artwork>
+ </figure>
+ <t>
+ The server will send each value in a separate packet with
+ an "empty" packet (no key / no value) to terminate the sequence.
+ Each of the response packets look like the following example:
+ </t>
+ <figure title="" suppress-title="false" align="left" alt="" width="" height="">
+ <preamble>Stat response:</preamble>
+ <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x10 | 0x00 | 0x03 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x07 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x70 ('p') | 0x69 ('i') | 0x64 ('d') | 0x33 ('3') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x30 ('0') | 0x37 ('7') | 0x38 ('8') |
+ +---------------+---------------+---------------+
+ Total 31 bytes (24 byte header, 3 byte key, 4 byte body)
+
+Field (offset) (value)
+Magic (0) : 0x81
+Opcode (1) : 0x10
+Key length (2,3) : 0x0003
+Extra length (4) : 0x00
+Data type (5) : 0x00
+Status (6,7) : 0x0000
+Total body (8-11) : 0x00000007
+Opaque (12-15): 0x00000000
+CAS (16-23): 0x0000000000000000
+Extras : None
+Key : The textual string "pid"
+Value : The textual string "3078"
+ </artwork>
+ </figure>
+ </section>
+ </section>
+ </section>
+ <section anchor="security" title="Security Considerations" toc="default">
+ <t>
+ Memcache has few authentication and no security layers whatsoever. It is
+ RECOMMENDED that memcache be deployed strictly on closed, protected,
+ back-end networks within a single data center, within a single cluster of
+ servers, or even on a single host, providing shared caching for multiple
+ applications. Memcache MUST NOT be made available on a public network.
+ </t>
+
+ <t>
+ SASL is supported as an authentication mechanism. See the wiki for more
+ information.
+ </t>
+ </section>
+
+ </middle>
+
+ <back>
+ <references title="Normative References">
+ <reference anchor="LJ" quote-title="true">
+ <front>
+ <title>LJ NEEDS MOAR SPEED</title>
+ <author fullname="Brad Fitzpatrick">
+ <organization>Danga Interactive</organization>
+ </author>
+ <date day="5" month="10" year="1999"/>
+ <abstract>
+ <t>http://www.livejournal.com/</t>
+ </abstract>
+ </front>
+ </reference>
+ <reference anchor="KEYWORDS">
+
+<front>
+<title abbrev="RFC Key Words">Key words for use in RFCs to Indicate Requirement Levels</title>
+<author initials="S." surname="Bradner" fullname="Scott Bradner">
+<organization>Harvard University</organization>
+<address>
+<postal>
+<street>1350 Mass. Ave.</street>
+<street>Cambridge</street>
+<street>MA 02138</street></postal>
+<phone>- +1 617 495 3864</phone>
+<email>sob@harvard.edu</email></address></author>
+<date year="1997" month="March"/>
+<area>General</area>
+<keyword>keyword</keyword>
+<abstract>
+<t>
+ In many standards track documents several words are used to signify
+ the requirements in the specification. These words are often
+ capitalized. This document defines these words as they should be
+ interpreted in IETF documents. Authors who follow these guidelines
+ should incorporate this phrase near the beginning of their document:
+
+<list>
+<t>
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
+ NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ RFC 2119.
+</t></list></t>
+<t>
+ Note that the force of these words is modified by the requirement
+ level of the document in which they are used.
+</t></abstract></front>
+
+<seriesInfo name="BCP" value="14"/>
+<seriesInfo name="RFC" value="2119"/>
+<format type="TXT" octets="4723" target="http://www.rfc-editor.org/rfc/rfc2119.txt"/>
+<format type="HTML" octets="17970" target="http://xml.resource.org/public/rfc/html/rfc2119.html"/>
+<format type="XML" octets="5777" target="http://xml.resource.org/public/rfc/xml/rfc2119.xml"/>
+</reference>
+ </references>
+
+ <section anchor="acknowledgments" title="Acknowledgments" toc="default">
+ <t>
+ Thanks to Brad Fitzpatrick, Anatoly Vorobey, Steven Grimm, and Dustin
+ Sallings, for their work on the memcached server.
+ </t>
+
+ <t>
+ Thanks to Sean Chittenden, Jonathan Steinert, Brian Aker, Evan Martin,
+ Nathan Neulinger, Eric Hodel, Michael Johnson, Paul Querna, Jamie
+ McCarthy, Philip Neustrom, Andrew O'Brien, Josh Rotenberg, Robin H.
+ Johnson, Tim Yardley, Paolo Borelli, Eli Bingham, Jean-Francois
+ Bustarret, Paul G, Paul Lindner, Alan Kasindorf, Chris Goffinet, Tomash
+ Brechko, and others for their work reporting bugs and maintaining
+ memcached client libraries and bindings in many languages.
+ </t>
+ </section>
+ </back>
+
+</rfc>
diff --git a/doc/protocol-binary.txt b/doc/protocol-binary.txt
new file mode 100644
index 0000000..b59d353
--- /dev/null
+++ b/doc/protocol-binary.txt
@@ -0,0 +1,1736 @@
+
+
+
+
+Network Working Group Stone, Ed.
+Internet-Draft Six Apart, Ltd.
+Intended status: Informational Norbye, Ed.
+Expires: March 1, 2009 Sun Microsystems, INC
+ August 28, 2008
+
+
+ Memcache Binary Protocol
+ draft-stone-memcache-binary-01
+
+Abstract
+
+ This memo explains the memcache binary protocol for informational
+ purposes.
+
+ Memcache is a high performance key-value cache. It is intentionally
+ a dumb cache, optimized for speed only. Applications using memcache
+ do not rely on it for data -- a persistent database with guaranteed
+ reliability is strongly recommended -- but applications can run much
+ faster when cached data is available in memcache.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on March 1, 2009.
+
+Copyright Notice
+
+ Copyright (c) 2008 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 1]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 1.1. Conventions Used In This Document . . . . . . . . . . . . 3
+ 2. Packet Structure . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. Defined Values . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3.1. Magic Byte . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3.2. Response Status . . . . . . . . . . . . . . . . . . . . . 5
+ 3.3. Command Opcodes . . . . . . . . . . . . . . . . . . . . . 6
+ 3.4. Data Types . . . . . . . . . . . . . . . . . . . . . . . 6
+ 4. Commands . . . . . . . . . . . . . . . . . . . . . . . . . . 7
+ 4.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 7
+ 4.1.1. Example . . . . . . . . . . . . . . . . . . . . . . . 7
+ 4.2. Get, Get Quietly, Get Key, Get Key Quietly . . . . . . . 8
+ 4.2.1. Example . . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.3. Set, Add, Replace . . . . . . . . . . . . . . . . . . . . 13
+ 4.3.1. Example . . . . . . . . . . . . . . . . . . . . . . . 13
+ 4.4. Delete . . . . . . . . . . . . . . . . . . . . . . . . . 15
+ 4.4.1. Example . . . . . . . . . . . . . . . . . . . . . . . 16
+ 4.5. Increment, Decrement . . . . . . . . . . . . . . . . . . 17
+ 4.5.1. Example . . . . . . . . . . . . . . . . . . . . . . . 18
+ 4.6. quit . . . . . . . . . . . . . . . . . . . . . . . . . . 20
+ 4.6.1. Example . . . . . . . . . . . . . . . . . . . . . . . 21
+ 4.7. Flush . . . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 4.7.1. Example . . . . . . . . . . . . . . . . . . . . . . . 22
+ 4.8. noop . . . . . . . . . . . . . . . . . . . . . . . . . . 23
+ 4.8.1. Example . . . . . . . . . . . . . . . . . . . . . . . 24
+ 4.9. version . . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 4.9.1. Example . . . . . . . . . . . . . . . . . . . . . . . 25
+ 4.10. Append, Prepend . . . . . . . . . . . . . . . . . . . . . 26
+ 4.10.1. Example . . . . . . . . . . . . . . . . . . . . . . 27
+ 4.11. Stat . . . . . . . . . . . . . . . . . . . . . . . . . . 28
+ 4.11.1. Example . . . . . . . . . . . . . . . . . . . . . . 28
+ 5. Security Considerations . . . . . . . . . . . . . . . . . . . 30
+ 6. Normative References . . . . . . . . . . . . . . . . . . . . 31
+ Appendix A. Acknowledgments . . . . . . . . . . . . . . . . . . 31
+ Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 31
+
+1. Introduction
+
+ Memcache is a high performance key-value cache. It is intentionally
+ a dumb cache, optimized for speed only. Applications using memcache
+ should not rely on it for data -- a persistent database with
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 2]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ guaranteed reliability is strongly recommended -- but applications
+ can run much faster when cached data is available in memcache.
+
+ Memcache was originally written to make LiveJournal [LJ] faster. It
+ now powers all of the fastest web sites that you love.
+
+1.1. Conventions Used In This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [KEYWORDS].
+
+2. Packet Structure
+
+ General format of a packet:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0/ HEADER /
+ / /
+ / /
+ / /
+ +---------------+---------------+---------------+---------------+
+ 24/ COMMAND-SPECIFIC EXTRAS (as needed) /
+ +/ (note length in the extras length header field) /
+ +---------------+---------------+---------------+---------------+
+ m/ Key (as needed) /
+ +/ (note length in key length header field) /
+ +---------------+---------------+---------------+---------------+
+ n/ Value (as needed) /
+ +/ (note length is total body length header field, minus /
+ +/ sum of the extras and key length body fields) /
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 3]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Request header:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Magic | Opcode | Key length |
+ +---------------+---------------+---------------+---------------+
+ 4| Extras length | Data type | Reserved |
+ +---------------+---------------+---------------+---------------+
+ 8| Total body length |
+ +---------------+---------------+---------------+---------------+
+ 12| Opaque |
+ +---------------+---------------+---------------+---------------+
+ 16| CAS |
+ | |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+ Response header:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Magic | Opcode | Key Length |
+ +---------------+---------------+---------------+---------------+
+ 4| Extras length | Data type | Status |
+ +---------------+---------------+---------------+---------------+
+ 8| Total body length |
+ +---------------+---------------+---------------+---------------+
+ 12| Opaque |
+ +---------------+---------------+---------------+---------------+
+ 16| CAS |
+ | |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+ Header fields:
+
+ Magic Magic number.
+ Opcode Command code.
+ Key length Length in bytes of the text key that follows the
+ command extras.
+ Status Status of the response (non-zero on error).
+ Extras length Length in bytes of the command extras.
+ Data type Reserved for future use (Sean is using this
+ soon).
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 4]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Reserved Really reserved for future use (up for grabs).
+ Total body length Length in bytes of extra + key + value.
+ Opaque Will be copied back to you in the response.
+ CAS Data version check.
+
+3. Defined Values
+
+3.1. Magic Byte
+
+ 0x80 Request packet for this protocol version
+ 0x81 Response packet for this protocol version
+
+ Magic byte / version. For each version of the protocol, we'll use a
+ different request/response value pair. This is useful for protocol
+ analyzers to distinguish the nature of the packet from the direction
+ which it is moving. Note, it is common to run a memcached instance
+ on a host that also runs an application server. Such a host will
+ both send and receive memcache packets.
+
+ The version should hopefully correspond only to different meanings of
+ the command byte. In an ideal world, we will not change the header
+ format. As reserved bytes are given defined meaning, the protocol
+ version / magic byte values should be incremented.
+
+ Traffic analysis tools are encouraged to identify memcache packets
+ and provide detailed interpretation if the magic bytes are recognized
+ and otherwise to provide a generic breakdown of the packet. Note,
+ that the key and value positions can always be identified even if the
+ magic byte or command opcode are not recognized.
+
+3.2. Response Status
+
+ Possible values of this two-byte field:
+
+ 0x0000 No error
+ 0x0001 Key not found
+ 0x0002 Key exists
+ 0x0003 Value too large
+ 0x0004 Invalid arguments
+ 0x0005 Item not stored
+ 0x0006 Incr/Decr on non-numeric value.
+ 0x0081 Unknown command
+ 0x0082 Out of memory
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 5]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+3.3. Command Opcodes
+
+ Possible values of the one-byte field:
+
+ 0x00 Get
+ 0x01 Set
+ 0x02 Add
+ 0x03 Replace
+ 0x04 Delete
+ 0x05 Increment
+ 0x06 Decrement
+ 0x07 Quit
+ 0x08 Flush
+ 0x09 GetQ
+ 0x0A No-op
+ 0x0B Version
+ 0x0C GetK
+ 0x0D GetKQ
+ 0x0E Append
+ 0x0F Prepend
+ 0x10 Stat
+ 0x11 SetQ
+ 0x12 AddQ
+ 0x13 ReplaceQ
+ 0x14 DeleteQ
+ 0x15 IncrementQ
+ 0x16 DecrementQ
+ 0x17 QuitQ
+ 0x18 FlushQ
+ 0x19 AppendQ
+ 0x1A PrependQ
+
+ As a convention all of the commands ending with "Q" for Quiet. A
+ quiet version of a command will omit responses that are considered
+ uninteresting. Whether a given response is interesting is dependent
+ upon the command. See the descriptions of the set commands
+ (Section 4.2) and set commands (Section 4.3) for examples of commands
+ that include quiet variants.
+
+3.4. Data Types
+
+ Possible values of the one-byte field:
+
+ 0x00 Raw bytes
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 6]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4. Commands
+
+4.1. Introduction
+
+ All communication is initiated by a request from the client, and the
+ server will respond to each request with zero or multiple packets for
+ each request. If the status code of a response packet is non-nil,
+ the body of the packet will contain a textual error message. If the
+ status code is nil, the command opcode will define the layout of the
+ body of the message.
+
+4.1.1. Example
+
+ The following figure illustrates the packet layout for a packet with
+ an error message.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 7]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Packet layout:
+
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x09 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x4e ('N') | 0x6f ('o') | 0x74 ('t') | 0x20 (' ') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x66 ('f') | 0x6f ('o') | 0x75 ('u') | 0x6e ('n') |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x64 ('d') |
+ +---------------+
+ Total 33 bytes (24 byte header, and 9 bytes value)
+
+ Field (offset) (value)
+ Magic (0) : 0x81
+ Opcode (1) : 0x00
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Status (6,7) : 0x0001
+ Total body (8-11) : 0x00000009
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key : None
+ Value (24-32): The textual string "Not found"
+
+4.2. Get, Get Quietly, Get Key, Get Key Quietly
+
+ Request:
+
+ MUST NOT have extras.
+ MUST have key.
+ MUST NOT have value.
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 8]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Response (if found):
+
+ MUST have extras.
+ MAY have key.
+ MAY have value.
+
+ o 4 byte flags
+
+ Extra data for the get commands:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Flags |
+ +---------------+---------------+---------------+---------------+
+
+ Total 4 bytes
+
+ The get command gets a single key. The getq command is both mum on
+ cache miss and quiet, holding its response until a non-quiet command
+ is issued. Getk and getkq differs from get and getq by adding the
+ key into the response packet.
+
+ You're not guaranteed a response to a getq/getkq cache hit until you
+ send a non-getq/getkq command later, which uncorks the server and
+ bundles up IOs to send to the client in one go.
+
+ Clients should implement multi-get (still important for reducing
+ network roundtrips!) as n pipelined requests, the first n-1 being
+ getq/getkq, the last being a regular get/getk. That way you're
+ guaranteed to get a response, and you know when the server's done.
+ You can also do the naive thing and send n pipelined get/getks, but
+ then you could potentially get back a lot of "NOT_FOUND" error code
+ packets. Alternatively, you can send 'n' getq/getkqs, followed by a
+ 'noop' command.
+
+4.2.1. Example
+
+ To request the data associated with the key "Hello" the following
+ fields must be specified in the packet.
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 9]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ get request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x6f ('o') |
+ +---------------+
+
+ Total 29 bytes (24 byte header, and 5 bytes key)
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x00
+ Key length (2,3) : 0x0005
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000005
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key (24-29): The textual string: "Hello"
+ Value : None
+
+ If the item exist on the server the following packet is returned,
+ otherwise a packet with status code != 0 will be returned (see
+ Introduction (Section 4.1))
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 10]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ get/getq response:
+
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x04 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x09 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0xde | 0xad | 0xbe | 0xef |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x57 ('W') | 0x6f ('o') | 0x72 ('r') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x64 ('d') |
+ +---------------+
+
+ Total 33 bytes (24 byte header, 4 byte extras and 5 byte value)
+
+ Field (offset) (value)
+ Magic (0) : 0x81
+ Opcode (1) : 0x00
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x04
+ Data type (5) : 0x00
+ Status (6,7) : 0x0000
+ Total body (8-11) : 0x00000009
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000001
+ Extras :
+ Flags (24-27): 0xdeadbeef
+ Key : None
+ Value (28-32): The textual string "World"
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 11]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ getk/getkq response:
+
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x04 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x09 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0xde | 0xad | 0xbe | 0xef |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x6f ('o') | 0x57 ('W') | 0x6f ('o') | 0x72 ('r') |
+ +---------------+---------------+---------------+---------------+
+ 36| 0x6c ('l') | 0x64 ('d') |
+ +---------------+---------------+
+
+ Total 38 bytes (24 byte header, 4 byte extras, 5 byte key
+ and 5 byte value)
+
+ Field (offset) (value)
+ Magic (0) : 0x81
+ Opcode (1) : 0x00
+ Key length (2,3) : 0x0005
+ Extra length (4) : 0x04
+ Data type (5) : 0x00
+ Status (6,7) : 0x0000
+ Total body (8-11) : 0x0000000E
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000001
+ Extras :
+ Flags (24-27): 0xdeadbeef
+ Key (28-32): The textual string: "Hello"
+ Value (33-37): The textual string: "World"
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 12]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4.3. Set, Add, Replace
+
+ MUST have extras.
+ MUST have key.
+ MUST have value.
+
+ o 4 byte flags
+ o 4 byte expiration time
+
+ Extra data for set/add/replace:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Flags |
+ +---------------+---------------+---------------+---------------+
+ 4| Expiration |
+ +---------------+---------------+---------------+---------------+
+ Total 8 bytes
+
+ If the Data Version Check (CAS) is nonzero, the requested operation
+ MUST only succeed if the item exists and has a CAS value identical to
+ the provided value.
+
+ Add MUST fail if the item already exist.
+
+ Replace MUST fail if the item doesn't exist.
+
+ Set should store the data unconditionally if the item exists or not.
+
+ Quiet mutations only return responses on failure. Success is
+ considered the general case and is suppressed when in quiet mode, but
+ errors should not be allowed to go unnoticed.
+
+4.3.1. Example
+
+ The following figure shows an add-command for
+
+ Key: "Hello"
+ Value: "World"
+ Flags: 0xdeadbeef
+ Expiry: in two hours
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 13]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Add request:
+
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x02 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x08 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x12 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0xde | 0xad | 0xbe | 0xef |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x00 | 0x00 | 0x1c | 0x20 |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 36| 0x6f ('o') | 0x57 ('W') | 0x6f ('o') | 0x72 ('r') |
+ +---------------+---------------+---------------+---------------+
+ 40| 0x6c ('l') | 0x64 ('d') |
+ +---------------+---------------+
+
+ Total 42 bytes (24 byte header, 8 byte extras, 5 byte key and
+ 5 byte value)
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x02
+ Key length (2,3) : 0x0005
+ Extra length (4) : 0x08
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000012
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras :
+ Flags (24-27): 0xdeadbeef
+ Expiry (28-31): 0x00001c20
+ Key (32-36): The textual string "Hello"
+ Value (37-41): The textual string "World"
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 14]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code. If the command
+ succeeds, the CAS value for the item is returned in the CAS-field of
+ the packet.
+
+ Successful add response:
+
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x02 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+
+ Total 24 bytes
+
+ Field (offset) (value)
+ Magic (0) : 0x81
+ Opcode (1) : 0x02
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Status (6,7) : 0x0000
+ Total body (8-11) : 0x00000000
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000001
+ Extras : None
+ Key : None
+ Value : None
+
+4.4. Delete
+
+ MUST NOT have extras.
+ MUST have key.
+ MUST NOT have value.
+
+ Delete the item with the specific key.
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 15]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4.4.1. Example
+
+ The following figure shows a delete message for the item "Hello".
+
+ Delete request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x04 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x6f ('o') |
+ +---------------+
+
+ Total 29 bytes (24 byte header, 5 byte value)
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x04
+ Key length (2,3) : 0x0005
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000005
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key : The textual string "Hello"
+ Value : None
+
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 16]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4.5. Increment, Decrement
+
+ MUST have extras.
+ MUST have key.
+ MUST NOT have value.
+
+ o 8 byte value to add / subtract
+ o 8 byte initial value (unsigned)
+ o 4 byte expiration time
+
+ Extra data for incr/decr:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Amount to add |
+ | |
+ +---------------+---------------+---------------+---------------+
+ 8| Initial value |
+ | |
+ +---------------+---------------+---------------+---------------+
+ 16| Expiration |
+ +---------------+---------------+---------------+---------------+
+ Total 20 bytes
+
+ These commands will either add or remove the specified amount to the
+ requested counter.
+
+ If the counter does not exist, one of two things may happen:
+
+ 1. If the expiration value is all one-bits (0xffffffff), the
+ operation will fail with NOT_FOUND.
+ 2. For all other expiration values, the operation will succeed by
+ seeding the value for this key with the provided initial value to
+ expire with the provided expiration time. The flags will be set
+ to zero.
+
+ incr/decr response body:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 64-bit unsigned response. |
+ | |
+ +---------------+---------------+---------------+---------------+
+ Total 8 bytes
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 17]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4.5.1. Example
+
+ The following figure shows an incr-command for
+
+ Key: "counter"
+ Delta: 0x01
+ Initial: 0x00
+ Expiry: in two hours
+
+ Increment request:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 18]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x05 | 0x00 | 0x07 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x14 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x1b |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x00 | 0x00 | 0x00 | 0x01 |
+ +---------------+---------------+---------------+---------------+
+ 32| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 36| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 40| 0x00 | 0x00 | 0x1c | 0x20 |
+ +---------------+---------------+---------------+---------------+
+ 44| 0x63 ('c') | 0x6f ('o') | 0x75 ('u') | 0x6e ('n') |
+ +---------------+---------------+---------------+---------------+
+ 48| 0x74 ('t') | 0x65 ('e') | 0x72 ('r') |
+ +---------------+---------------+---------------+
+ Total 51 bytes (24 byte header, 20 byte extras, 7 byte key)
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x05
+ Key length (2,3) : 0x0007
+ Extra length (4) : 0x14
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x0000001b
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras :
+ delta (24-31): 0x0000000000000001
+ initial (32-39): 0x0000000000000000
+ expiration (40-43): 0x00001c20
+ Key : Textual string "counter"
+ Value : None
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 19]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ If the key doesn't exist, the server will respond with the initial
+ value. If not the incremented value will be returned. Let's assume
+ that the key didn't exist, so the initial value is returned.
+
+ Increment response:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x05 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x08 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 32 bytes (24 byte header, 8 byte value)
+
+ Field (offset) (value)
+ Magic (0) : 0x81
+ Opcode (1) : 0x05
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Status (6,7) : 0x0000
+ Total body (8-11) : 0x00000008
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000005
+ Extras : None
+ Key : None
+ Value : 0x0000000000000000
+
+4.6. quit
+
+ MUST NOT have extras.
+ MUST NOT have key.
+ MUST NOT have value.
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 20]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Close the connection to the server.
+
+4.6.1. Example
+
+ Quit request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x07 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x07
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000000
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key : None
+ Value : None
+
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code. The server will then
+ close the connection.
+
+4.7. Flush
+
+ MAY have extras.
+ MUST NOT have key.
+ MUST NOT have value.
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 21]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ o 4 byte expiration time
+
+ Extra data for flush:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| Expiration |
+ +---------------+---------------+---------------+---------------+
+ Total 4 bytes
+
+ Flush the items in the cache now or some time in the future as
+ specified by the expiration field. See the documentation of the
+ textual protocol for the full description on how to specify the
+ expiration time.
+
+4.7.1. Example
+
+ To flush the cache (delete all items) in two hours, the set the
+ following values in the request
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 22]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Flush request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x08 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x04 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x04 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x00 | 0x00 | 0x1c | 0x20 |
+ +---------------+---------------+---------------+---------------+
+ Total 28 bytes (24 byte header, 4 byte body)
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x08
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x04
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000004
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras :
+ Expiry (24-27): 0x00001c20
+ Key : None
+ Value : None
+
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+
+4.8. noop
+
+ MUST NOT have extras.
+ MUST NOT have key.
+ MUST NOT have value.
+
+ Used as a keep alive. Flushes outstanding getq/getkq's.
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 23]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4.8.1. Example
+
+ Noop request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x0a | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x0a
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000000
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key : None
+ Value : None
+
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+
+4.9. version
+
+ MUST NOT have extras.
+ MUST NOT have key.
+ MUST NOT have value.
+
+ Request the server version.
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 24]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ The server responds with a packet containing the version string in
+ the body with the following format: "x.y.z"
+
+4.9.1. Example
+
+ Version request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x0b | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x0b
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000000
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 25]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Version response:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x0b | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x31 ('1') | 0x2e ('.') | 0x33 ('3') | 0x2e ('.') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x31 ('1') |
+ +---------------+
+ Total 29 bytes (24 byte header, 5 byte body)
+
+ Field (offset) (value)
+ Magic (0) : 0x81
+ Opcode (1) : 0x0b
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Status (6,7) : 0x0000
+ Total body (8-11) : 0x00000005
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key : None
+ Value : Textual string "1.3.1"
+
+4.10. Append, Prepend
+
+ MUST NOT have extras.
+ MUST have key.
+ MUST have value.
+
+ These commands will either append or prepend the specified value to
+ the requested key.
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 26]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4.10.1. Example
+
+ The following example appends '!' to the 'Hello' key.
+
+ Append request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x0e | 0x00 | 0x05 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x06 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x48 ('H') | 0x65 ('e') | 0x6c ('l') | 0x6c ('l') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x6f ('o') | 0x21 ('!') |
+ +---------------+---------------+
+ Total 30 bytes (24 byte header, 5 byte key, 1 byte value)
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x0e
+ Key length (2,3) : 0x0005
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000006
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key (24-28): The textual string "Hello"
+ Value (29) : "!"
+
+ The response-packet contains no extra data, and the result of the
+ operation is signaled through the status code.
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 27]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+4.11. Stat
+
+ MUST NOT have extras.
+ MAY have key.
+ MUST NOT have value.
+
+ Request server statistics. Without a key specified the server will
+ respond with a "default" set of statistics information. Each piece
+ of statistical information is returned in its own packet (key
+ contains the name of the statistical item and the body contains the
+ value in ASCII format). The sequence of return packets is terminated
+ with a packet that contains no key and no value.
+
+4.11.1. Example
+
+ The following example requests all statistics from the server
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 28]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Stat request:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x80 | 0x10 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ Total 24 bytes
+
+ Field (offset) (value)
+ Magic (0) : 0x80
+ Opcode (1) : 0x10
+ Key length (2,3) : 0x0000
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Reserved (6,7) : 0x0000
+ Total body (8-11) : 0x00000000
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key : None
+ Value : None
+
+ The server will send each value in a separate packet with an "empty"
+ packet (no key / no value) to terminate the sequence. Each of the
+ response packets look like the following example:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 29]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ Stat response:
+
+ Byte/ 0 | 1 | 2 | 3 |
+ / | | | |
+ |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|
+ +---------------+---------------+---------------+---------------+
+ 0| 0x81 | 0x10 | 0x00 | 0x03 |
+ +---------------+---------------+---------------+---------------+
+ 4| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 8| 0x00 | 0x00 | 0x00 | 0x07 |
+ +---------------+---------------+---------------+---------------+
+ 12| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 16| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 20| 0x00 | 0x00 | 0x00 | 0x00 |
+ +---------------+---------------+---------------+---------------+
+ 24| 0x70 ('p') | 0x69 ('i') | 0x64 ('d') | 0x33 ('3') |
+ +---------------+---------------+---------------+---------------+
+ 28| 0x30 ('0') | 0x37 ('7') | 0x38 ('8') |
+ +---------------+---------------+---------------+
+ Total 31 bytes (24 byte header, 3 byte key, 4 byte body)
+
+ Field (offset) (value)
+ Magic (0) : 0x81
+ Opcode (1) : 0x10
+ Key length (2,3) : 0x0003
+ Extra length (4) : 0x00
+ Data type (5) : 0x00
+ Status (6,7) : 0x0000
+ Total body (8-11) : 0x00000007
+ Opaque (12-15): 0x00000000
+ CAS (16-23): 0x0000000000000000
+ Extras : None
+ Key : The textual string "pid"
+ Value : The textual string "3078"
+
+5. Security Considerations
+
+ Memcache has few authentication and no security layers whatsoever.
+ It is RECOMMENDED that memcache be deployed strictly on closed,
+ protected, back-end networks within a single data center, within a
+ single cluster of servers, or even on a single host, providing shared
+ caching for multiple applications. Memcache MUST NOT be made
+ available on a public network.
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 30]
+
+Internet-Draft Memcache Binary Protocol August 2008
+
+
+ SASL is supported as an authentication mechanism. See the wiki for
+ more information.
+
+6. Normative References
+
+ [KEYWORDS]
+ Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [LJ] Fitzpatrick, B., "LJ NEEDS MOAR SPEED", 10 1999.
+
+Appendix A. Acknowledgments
+
+ Thanks to Brad Fitzpatrick, Anatoly Vorobey, Steven Grimm, and Dustin
+ Sallings, for their work on the memcached server.
+
+ Thanks to Sean Chittenden, Jonathan Steinert, Brian Aker, Evan
+ Martin, Nathan Neulinger, Eric Hodel, Michael Johnson, Paul Querna,
+ Jamie McCarthy, Philip Neustrom, Andrew O'Brien, Josh Rotenberg,
+ Robin H. Johnson, Tim Yardley, Paolo Borelli, Eli Bingham, Jean-
+ Francois Bustarret, Paul G, Paul Lindner, Alan Kasindorf, Chris
+ Goffinet, Tomash Brechko, and others for their work reporting bugs
+ and maintaining memcached client libraries and bindings in many
+ languages.
+
+Authors' Addresses
+
+ Aaron Stone (editor)
+ Six Apart, Ltd.
+ 548 4th Street
+ San Francisco, CA 94107
+ USA
+
+ Email: aaron@serendipity.palo-alto.ca.us
+
+
+ Trond Norbye (editor)
+ Sun Microsystems, INC
+ Haakon VII g. 7B
+ Trondheim NO-7485 Trondheim
+ Norway
+
+ Email: trond.norbye@sun.com
+
+
+
+
+
+
+
+
+Stone & Norbye Expires March 1, 2009 [Page 31]