You can use this operation for a document you want to change, or
for a document you want to read, but not necessarily update or
edit. In this first scenario where you want to change a value,
you would perform a get and assign the
value that Couchbase returns to a variable. After you change the
value of the variable, you would store the new value to
Couchbase Server with one of the store or update methods:
set, add,
replace or for optimistic concurrency,
cas. For instance, following our
example of a spaceship game, the case of spaceship fuel is a
scenario where you will probably constantly change fuel level
with player interaction. In this case, you could perform a
retrieve, update and then store.
There are also cases where you could use
get to retrieve a value, but only as a
read-only operation. An example of when you do want to read in
the value but not change the value is if you have a game with
player profiles. Imagine you have documents that represent
different users and their attributes. The user profile are part
of the player experience, but game play does not change the
profile or their properties, such as contact information. In
this case, we perform get to retrieve
and display a play profile.
A related scenario is when we use a get
to determine if a key exists, and if it does not exist, perform
some action. For instance, if a player creates a user profile,
we could try to read in the player profile with
get, and if it does not exist, we can
create the new profile including information such as the player
email address:
Developers who are starting with Couchbase Server will rely
heavily on get/set requests to do all
of their read and write operations. The majority of the time,
get/set operations are the most useful
Couchbase methods for your application.
Over time, developers discover other Couchbase methods, and the
benefits to using alternative read/write operations in their
application logic. One advantage is that applications in
multi-user environments may inadvertently overwrite the latest
key you retrieve using only get/set,
therefore in a multi-user environment you might not be able to
always rely on that value being valid and current if you plan to
perform operations on it after the get.
In this case, there are alternate methods, such as get-with-cas
and cas that can provide optimistic
concurrency.
There is one problem you can encounter if you use
get to make sure that a key exists
before they perform some operation. This can cause problems if
the value for a key is large and can result in slower
application performance. An alternate, more efficient way to
test if a key exists, without retrieving the whole key, is to
use touch, which only updates the
expiration, but does not retrieve the whole value. Even this
approach has a drawback; you can use
touch to determine the key exists, but
you will be working on the assumption that the item does not
expire by the time you perform your next operation on it.
The other important assumption you are making when you use this approach is that when you touch to test for existence of an item, you must overwrite the TTL at the same time. If you know an item does not have an expiration, then you can use the touch approach as a workaround. If your application depends on the item expiration, you should not use the touch approach because this would overwrite your expiration.
Finally, if you use get make sure you
are aware of the value size, and how many times you are
repeatedly performing the operation. There may be alternate
convenience methods which can handle your task with a less
resource-consuming request.
The simplest case of retrieving information is by using
get with a single key. Here is an
example in Ruby:
c.get("foo")
The following PHP example demonstrates use of
get to retrieve a user password from
Couchbase Server and compare it to a password provided in a web
form:
$submitted_passwordHash = sha1($password); $db_passwordHash = $cb_obj -> get($userid_key); if($db_passwordHash == false) { return (false); } //do we match the password? if($db_passwordHash == $submitted_passwordHash) { $_SESSION{"userid"} = $userid; return true; } else { return false; }
In this case we perform $userid_key and
$password are based on parameters a user
provides in a web form. We perform a
get with $userid_key
to retrieve the user password which is stored in Couchbase
Server. If the password provided in the form matches the
password in Couchbase Server, we create a new user session,
otherwise we return false.
The memcached protocol which relate to this method are
get and getk.
These first is the operation for retrieving an item; the later
is for getting the value and the key. For more information about
memcached protocol, see
memcached
protocol.
If a key does not exist, you will receive a 'key not found' type
error as a response to get. If you
expected the key to actually exist, you should check your
application logic to see why it does not exist. Any logic that
creates that type of key, or any logic that deletes it may
inadvertently cause this result. Another reason why you might
get this error is that the item expired; in this case Couchbase
Server will respond to the request with a 'key not found' error.
So you will also want to check any explicit expiration set for
that key.
In the case where you use a get to
determine if key does not exist and then store it, you can
attempt a set or
add to create the key.
The types of errors that can occur during this operation include 1) inability to connect to a node, or 2) some error exists while attempting to format a value being retrieved. If you have a connection-level error you may need to reattempt connection, and possibly check the status of the server. If you have an error with the size of your value or formatting, you need to check the value itself, and how it is encoded and see if there are any issues that make the document incompatible with Couchbase Server.
For more information about connections and connection-level settings, see Section 7.5.4, “Optimizing Client Instances” and Section 7.7.1, “Client-Side Timeouts”
There are variations for parameters used in the
get depending on the SDK. For instance,
some SDKs, such as the one for Java, support providing a
transcoder that will manipulate a value after it retrieves it
(for instance, remove and replace underscores with spaces.)
Refer to an individual SDK's API documentation for more
information.