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.
Memcache::increment
(PECL memcache >= 0.2.0)
Memcache::increment — Increment item's value
Description
Memcache::increment() increments value of the item on the specified value . If item with key key was not numeric and cannot be converted to number, it will change it's value to value . Memcache::increment() does not create an item if it didn't exist.
Note: Do not use Memcache::increment() with item, which was stored compressed, because consequent call to Memcache::get() will fail.
Also you can use memcache_increment() function.
Parameters
- key
-
Key of the item to increment.
- value
-
Increment the item by value . Optional and defaults to 1.
Return Values
Returns new item's value on success or FALSE on failure.
Examples
Example #1 Memcache::increment() example
<?php
/* procedural API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* increment counter by 2 */
$current_value = memcache_increment($memcache_obj, 'counter', 2);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
/* increment counter by 3 */
$current_value = $memcache_obj->increment('counter', 3);
?>
See Also
- Memcache::decrement() - Decrement item's value
- Memcache::replace() - Replace value of the existing item
Memcache::increment
01-Jul-2009 07:28
13-May-2009 09:34
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.
13-May-2009 09:16
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.
if no variable exists, even if you specify an increment value, the result will be null.
if you're using this for a mutex, chk if its null, and if so, then ADD the variable.
