Memcache::add
(PECL memcache >= 0.2.0)
Memcache::add — Add an item to the server
Описание
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.
Список параметров
-
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).
Возвращаемые значения
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Returns FALSE
if such key already exist. For the rest
Memcache::add() behaves similarly to
Memcache::set().
Примеры
Пример #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);
?>
Смотрите также
- Memcache::set() - Store data at the server
- Memcache::replace() - Replace value of the existing item
- Функция Memcache::add() - Add an item to the server
- Функция Memcache::addServer() - Add a memcached server to connection pool
- Функция Memcache::close() - Close memcached server connection
- Функция Memcache::connect() - Open memcached server connection
- Функция Memcache::decrement() - Decrement item's value
- Функция Memcache::delete() - Delete item from the server
- Функция Memcache::flush() - Flush all existing items at the server
- Функция Memcache::get() - Retrieve item from the server
- Функция Memcache::getExtendedStats() - Get statistics from all servers in pool
- Функция Memcache::getServerStatus() - Returns server status
- Функция Memcache::getStats() - Get statistics of the server
- Функция Memcache::getVersion() - Return version of the server
- Функция Memcache::increment() - Increment item's value
- Функция Memcache::pconnect() - Open memcached server persistent connection
- Функция Memcache::replace() - Replace value of the existing item
- Функция Memcache::set() - Store data at the server
- Функция Memcache::setCompressThreshold() - Enable automatic compression of large values
- Функция Memcache::setServerParams() - Changes server parameters and status at runtime
Коментарии
[c.2007]
if you read source code for MMC_SERIALIZED you will see at line ~1555 that [a line ~1560]
!(is_string,is_long,is_double,is_bool)
[is] serialized and that serialized values are flaged as MMC_SERIALIZED for return (fetch) code unserialize these values again
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;
?>
It's also good to note that add will succeed if the key exists but is expired
Race conditions happen on an heavy load server when more than one thread tries to execute memcache_add.
For example if thread A and thread B try to save the same key you can test that sometimes both return TRUE.
To have the right behaviour you can verify that the correct value is in the assigned key:
<?php
function memcache_safeadd(&$memcache_obj, $key, $value, $flag, $expire)
{
if (memcache_add($memcache_obj, $key, $value, $flag, $expire))
{
return ($value == memcache_get($memcache_obj, $key));
}
return FALSE;
}
?>
It looks like add() function is truly 100% atomic, and safeadd bicycle mentioned in the other comment is useless. There are few links where developers of Memcahed explained it deeper
http://lists.danga.com/pipermail/memcached/2008-March/006647.html
http://www.serverphorums.com/read.php?9,214222