(PECL memcache >= 0.2.0)
Memcache::increment -- memcache_increment — Инкрементирует значение элемента
Метод Memcache::increment() увеличивает значение элемента на величину
value. Значение элемента изменится на значение аргумента value,
если элемент с ключом key не числовой
и значение элемента невозможно преобразовать в число.
Метод Memcache::increment() не создаёт
элемент, который ещё не содержится в кеше.
Замечание: Лучше не вызывать метод Memcache::increment() с элементом, который сохранили в сжатом виде, поскольку очередной вызов метода Memcache::get() завершится ошибкой.
keyvaluevalue определяет шаг увеличения элемента.
Метод возвращает новое значение элемента, если выполнился успешно, или false , если возникла ошибка.
Пример #1 Пример инкремента значения элемента методом Memcache::increment()
<?php
/* Процедурный API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* Инкрементировать счётчик на 2 */
$current_value = memcache_increment($memcache_obj, 'counter', 2);
/* Объектно-ориентированный API */
$memcache_obj = new Memcache();
$memcache_obj->connect('memcache_host', 11211);
/* Инкрементировать счётчик на 3 */
$current_value = $memcache_obj->increment('counter', 3);
?>Instead of checking the value before incrementing, you can simply ADD it instead before incrementing each time. If it's already there, your ADD is ignored, and if it's not there, it's set.
If you add($memcacheKey, 0) and then increment($memcacheKey, 1) in that order, you avoid all possible race conditions. If two threads are running this code concurrently, you will always end up with your value being 2 no matter which order the threads execute in.Please note:
If the key does not exist, memcache does NOT return false (as you might expect) but 0.
You won't get any hint that the key did not exist and still does not exist and that nothing was incremented.When the key doesn't exist it may return either bool(false) or int(0) (I get different return values on different servers), so be careful if you check for something like ($memcache->increment($key) === false).Be careful to use Memcache::decrement() and never Memcache::increment() with a negative value.
The check that prevents Memcache::decrement() from going negative is not in place with Memcache::increment(), so you can end up with a garbage integer on the order of 18 quintillion stored in place of the expected value.