- $conn->watch( $key );
- if ( $conn->exists( $key ) ) {
- $conn->multi( Redis::MULTI );
- $conn->incrBy( $key, $value );
- $batchResult = $conn->exec();
- if ( $batchResult === false ) {
- $result = false;
- } else {
- $result = end( $batchResult );
- }
- } else {
- $result = false;
- $conn->unwatch();
- }
- } catch ( RedisException $e ) {
- try {
- $conn->unwatch(); // sanity
- } catch ( RedisException $ex ) {
- // already errored
- }
- $result = false;
- $this->handleException( $conn, $e );
- }
-
- $this->logRequest( 'incr', $key, $conn->getServer(), $result );
-
- return $result;
- }
-
- public function incrWithInit( $key, $exptime, $value = 1, $init = 1 ) {
- $conn = $this->getConnection( $key );
- if ( !$conn ) {
- return false;
- }
-
- $ttl = $this->convertToRelative( $exptime );
- $preIncrInit = $init - $value;
- try {
- $conn->multi( Redis::MULTI );
- $conn->set( $key, $preIncrInit, $ttl ? [ 'nx', 'ex' => $ttl ] : [ 'nx' ] );
- $conn->incrBy( $key, $value );
- $batchResult = $conn->exec();
- if ( $batchResult === false ) {
- $result = false;
- $this->debug( "incrWithInit request to {$conn->getServer()} failed" );
- } else {
- $result = end( $batchResult );