Memcache (memcachex v0.5.7) View Source

This module provides a user friendly API to interact with the memcached server.

Examples

{:ok, pid} = Memcache.start_link()
{:ok} = Memcache.set(pid, "hello", "world")
{:ok, "world"} = Memcache.get(pid, "hello")

Coder

Memcache.Coder allows you to specify how the value should be encoded before sending it to the server and how it should be decoded after it is retrieved. There are four built-in coders namely Memcache.Coder.Raw, Memcache.Coder.Erlang, Memcache.Coder.JSON, Memcache.Coder.ZIP. Custom coders can be created by implementing the Memcache.Coder behaviour.

CAS

CAS feature allows to atomically perform two commands on a key. Get the cas version number associated with a key during the first command and pass that value during the second command. The second command will fail if the value has changed by someone else in the mean time.

{:ok, "hello", cas} = Memcache.get(pid, "key", cas: true)
{:ok} = Memcache.set_cas(pid, "key", "world", cas)

Memcache module provides a *_cas variant for most of the functions. This function will take an additional argument named cas and returns the same value as their counterpart except in case of CAS error. In case of CAS error the returned value would be equal to {:error, "Key exists"}

Telemetry

The following telemetry events are published:

  • [:memcachex, :commands] - executed for every successful commands

    • Measurements
      • :elapsed_time - (integer - native time unit) the time it took to send the commands to the server and get a reply.
    • Metadata
      • :server - (binary) hostname and port of the server
      • :commands - (list) list of command
      • :results - (list) list of response from the server
      • :start_time - (integer - native time unit) system time when the commands were issued
  • [:memcachex, :commands_error] - executed for every failed commands

    • Measurements
      • :elapsed_time - (integer - native time unit) the time it took to send the commands to the server and get a reply.
    • Metadata
      • :server - (binary) hostname and port of the server
      • :commands - (list) list of command
      • :reason - (atom) error reason
      • :start_time - (integer - native time unit) system time when the commands were issued
  • [:memcachex, :connection] - executed after successful connection.

    • Metadata
      • :server - (binary) hostname and port of the server
      • :reconnected - (boolean) set to true for reconnection
  • [:memcachex, :connection_error] - executed on connection failure.

    • Metadata
      • :server - (binary) hostname and port of the server
      • :reason - (atom) error reason

Options

Most the functions in this module accept an optional Keyword list. The below list specifies the behavior of each option. The list of option accepted by a specific function will be documented in the specific function.

  • :cas - (boolean) returns the CAS value associated with the data. This value will be either in second or third position of the returned tuple depending on the command. Defaults to false.

  • :ttl - (integer) specifies the expiration time in seconds for the corresponding key. Can be set to 0 to disable expiration. The Default value can be configured using start_link/2.

Link to this section Summary

Functions

Sets the key to value if the key doesn't exist already. Returns {:error, "Key exists"} if the given key already exists.

Appends the value to the end of the current value of the key. Returns {:error, "Item not stored"} if the item is not present in the server already

Appends the value to the end of the current value of the key if the CAS value is equal to the provided value

Compare and swap value using optimistic locking.

Decrements the current value. Only integer value can be decremented. Returns {:error, "Incr/Decr on non-numeric value"} if the value stored in the server is not numeric.

Decrements the current value if the CAS value is equal to the provided value.

Removes the item with the given key value. Returns {:error, "Key not found"} if the given key is not found

Removes the item with the given key value if the CAS value is equal to the provided value

Flush all the items in the server. ttl option will cause the flush to be delayed by the specified time.

Gets the value associated with the key. Returns {:error, "Key not found"} if the given key doesn't exist.

Increments the current value. Only integer value can be incremented. Returns {:error, "Incr/Decr on non-numeric value"} if the value stored in the server is not numeric.

Increments the current value if the CAS value is equal to the provided value.

Gets the values associated with the list of keys. Returns a map. Keys that are not found in the server are filtered from the result.

Multi version of set/4. Accepts a map or a list of {key, value}.

Multi version of set_cas/4. Accepts a list of {key, value, cas}.

Sends a noop command

Prepends the value to the start of the current value of the key. Returns {:error, "Item not stored"} if the item is not present in the server already

Prepends the value to the start of the current value of the key if the CAS value is equal to the provided value

