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,214222Memcache::add
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Memcache::add
Референца за `memcache.add.php` со подобрена типографија и навигација.
Memcache::add
memcache_add
(PECL memcache >= 0.2.0)
Memcache::add -- memcache_add — Додај ставка на серверот
= NULL
— Lightweight Directory Access Protocol
$memcache,string
$key,mixed
$var,int
$flag = ?,int
$expire = ?): bool
Memcache::add() чува променлива
var with key само ако таков клуч сè уште не постои на серверот.
Параметри
key- Клучот што ќе биде поврзан со ставката.
var- Променливата за складирање. Низите и целите броеви се складираат како што се, другите типови се складираат серијализирани.
flag-
од PHP 8.0.0. Силно се обесхрабрува потпирањето на оваа функција.
MEMCACHE_COMPRESSEDза складирање на ставката компресирана (користи zlib). expire- Време на истекување на ставката. Ако е еднакво на нула, ставката никогаш нема да истече. Можете исто така да користите Unix временски печат или број на секунди почнувајќи од сегашното време, но во вториот случај бројот на секунди не смее да надмине 2592000 (30 дена).
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true на успех или false при неуспех. Враќа false ако таков клуч веќе постои. За останатите
Memcache::add() се однесува слично на
Ако е присутен, знамињата преземени заедно со вредностите ќе бидат запишани во овој параметар. Овие знамиња се исти како оние дадени на, на пример,.
Примери
Пример #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::replace() - Отвора постојана врска со memcached серверот
Белешки од корисници 5 белешки
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;
}
?>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;
?>[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