| 1 | Protocol |
|---|
| 2 | -------- |
|---|
| 3 | |
|---|
| 4 | Clients of memcached communicate with server through TCP connections. |
|---|
| 5 | (A UDP interface is also available; details are below under "UDP |
|---|
| 6 | protocol.") A given running memcached server listens on some |
|---|
| 7 | (configurable) port; clients connect to that port, send commands to |
|---|
| 8 | the server, read responses, and eventually close the connection. |
|---|
| 9 | |
|---|
| 10 | There is no need to send any command to end the session. A client may |
|---|
| 11 | just close the connection at any moment it no longer needs it. Note, |
|---|
| 12 | however, that clients are encouraged to cache their connections rather |
|---|
| 13 | than reopen them every time they need to store or retrieve data. This |
|---|
| 14 | is because memcached is especially designed to work very efficiently |
|---|
| 15 | with a very large number (many hundreds, more than a thousand if |
|---|
| 16 | necessary) of open connections. Caching connections will eliminate the |
|---|
| 17 | overhead associated with establishing a TCP connection (the overhead |
|---|
| 18 | of preparing for a new connection on the server side is insignificant |
|---|
| 19 | compared to this). |
|---|
| 20 | |
|---|
| 21 | There are two kinds of data sent in the memcache protocol: text lines |
|---|
| 22 | and unstructured data. Text lines are used for commands from clients |
|---|
| 23 | and responses from servers. Unstructured data is sent when a client |
|---|
| 24 | wants to store or retrieve data. The server will transmit back |
|---|
| 25 | unstructured data in exactly the same way it received it, as a byte |
|---|
| 26 | stream. The server doesn't care about byte order issues in |
|---|
| 27 | unstructured data and isn't aware of them. There are no limitations on |
|---|
| 28 | characters that may appear in unstructured data; however, the reader |
|---|
| 29 | of such data (either a client or a server) will always know, from a |
|---|
| 30 | preceding text line, the exact length of the data block being |
|---|
| 31 | transmitted. |
|---|
| 32 | |
|---|
| 33 | Text lines are always terminated by \r\n. Unstructured data is _also_ |
|---|
| 34 | terminated by \r\n, even though \r, \n or any other 8-bit characters |
|---|
| 35 | may also appear inside the data. Therefore, when a client retrieves |
|---|
| 36 | data from a server, it must use the length of the data block (which it |
|---|
| 37 | will be provided with) to determine where the data block ends, and not |
|---|
| 38 | the fact that \r\n follows the end of the data block, even though it |
|---|
| 39 | does. |
|---|
| 40 | |
|---|
| 41 | Keys |
|---|
| 42 | ---- |
|---|
| 43 | |
|---|
| 44 | Data stored by memcached is identified with the help of a key. A key |
|---|
| 45 | is a text string which should uniquely identify the data for clients |
|---|
| 46 | that are interested in storing and retrieving it. Currently the |
|---|
| 47 | length limit of a key is set at 250 characters (of course, normally |
|---|
| 48 | clients wouldn't need to use such long keys); the key must not include |
|---|
| 49 | control characters or whitespace. |
|---|
| 50 | |
|---|
| 51 | Commands |
|---|
| 52 | -------- |
|---|
| 53 | |
|---|
| 54 | There are three types of commands. |
|---|
| 55 | |
|---|
| 56 | Storage commands (there are three: "set", "add" and "replace") ask the |
|---|
| 57 | server to store some data identified by a key. The client sends a |
|---|
| 58 | command line, and then a data block; after that the client expects one |
|---|
| 59 | line of response, which will indicate success or faulure. |
|---|
| 60 | |
|---|
| 61 | Retrieval commands (there is only one: "get") ask the server to |
|---|
| 62 | retrieve data corresponding to a set of keys (one or more keys in one |
|---|
| 63 | request). The client sends a command line, which includes all the |
|---|
| 64 | requested keys; after that for each item the server finds it sends to |
|---|
| 65 | the client one response line with information about the item, and one |
|---|
| 66 | data block with the item's data; this continues until the server |
|---|
| 67 | finished with the "END" response line. |
|---|
| 68 | |
|---|
| 69 | All other commands don't involve unstructured data. In all of them, |
|---|
| 70 | the client sends one command line, and expects (depending on the |
|---|
| 71 | command) either one line of response, or several lines of response |
|---|
| 72 | ending with "END" on the last line. |
|---|
| 73 | |
|---|
| 74 | A command line always starts with the name of the command, followed by |
|---|
| 75 | parameters (if any) delimited by whitespace. Command names are |
|---|
| 76 | lower-case and are case-sensitive. |
|---|
| 77 | |
|---|
| 78 | Expiration times |
|---|
| 79 | ---------------- |
|---|
| 80 | |
|---|
| 81 | Some commands involve a client sending some kind of expiration time |
|---|
| 82 | (relative to an item or to an operation requested by the client) to |
|---|
| 83 | the server. In all such cases, the actual value sent may either be |
|---|
| 84 | Unix time (number of seconds since January 1, 1970, as a 32-bit |
|---|
| 85 | value), or a number of seconds starting from current time. In the |
|---|
| 86 | latter case, this number of seconds may not exceed 60*60*24*30 (number |
|---|
| 87 | of seconds in 30 days); if the number sent by a client is larger than |
|---|
| 88 | that, the server will consider it to be real Unix time value rather |
|---|
| 89 | than an offset from current time. |
|---|
| 90 | |
|---|
| 91 | |
|---|
| 92 | Error strings |
|---|
| 93 | ------------- |
|---|
| 94 | |
|---|
| 95 | Each command sent by a client may be answered with an error string |
|---|
| 96 | from the server. These error strings come in three types: |
|---|
| 97 | |
|---|
| 98 | - "ERROR\r\n" |
|---|
| 99 | |
|---|
| 100 | means the client sent a nonexistent command name. |
|---|
| 101 | |
|---|
| 102 | - "CLIENT_ERROR <error>\r\n" |
|---|
| 103 | |
|---|
| 104 | means some sort of client error in the input line, i.e. the input |
|---|
| 105 | doesn't conform to the protocol in some way. <error> is a |
|---|
| 106 | human-readable error string. |
|---|
| 107 | |
|---|
| 108 | - "SERVER_ERROR <error>\r\n" |
|---|
| 109 | |
|---|
| 110 | means some sort of server error prevents the server from carrying |
|---|
| 111 | out the command. <error> is a human-readable error string. In cases |
|---|
| 112 | of severe server errors, which make it impossible to continue |
|---|
| 113 | serving the client (this shouldn't normally happen), the server will |
|---|
| 114 | close the connection after sending the error line. This is the only |
|---|
| 115 | case in which the server closes a connection to a client. |
|---|
| 116 | |
|---|
| 117 | |
|---|
| 118 | In the descriptions of individual commands below, these error lines |
|---|
| 119 | are not again specifically mentioned, but clients must allow for their |
|---|
| 120 | possibility. |
|---|
| 121 | |
|---|
| 122 | |
|---|
| 123 | Storage commands |
|---|
| 124 | ---------------- |
|---|
| 125 | |
|---|
| 126 | First, the client sends a command line which looks like this: |
|---|
| 127 | |
|---|
| 128 | <command name> <key> <flags> <exptime> <bytes>\r\n |
|---|
| 129 | |
|---|
| 130 | - <command name> is "set", "add" or "replace" |
|---|
| 131 | |
|---|
| 132 | "set" means "store this data". |
|---|
| 133 | |
|---|
| 134 | "add" means "store this data, but only if the server *doesn't* already |
|---|
| 135 | hold data for this key". |
|---|
| 136 | |
|---|
| 137 | "replace" means "store this data, but only if the server *does* |
|---|
| 138 | already hold data for this key". |
|---|
| 139 | |
|---|
| 140 | - <key> is the key under which the client asks to store the data |
|---|
| 141 | |
|---|
| 142 | - <flags> is an arbitrary 16-bit unsigned integer (written out in |
|---|
| 143 | decimal) that the server stores along with the data and sends back |
|---|
| 144 | when the item is retrieved. Clients may use this as a bit field to |
|---|
| 145 | store data-specific information; this field is opaque to the server. |
|---|
| 146 | Note that in memcached 1.2.1 and higher, flags may be 32-bits, instead |
|---|
| 147 | of 16, but you might want to restrict yourself to 16 bits for |
|---|
| 148 | compatibility with older versions. |
|---|
| 149 | |
|---|
| 150 | - <exptime> is expiration time. If it's 0, the item never expires |
|---|
| 151 | (although it may be deleted from the cache to make place for other |
|---|
| 152 | items). If it's non-zero (either Unix time or offset in seconds from |
|---|
| 153 | current time), it is guaranteed that clients will not be able to |
|---|
| 154 | retrieve this item after the expiration time arrives (measured by |
|---|
| 155 | server time). |
|---|
| 156 | |
|---|
| 157 | - <bytes> is the number of bytes in the data block to follow, *not* |
|---|
| 158 | including the delimiting \r\n. <bytes> may be zero (in which case |
|---|
| 159 | it's followed by an empty data block). |
|---|
| 160 | |
|---|
| 161 | After this line, the client sends the data block: |
|---|
| 162 | |
|---|
| 163 | <data block>\r\n |
|---|
| 164 | |
|---|
| 165 | - <data block> is a chunk of arbitrary 8-bit data of length <bytes> |
|---|
| 166 | from the previous line. |
|---|
| 167 | |
|---|
| 168 | After sending the command line and the data blockm the client awaits |
|---|
| 169 | the reply, which may be: |
|---|
| 170 | |
|---|
| 171 | - "STORED\r\n", to indicate success. |
|---|
| 172 | |
|---|
| 173 | - "NOT_STORED\r\n" to indicate the data was not stored, but not |
|---|
| 174 | because of an error. This normally means that either that the |
|---|
| 175 | condition for an "add" or a "replace" command wasn't met, or that the |
|---|
| 176 | item is in a delete queue (see the "delete" command below). |
|---|
| 177 | |
|---|
| 178 | |
|---|
| 179 | Retrieval command: |
|---|
| 180 | ------------------ |
|---|
| 181 | |
|---|
| 182 | The retrieval command looks like this: |
|---|
| 183 | |
|---|
| 184 | get <key>*\r\n |
|---|
| 185 | |
|---|
| 186 | - <key>* means one or more key strings separated by whitespace. |
|---|
| 187 | |
|---|
| 188 | After this command, the client expects zero or more items, each of |
|---|
| 189 | which is received as a text line followed by a data block. After all |
|---|
| 190 | the items have been transmitted, the server sends the string |
|---|
| 191 | |
|---|
| 192 | "END\r\n" |
|---|
| 193 | |
|---|
| 194 | to indicate the end of response. |
|---|
| 195 | |
|---|
| 196 | Each item sent by the server looks like this: |
|---|
| 197 | |
|---|
| 198 | VALUE <key> <flags> <bytes>\r\n |
|---|
| 199 | <data block>\r\n |
|---|
| 200 | |
|---|
| 201 | - <key> is the key for the item being sent |
|---|
| 202 | |
|---|
| 203 | - <flags> is the flags value set by the storage command |
|---|
| 204 | |
|---|
| 205 | - <bytes> is the length of the data block to follow, *not* including |
|---|
| 206 | its delimiting \r\n |
|---|
| 207 | |
|---|
| 208 | - <data block> is the data for this item. |
|---|
| 209 | |
|---|
| 210 | If some of the keys appearing in a retrieval request are not sent back |
|---|
| 211 | by the server in the item list this means that the server does not |
|---|
| 212 | hold items with such keys (because they were never stored, or stored |
|---|
| 213 | but deleted to make space for more items, or expired, or explicitly |
|---|
| 214 | deleted by a client). |
|---|
| 215 | |
|---|
| 216 | |
|---|
| 217 | |
|---|
| 218 | Deletion |
|---|
| 219 | -------- |
|---|
| 220 | |
|---|
| 221 | The command "delete" allows for explicit deletion of items: |
|---|
| 222 | |
|---|
| 223 | delete <key> <time>\r\n |
|---|
| 224 | |
|---|
| 225 | - <key> is the key of the item the client wishes the server to delete |
|---|
| 226 | |
|---|
| 227 | - <time> is the amount of time in seconds (or Unix time until which) |
|---|
| 228 | the client wishes the server to refuse "add" and "replace" commands |
|---|
| 229 | with this key. For this amount of item, the item is put into a |
|---|
| 230 | delete queue, which means that it won't possible to retrieve it by |
|---|
| 231 | the "get" command, but "add" and "replace" command with this key |
|---|
| 232 | will also fail (the "set" command will succeed, however). After the |
|---|
| 233 | time passes, the item is finally deleted from server memory. |
|---|
| 234 | |
|---|
| 235 | The parameter <time> is optional, and, if absent, defaults to 0 |
|---|
| 236 | (which means that the item will be deleted immediately and further |
|---|
| 237 | storage commands with this key will succeed). |
|---|
| 238 | |
|---|
| 239 | The response line to this command can be one of: |
|---|
| 240 | |
|---|
| 241 | - "DELETED\r\n" to indicate success |
|---|
| 242 | |
|---|
| 243 | - "NOT_FOUND\r\n" to indicate that the item with this key was not |
|---|
| 244 | found. |
|---|
| 245 | |
|---|
| 246 | See the "flush_all" command below for immediate invalidation |
|---|
| 247 | of all existing items. |
|---|
| 248 | |
|---|
| 249 | |
|---|
| 250 | Increment/Decrement |
|---|
| 251 | ------------------- |
|---|
| 252 | |
|---|
| 253 | Commands "incr" and "decr" are used to change data for some item |
|---|
| 254 | in-place, incrementing or decrementing it. The data for the item is |
|---|
| 255 | treated as decimal representation of a 32-bit unsigned integer. If the |
|---|
| 256 | current data value does not conform to such a representation, the |
|---|
| 257 | commands behave as if the value were 0. Also, the item must already |
|---|
| 258 | exist for incr/decr to work; these commands won't pretend that a |
|---|
| 259 | non-existent key exists with value 0; instead, they will fail. |
|---|
| 260 | |
|---|
| 261 | The client sends the command line: |
|---|
| 262 | |
|---|
| 263 | incr <key> <value>\r\n |
|---|
| 264 | |
|---|
| 265 | or |
|---|
| 266 | |
|---|
| 267 | decr <key> <value>\r\n |
|---|
| 268 | |
|---|
| 269 | - <key> is the key of the item the client wishes to change |
|---|
| 270 | |
|---|
| 271 | - <value> is the amount by which the client wants to increase/decrease |
|---|
| 272 | the item. It is a decimal representation of a 32-bit unsigned integer. |
|---|
| 273 | |
|---|
| 274 | The response will be one of: |
|---|
| 275 | |
|---|
| 276 | - "NOT_FOUND\r\n" to indicate the item with this value was not found |
|---|
| 277 | |
|---|
| 278 | - <value>\r\n , where <value> is the new value of the item's data, |
|---|
| 279 | after the increment/decrement operation was carried out. |
|---|
| 280 | |
|---|
| 281 | Note that underflow in the "decr" command is caught: if a client tries |
|---|
| 282 | to decrease the value below 0, the new value will be 0. Overflow in |
|---|
| 283 | the "incr" command is not checked. |
|---|
| 284 | |
|---|
| 285 | Note also that decrementing a number such that it loses length isn't |
|---|
| 286 | guaranteed to decrement its returned length. The number MAY be |
|---|
| 287 | space-padded at the end, but this is purely an implementation |
|---|
| 288 | optimization, so you also shouldn't rely on that. |
|---|
| 289 | |
|---|
| 290 | Statistics |
|---|
| 291 | ---------- |
|---|
| 292 | |
|---|
| 293 | The command "stats" is used to query the server about statistics it |
|---|
| 294 | maintains and other internal data. It has two forms. Without |
|---|
| 295 | arguments: |
|---|
| 296 | |
|---|
| 297 | stats\r\n |
|---|
| 298 | |
|---|
| 299 | it causes the server to output general-purpose statistics and |
|---|
| 300 | settings, documented below. In the other form it has some arguments: |
|---|
| 301 | |
|---|
| 302 | stats <args>\r\n |
|---|
| 303 | |
|---|
| 304 | Depending on <args>, various internal data is sent by the server. The |
|---|
| 305 | kinds of arguments and the data sent are not documented in this vesion |
|---|
| 306 | of the protocol, and are subject to change for the convenience of |
|---|
| 307 | memcache developers. |
|---|
| 308 | |
|---|
| 309 | |
|---|
| 310 | General-purpose statistics |
|---|
| 311 | -------------------------- |
|---|
| 312 | |
|---|
| 313 | Upon receiving the "stats" command without arguments, the server sents |
|---|
| 314 | a number of lines which look like this: |
|---|
| 315 | |
|---|
| 316 | STAT <name> <value>\r\n |
|---|
| 317 | |
|---|
| 318 | The server terminates this list with the line |
|---|
| 319 | |
|---|
| 320 | END\r\n |
|---|
| 321 | |
|---|
| 322 | In each line of statistics, <name> is the name of this statistic, and |
|---|
| 323 | <value> is the data. The following is the list of all names sent in |
|---|
| 324 | response to the "stats" command, together with the type of the value |
|---|
| 325 | sent for this name, and the meaning of the value. |
|---|
| 326 | |
|---|
| 327 | In the type column below, "32u" means a 32-bit unsigned integer, "64u" |
|---|
| 328 | means a 64-bit unsigner integer. '32u:32u' means two 32-but unsigned |
|---|
| 329 | integers separated by a colon. |
|---|
| 330 | |
|---|
| 331 | |
|---|
| 332 | Name Type Meaning |
|---|
| 333 | ---------------------------------- |
|---|
| 334 | pid 32u Process id of this server process |
|---|
| 335 | uptime 32u Number of seconds this server has been running |
|---|
| 336 | time 32u current UNIX time according to the server |
|---|
| 337 | version string Version string of this server |
|---|
| 338 | rusage_user 32u:32u Accumulated user time for this process |
|---|
| 339 | (seconds:microseconds) |
|---|
| 340 | rusage_system 32u:32u Accumulated system time for this process |
|---|
| 341 | (seconds:microseconds) |
|---|
| 342 | curr_items 32u Current number of items stored by the server |
|---|
| 343 | total_items 32u Total number of items stored by this server |
|---|
| 344 | ever since it started |
|---|
| 345 | bytes 64u Current number of bytes used by this server |
|---|
| 346 | to store items |
|---|
| 347 | curr_connections 32u Number of open connections |
|---|
| 348 | total_connections 32u Total number of connections opened since |
|---|
| 349 | the server started running |
|---|
| 350 | connection_structures 32u Number of connection structures allocated |
|---|
| 351 | by the server |
|---|
| 352 | cmd_get 64u Cumulative number of retrieval requests |
|---|
| 353 | cmd_set 64u Cumulative number of storage requests |
|---|
| 354 | get_hits 64u Number of keys that have been requested and |
|---|
| 355 | found present |
|---|
| 356 | get_misses 64u Number of items that have been requested |
|---|
| 357 | and not found |
|---|
| 358 | evictions 64u Number of valid items removed from cache |
|---|
| 359 | to free memory for new items |
|---|
| 360 | bytes_read 64u Total number of bytes read by this server |
|---|
| 361 | from network |
|---|
| 362 | bytes_written 64u Total number of bytes sent by this server to |
|---|
| 363 | network |
|---|
| 364 | limit_maxbytes 32u Number of bytes this server is allowed to |
|---|
| 365 | use for storage. |
|---|
| 366 | |
|---|
| 367 | |
|---|
| 368 | |
|---|
| 369 | Other commands |
|---|
| 370 | -------------- |
|---|
| 371 | |
|---|
| 372 | "flush_all" is a command with an optional numeric argument. It always |
|---|
| 373 | succeeds, and the server sends "OK\r\n" in response. Its effect is to |
|---|
| 374 | invalidate all existing items immediately (by default) or after the |
|---|
| 375 | expiration specified. After invalidation none of the items will be returned |
|---|
| 376 | in response to a retrieval command (unless it's stored again under the |
|---|
| 377 | same key *after* flush_all has invalidated the items). flush_all doesn't |
|---|
| 378 | actually free all the memory taken up by existing items; that will |
|---|
| 379 | happen gradually as new items are stored. The most precise definition |
|---|
| 380 | of what flush_all does is the following: it causes all items whose |
|---|
| 381 | update time is earlier than the time at which flush_all was set to be |
|---|
| 382 | executed to be ignored for retrieval purposes. |
|---|
| 383 | |
|---|
| 384 | The intent of flush_all with a delay, was that in a setting where you |
|---|
| 385 | have a pool of memcached servers, and you need to flush all content, |
|---|
| 386 | you have the option of not resetting all memcached servers at the |
|---|
| 387 | same time (which could e.g. cause a spike in database load with all |
|---|
| 388 | clients suddenly needing to recreate content that would otherwise |
|---|
| 389 | have been found in the memcached daemon). |
|---|
| 390 | |
|---|
| 391 | The delay option allows you to have them reset in e.g. 10 second |
|---|
| 392 | intervals (by passing 0 to the first, 10 to the second, 20 to the |
|---|
| 393 | third, etc. etc.). |
|---|
| 394 | |
|---|
| 395 | |
|---|
| 396 | "version" is a command with no arguments: |
|---|
| 397 | |
|---|
| 398 | version\r\n |
|---|
| 399 | |
|---|
| 400 | In response, the server sends |
|---|
| 401 | |
|---|
| 402 | "VERSION <version>\r\n", where <version> is the version string for the |
|---|
| 403 | server. |
|---|
| 404 | |
|---|
| 405 | "verbosity" is a command with a numeric argument. It always |
|---|
| 406 | succeeds, and the server sends "OK\r\n" in response. Its effect is to |
|---|
| 407 | set the verbosity level of the logging output. |
|---|
| 408 | |
|---|
| 409 | "quit" is a command with no arguments: |
|---|
| 410 | |
|---|
| 411 | quit\r\n |
|---|
| 412 | |
|---|
| 413 | Upon receiving this command, the server closes the |
|---|
| 414 | connection. However, the client may also simply close the connection |
|---|
| 415 | when it no longer needs it, without issuing this command. |
|---|
| 416 | |
|---|
| 417 | |
|---|
| 418 | UDP protocol |
|---|
| 419 | ------------ |
|---|
| 420 | |
|---|
| 421 | For very large installations where the number of clients is high enough |
|---|
| 422 | that the number of TCP connections causes scaling difficulties, there is |
|---|
| 423 | also a UDP-based interface. The UDP interface does not provide guaranteed |
|---|
| 424 | delivery, so should only be used for operations that aren't required to |
|---|
| 425 | succeed; typically it is used for "get" requests where a missing or |
|---|
| 426 | incomplete response can simply be treated as a cache miss. |
|---|
| 427 | |
|---|
| 428 | Each UDP datagram contains a simple frame header, followed by data in the |
|---|
| 429 | same format as the TCP protocol described above. In the current |
|---|
| 430 | implementation, requests must be contained in a single UDP datagram, but |
|---|
| 431 | responses may span several datagrams. (The only common requests that would |
|---|
| 432 | span multiple datagrams are huge multi-key "get" requests and "set" |
|---|
| 433 | requests, both of which are more suitable to TCP transport for reliability |
|---|
| 434 | reasons anyway.) |
|---|
| 435 | |
|---|
| 436 | The frame header is 8 bytes long, as follows (all values are 16-bit integers |
|---|
| 437 | in network byte order, high byte first): |
|---|
| 438 | |
|---|
| 439 | 0-1 Request ID |
|---|
| 440 | 2-3 Sequence number |
|---|
| 441 | 4-5 Total number of datagrams in this message |
|---|
| 442 | 6-7 Reserved for future use; must be 0 |
|---|
| 443 | |
|---|
| 444 | The request ID is supplied by the client. Typically it will be a |
|---|
| 445 | monotonically increasing value starting from a random seed, but the client |
|---|
| 446 | is free to use whatever request IDs it likes. The server's response will |
|---|
| 447 | contain the same ID as the incoming request. The client uses the request ID |
|---|
| 448 | to differentiate between responses to outstanding requests if there are |
|---|
| 449 | several pending from the same server; any datagrams with an unknown request |
|---|
| 450 | ID are probably delayed responses to an earlier request and should be |
|---|
| 451 | discarded. |
|---|
| 452 | |
|---|
| 453 | The sequence number ranges from 0 to n-1, where n is the total number of |
|---|
| 454 | datagrams in the message. The client should concatenate the payloads of the |
|---|
| 455 | datagrams for a given response in sequence number order; the resulting byte |
|---|
| 456 | stream will contain a complete response in the same format as the TCP |
|---|
| 457 | protocol (including terminating \r\n sequences). |
|---|