It's also good to note that add will succeed if the key exists but is expired
Memcache::add
(PECL memcache >= 0.2.0)
Memcache::add — Add an item to the server
Opis
Memcache::add() stores variable var with key only if such key doesn't exist at the server yet. Also you can use memcache_add() function.
Parametry
- key
-
The key that will be associated with the item.
- var
-
The variable to store. Strings and integers are stored as is, other types are stored serialized.
- flag
-
Use MEMCACHE_COMPRESSED to store the item compressed (uses zlib).
- expire
-
Expiration time of the item. If it's equal to zero, the item will never expire. You can also use Unix timestamp or a number of seconds starting from current time, but in the latter case the number of seconds may not exceed 2592000 (30 days).
Zwracane wartości
Zwraca TRUE w przypadku powodzenia, FALSE w przypadku błędu. Returns FALSE if such key already exist. For the rest Memcache::add() behaves similarly to Memcache::set().
Przykłady
Przykład #1 Memcache::add() example
<?php
$memcache_obj = memcache_connect("localhost", 11211);
/* procedural API */
memcache_add($memcache_obj, 'var_key', 'test variable', false, 30);
/* OO API */
$memcache_obj->add('var_key', 'test variable', false, 30);
?>
Zobacz też:
- Memcache::set() - Store data at the server
- Memcache::replace() - Replace value of the existing item
Memcache::add
04-Aug-2009 01:39
27-Apr-2009 11:08
skeleton of a thread safe updater for an incremental counter:
<?php
$key = "counter";
$value = $memcache->increment($key, 1);
if ($value === false) {
// --- read from DB ---
$query = "SELECT value FROM database";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
$db_value = $row["value"];
$add_value = $memcache->add($key, $db_value + 1, 0, 0);
if ($add_value === false) {
$value = $memcache->increment($key, 1)
if ($value === false) {
error_log ("counter update failed.");
}
} else {
$value = $db_value + 1;
}
}
// --- display counter value ---
echo $value;
?>
18-Feb-2009 08:47
If you want to add an entry without using the locking method below (takes up extra space), try it this way:
<?php
if(!$mc->replace("key", $data))
$mc->set("key", $data;
?>
That way it will simply try to overwrite the value if a user has already (re)created the key. This is best in high-traffic sites where a user set()'s the data while another user has already tried a get() check and found nothing. Even this method still leaves a small microsecond window open for the same thing. However it helps prevent nasty glitches with submitting multiple entries after a get() check and the system has taken time to recompile the data to send to Memcached, after another user's request has processed this transaction.
06-Oct-2008 06:04
Key may not exceed 250 chars according to memcached protocol.
03-Apr-2008 04:32
memcache has no locking mechanism, but you could implement it manually.
basic locking through the add method:
<?php
// locks time out after 5 seconds
Define( 'LOCK_TIMEOUT', 5 );
$lock = $memcache->add( 'lock:' . $key, 1, false, LOCK_TIMEOUT );
if ( $lock ) {
// no lock on this key, so do what you want
$value = $memcache->get( $key );
$memcache->set( $key, $value+1 );
// release lock
$memcache->delete( 'lock:' . $key );
}
else {
// variable is currently locked, so do something else
}
?>
furthermore, you could implement a loop which checks if there is a lock, and if there is, wait some time and try again, until the lock is free.
remember: locking will heavily increase your memcache hits and obviously is not what memcache is made for. altough it's not possible for a lock to be forgotten (there's a timeout after all) there is the possibility to get locked out for a very long time.
an alternative may be to implement locking through apc_add (or shared memory), but i've never tried it.
if you absolutley have to implement locks, memcached is probably the wrong solution anyway.
18-Jun-2007 05:13
if you read source code for MMC_SERIALIZED you will see at line ~1555 that only !(is_string,is_long,is_double,is_bool) are serialized
and that serialized values are flaged as MMC_SERIALIZED for return (fetch) code unserialize these values again