Sets the key to value if the key already exists. Returns {:error, "Key not found"} if the given key doesn't exist.

Sets the key to value if the key already exists and has CAS value equal to the provided value.

Sets the key to value

Sets the key to value if the key exists and has CAS value equal to the provided value

Gets the default set of server statistics

Gets the specific set of server statistics

Closes the connection to the memcached server.

Gets the version of the server

Link to this section Types

Specs

error() :: {:error, binary() | atom()}
Link to this type

fetch_integer_result()

View Source

Specs

fetch_integer_result() ::
  {:ok, integer()} | {:ok, integer(), integer()} | error()

Specs

fetch_result() :: {:ok, any()} | {:ok, any(), integer()} | error()

Specs

result() ::
  {:ok} | {:ok, integer()} | {:ok, any()} | {:ok, any(), integer()} | error()

Specs

store_result() :: {:ok} | {:ok, integer()} | error()

Specs

value() :: term()

Link to this section Functions

Link to this function

add(server, key, value, opts \\ [])

View Source

Specs

Sets the key to value if the key doesn't exist already. Returns {:error, "Key exists"} if the given key already exists.

Accepted options: :cas, :ttl

Link to this function

append(server, key, value, opts \\ [])

View Source

Specs

Appends the value to the end of the current value of the key. Returns {:error, "Item not stored"} if the item is not present in the server already

Accepted options: :cas

Link to this function

append_cas(server, key, value, cas, opts \\ [])

View Source

Specs

append_cas(GenServer.server(), binary(), value(), integer(), Keyword.t()) ::
  store_result()

Appends the value to the end of the current value of the key if the CAS value is equal to the provided value

Accepted options: :cas

Link to this function

cas(server, key, update, opts \\ [])

View Source

Specs

cas(GenServer.server(), binary(), (value() -> value()), Keyword.t()) ::
  {:ok, any()} | error()

Compare and swap value using optimistic locking.

"Happy path":

  1. Get the existing value for key
  2. If it exists, call the update function with the value
  3. Set the returned value for key

The update can be retried in case an intervening update happened.

A default value can also be provided, to be used if the key does not yet exist.

See the description of options below for details.

Options

  • :retry - whether the update should be retried if someone else has updated the value for the same key in the meantime. Defaults to true.

  • :ttl - TTL for the updated key. Defaults to the TTL passed when starting the server via start_link/2, or infinity if none was given there either.

  • :default - a default value to use if the key does not yet exist. If a 0-arity function is passed for this value, the default value will be lazily evaluated only when needed. This is useful in cases where the default is expensive to compute. If a :default opt is not passed, the function will return {:error, "Key not found"} when attempting to update a nonexistent key.
    NOTE: If a key is created after the initial GET and before the default value is ADDed, the update will be retried at least once regardless of the value of the :retry opt.

Link to this function

decr(server, key, opts \\ [])

View Source

Specs

Decrements the current value. Only integer value can be decremented. Returns {:error, "Incr/Decr on non-numeric value"} if the value stored in the server is not numeric.

Options

  • :by - (integer) The amount to add to the existing value. Defaults to 1.

  • :default - (integer) Default value to use in case the key is not found. Defaults to 0.

other options: :cas, :ttl

Link to this function

decr_cas(server, key, cas, opts \\ [])

View Source

Specs

Decrements the current value if the CAS value is equal to the provided value.

Options

  • :by - (integer) The amount to add to the existing value. Defaults to 1.

  • :default - (integer) Default value to use in case the key is not found. Defaults to 0.

other options: :cas, :ttl

Specs

Removes the item with the given key value. Returns {:error, "Key not found"} if the given key is not found

Link to this function

delete_cas(server, key, cas)

View Source

Specs

delete_cas(GenServer.server(), binary(), integer()) :: store_result()

Removes the item with the given key value if the CAS value is equal to the provided value

Link to this function

flush(server, opts \\ [])

View Source

Specs

Flush all the items in the server. ttl option will cause the flush to be delayed by the specified time.

Accepted options: :ttl

Link to this function

get(server, key, opts \\ [])

View Source

Specs

Gets the value associated with the key. Returns {:error, "Key not found"} if the given key doesn't exist.

Accepted option: :cas

Link to this function

incr(server, key, opts \\ [])

View Source

Specs

Increments the current value. Only integer value can be incremented. Returns {:error, "Incr/Decr on non-numeric value"} if the value stored in the server is not numeric.

Options

  • :by - (integer) The amount to add to the existing value. Defaults to 1.

  • :default - (integer) Default value to use in case the key is not found. Defaults to 0.

other options: :cas, :ttl

Link to this function

incr_cas(server, key, cas, opts \\ [])

View Source

Specs

Increments the current value if the CAS value is equal to the provided value.

Options

  • :by - (integer) The amount to add to the existing value. Defaults to 1.

  • :default - (integer) Default value to use in case the key is not found. Defaults to 0.

other options: :cas, :ttl

Link to this function

multi_get(server, keys, opts \\ [])

View Source

Specs

multi_get(GenServer.server(), [binary()], Keyword.t()) :: {:ok, map()} | error()

Gets the values associated with the list of keys. Returns a map. Keys that are not found in the server are filtered from the result.

Accepted option: :cas

Link to this function

multi_set(server, commands, opts \\ [])

View Source

Specs

multi_set(GenServer.server(), [{binary(), value()}] | map(), Keyword.t()) ::
  {:ok, [store_result()]} | error()

Multi version of set/4. Accepts a map or a list of {key, value}.

Accepted options: :cas, :ttl

Link to this function

multi_set_cas(server, commands, opts \\ [])

View Source

Specs

multi_set_cas(GenServer.server(), [{binary(), value(), integer()}], Keyword.t()) ::
  {:ok, [store_result()]} | error()

Multi version of set_cas/4. Accepts a list of {key, value, cas}.

Accepted options: :cas, :ttl

Specs

noop(GenServer.server()) :: {:ok} | error()

Sends a noop command

Link to this function

prepend(server, key, value, opts \\ [])

View Source

Specs

Prepends the value to the start of the current value of the key. Returns {:error, "Item not stored"} if the item is not present in the server already

Accepted options: :cas

Link to this function

prepend_cas(server, key, value, cas, opts \\ [])

View Source

Specs

prepend_cas(GenServer.server(), binary(), value(), integer(), Keyword.t()) ::
  store_result()

Prepends the value to the start of the current value of the key if the CAS value is equal to the provided value

Accepted options: :cas

Link to this function

replace(server, key, value, opts \\ [])

View Source

Specs

Sets the key to value if the key already exists. Returns {:error, "Key not found"} if the given key doesn't exist.

Accepted options: :cas, :ttl

Link to this function

replace_cas(server, key, value, cas, opts \\ [])

View Source

Specs

replace_cas(GenServer.server(), binary(), value(), integer(), Keyword.t()) ::
  store_result()

Sets the key to value if the key already exists and has CAS value equal to the provided value.

Accepted options: :cas, :ttl

Link to this function

set(server, key, value, opts \\ [])

View Source

Specs

Sets the key to value

Accepted options: :cas, :ttl

Link to this function

set_cas(server, key, value, cas, opts \\ [])

View Source

Specs

Sets the key to value if the key exists and has CAS value equal to the provided value

Accepted options: :cas, :ttl

Link to this function

start_link(connection_options \\ [], options \\ [])

View Source

Specs

start_link(Keyword.t(), Keyword.t()) :: GenServer.on_start()

Creates a connection using Memcache.Connection.start_link/2

Connection Options

This is a superset of the connection options accepted by the Memcache.Connection.start_link/2. The following list specifies the additional options.

  • :ttl - (integer) a default expiration time in seconds. This value will be used if the :ttl value is not specified for a operation. Defaults to 0(means forever).

  • :namespace - (string) prepend each key with the given value.

  • :key_coder - ({module, function}) Used to transform the key completely. The function needs to accept one argument, the key and return a new key.

  • :coder - (module | {module, options}) Can be either a module or tuple contains the module and options. Defaults to {Memcache.Coder.Raw, []}.

Options

The second option is passed directly to the underlying GenServer.start_link/3, so it can be used to create named process.

Specs

stat(GenServer.server()) :: {:ok, map()} | error()

Gets the default set of server statistics

Specs

stat(GenServer.server(), String.t()) :: {:ok, map()} | error()

Gets the specific set of server statistics

Specs

stop(GenServer.server()) :: {:ok}

Closes the connection to the memcached server.

Specs

version(GenServer.server()) :: String.t() | error()

Gets the version of the server