mirror of
https://github.com/php-win-ext/phpredis.git
synced 2026-04-25 17:48:17 +02:00
SAVE, LASTSAVE, BGSAVE, FLUSHDB, FLUSHALL, DBSIZE now work with MULTI/pipeline.
This commit is contained in:
@@ -438,11 +438,9 @@ PHP_METHOD(Redis, set)
|
||||
cmd_len = redis_cmd_format(&cmd, "SET %s %d\r\n%s\r\n", key, key_len, val_len, val, val_len);
|
||||
|
||||
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
|
||||
|
||||
IF_ATOMIC() {
|
||||
redis_boolean_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
|
||||
}
|
||||
|
||||
REDIS_PROCESS_RESPONSE(redis_boolean_response);
|
||||
|
||||
|
||||
@@ -1967,7 +1965,7 @@ PHPAPI void generic_empty_cmd(INTERNAL_FUNCTION_PARAMETERS, char *cmd, int cmd_l
|
||||
*/
|
||||
PHP_METHOD(Redis, save)
|
||||
{
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "SAVE\r\n", sizeof("SAVE\r\n")-1 TSRMLS_CC);
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, estrdup("SAVE\r\n"), sizeof("SAVE\r\n")-1 TSRMLS_CC);
|
||||
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1976,7 +1974,7 @@ PHP_METHOD(Redis, save)
|
||||
*/
|
||||
PHP_METHOD(Redis, bgSave)
|
||||
{
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "BGSAVE\r\n", sizeof("BGSAVE\r\n")-1 TSRMLS_CC);
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, estrdup("BGSAVE\r\n"), sizeof("BGSAVE\r\n")-1 TSRMLS_CC);
|
||||
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1995,30 +1993,18 @@ PHPAPI void generic_empty_long_cmd(INTERNAL_FUNCTION_PARAMETERS, char *cmd, int
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
IF_MULTI_OR_ATOMIC() {
|
||||
if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
|
||||
/* no efree here, cmd is an argument. */
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
IF_PIPELINE() {
|
||||
PIPELINE_ENQUEUE_COMMAND(cmd, cmd_len);
|
||||
}
|
||||
|
||||
MULTI_RESPONSE(redis_long_response);
|
||||
IF_ATOMIC() {
|
||||
redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
|
||||
}
|
||||
ELSE_IF_MULTI()
|
||||
ELSE_IF_PIPELINE();
|
||||
|
||||
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
|
||||
IF_ATOMIC() {
|
||||
redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
|
||||
}
|
||||
REDIS_PROCESS_RESPONSE(redis_long_response);
|
||||
}
|
||||
|
||||
/* {{{ proto integer Redis::lastSave()
|
||||
*/
|
||||
PHP_METHOD(Redis, lastSave)
|
||||
{
|
||||
generic_empty_long_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "LASTSAVE\r\n", sizeof("LASTSAVE\r\n") TSRMLS_CC);
|
||||
generic_empty_long_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, estrdup("LASTSAVE\r\n"), sizeof("LASTSAVE\r\n")-1 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -2027,7 +2013,7 @@ PHP_METHOD(Redis, lastSave)
|
||||
*/
|
||||
PHP_METHOD(Redis, flushDB)
|
||||
{
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHDB\r\n", sizeof("FLUSHDB\r\n")-1 TSRMLS_CC);
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, estrdup("FLUSHDB\r\n"), sizeof("FLUSHDB\r\n")-1 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -2035,7 +2021,7 @@ PHP_METHOD(Redis, flushDB)
|
||||
*/
|
||||
PHP_METHOD(Redis, flushAll)
|
||||
{
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHALL\r\n", sizeof("FLUSHALL\r\n")-1 TSRMLS_CC);
|
||||
generic_empty_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, estrdup("FLUSHALL\r\n"), sizeof("FLUSHALL\r\n")-1 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -2043,7 +2029,7 @@ PHP_METHOD(Redis, flushAll)
|
||||
*/
|
||||
PHP_METHOD(Redis, dbSize)
|
||||
{
|
||||
generic_empty_long_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "DBSIZE\r\n", sizeof("DBSIZE\r\n") TSRMLS_CC);
|
||||
generic_empty_long_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, estrdup("DBSIZE\r\n"), sizeof("DBSIZE\r\n")-1 TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -3460,7 +3446,7 @@ PHP_METHOD(Redis, pipeline)
|
||||
set_flag(object, REDIS_PIPELINE);
|
||||
|
||||
/*
|
||||
NB : we keep the function fold, to detect the last function .
|
||||
NB : we keep the function fold, to detect the last function.
|
||||
We need the response format of the n - 1 command. So, we can delete when n > 2, the { 1 .. n - 2} commands
|
||||
*/
|
||||
|
||||
|
||||
+227
-4
@@ -168,16 +168,239 @@ function test1($r, $type) {
|
||||
|
||||
}
|
||||
|
||||
function test2($r, $type) {
|
||||
|
||||
// general command
|
||||
$ret = $r->multi($type)
|
||||
->select(3)
|
||||
->set('keyAAA', 'value')
|
||||
->set('keyAAB', 'value')
|
||||
->dbSize()
|
||||
->lastsave()
|
||||
->exec();
|
||||
$i = 0;
|
||||
assert(is_array($ret));
|
||||
assert($ret[$i++] === TRUE); // select
|
||||
assert($ret[$i++] === TRUE); // set
|
||||
assert($ret[$i++] === TRUE); // set
|
||||
assert(is_long($ret[$i++])); // dbsize
|
||||
assert(is_long($ret[$i++])); // lastsave
|
||||
|
||||
$count = 1000000;
|
||||
// $count = 10;
|
||||
assert(count($ret) === $i);
|
||||
|
||||
$ret = $r->multi($type)
|
||||
->delete('key1')
|
||||
->set('key1', 'value1')
|
||||
->get('key1')
|
||||
->getSet('key1', 'value2')
|
||||
->get('key1')
|
||||
->set('key2', 4)
|
||||
->incr('key2')
|
||||
->get('key2')
|
||||
->decr('key2')
|
||||
->get('key2')
|
||||
->renameKey('key2', 'key3')
|
||||
->get('key3')
|
||||
->renameNx('key3', 'key1')
|
||||
->renameKey('key3', 'key2')
|
||||
->incr('key2', 5)
|
||||
->get('key2')
|
||||
->decr('key2', 5)
|
||||
->get('key2')
|
||||
->exec();
|
||||
|
||||
assert(is_array($ret));
|
||||
assert($ret[0] == TRUE);
|
||||
assert($ret[1] == TRUE);
|
||||
assert($ret[2] == 'value1');
|
||||
assert($ret[3] == 'value1');
|
||||
assert($ret[4] == 'value2');
|
||||
assert($ret[5] == TRUE);
|
||||
assert($ret[6] == 5);
|
||||
assert($ret[7] == 5);
|
||||
assert($ret[8] == 4);
|
||||
assert($ret[9] == 4);
|
||||
assert($ret[10] == TRUE);
|
||||
assert($ret[11] == 4);
|
||||
assert($ret[12] == FALSE);
|
||||
assert($ret[13] == TRUE);
|
||||
assert($ret[14] == TRUE);
|
||||
assert($ret[15] == 9);
|
||||
assert($ret[16] == TRUE);
|
||||
assert($ret[17] == 4);
|
||||
|
||||
$ret = $r->multi($type)
|
||||
->delete('key1')
|
||||
->delete('key2')
|
||||
->set('key1', 'val1')
|
||||
->setnx('key1', 'valX')
|
||||
->setnx('key2', 'valX')
|
||||
->exists('key1')
|
||||
->exists('key3')
|
||||
->ping()
|
||||
->exec();
|
||||
|
||||
assert(is_array($ret));
|
||||
assert($ret[0] == TRUE);
|
||||
assert($ret[1] == TRUE);
|
||||
assert($ret[2] == TRUE);
|
||||
assert($ret[3] == FALSE);
|
||||
assert($ret[4] == TRUE);
|
||||
assert($ret[5] == TRUE);
|
||||
assert($ret[6] == FALSE);
|
||||
assert($ret[7] == '+PONG');
|
||||
|
||||
$ret = $r->multi($type)
|
||||
->randomKey()
|
||||
->exec();
|
||||
|
||||
assert(is_array($ret) && count($ret) === 1);
|
||||
assert(is_string($ret[0]));
|
||||
|
||||
/* ttl, mget, mset, msetnx, expire, expireAt */
|
||||
$ret = $r->multi($type)
|
||||
->ttl('key')
|
||||
->mget(array('key1', 'key2', 'key3'))
|
||||
->mset(array('key3' => 'value3', 'key4' => 'value4'))
|
||||
->set('key', 'value')
|
||||
->expire('key', 5)
|
||||
->ttl('key')
|
||||
->expireAt('key', '0000')
|
||||
->exec();
|
||||
$i = 0;
|
||||
assert(is_array($ret));
|
||||
assert(is_long($ret[$i++]));
|
||||
var_dump($ret);
|
||||
assert(is_array($ret[$i]) && count($ret[$i]) === 3); // mget
|
||||
$i++;
|
||||
assert($ret[$i++] === TRUE); // mset always returns TRUE
|
||||
assert($ret[$i++] === TRUE); // set always returns TRUE
|
||||
assert($ret[$i++] === TRUE); // expire always returns TRUE
|
||||
assert($ret[$i++] === 5); // TTL was just set.
|
||||
assert($ret[$i++] === TRUE); // expireAt returns TRUE for an existing key
|
||||
assert(count($ret) === $i);
|
||||
|
||||
/* lists */
|
||||
$ret = $r->multi($type)
|
||||
->rpush('lkey', 'lvalue')
|
||||
->lpush('lkey', 'lvalue')
|
||||
->lpush('lkey', 'lvalue')
|
||||
->lpush('lkey', 'lvalue')
|
||||
->lpush('lkey', 'lvalue')
|
||||
->lpush('lkey', 'lvalue')
|
||||
->rpoplpush('lkey', 'lDest')
|
||||
->lGetRange('lDest', 0, -1)
|
||||
->lpop('lkey')
|
||||
->llen('lkey')
|
||||
->lRemove('lkey', 'lvalue', 3)
|
||||
->llen('lkey')
|
||||
->lget('lkey', 0)
|
||||
->lGetRange('lkey', 0, -1)
|
||||
->lSet('lkey', 1, "newValue") /* check errors on key not exists */
|
||||
->lGetRange('lkey', 0, -1)
|
||||
->llen('lkey')
|
||||
->exec();
|
||||
|
||||
var_dump($ret);
|
||||
|
||||
/* sets */
|
||||
$ret = $r->multi($type)
|
||||
->sadd('skey1', 'sValue1')
|
||||
->sadd('skey1', 'sValue2')
|
||||
->sadd('skey1', 'sValue3')
|
||||
->sadd('skey1', 'sValue4')
|
||||
|
||||
->sadd('skey2', 'sValue1')
|
||||
->sadd('skey2', 'sValue2')
|
||||
|
||||
->sSize('skey1')
|
||||
->sremove('skey1', 'sValue2')
|
||||
->sSize('skey1')
|
||||
->sMove('skey1', 'skey2', 'sValue4')
|
||||
->sSize('skey2')
|
||||
->sContains('skey2', 'sValue4')
|
||||
->sMembers('skey1')
|
||||
->sMembers('skey2')
|
||||
->sInter('skey1', 'skey2')
|
||||
->sInterStore('skeydest', 'skey1', 'skey2')
|
||||
->sMembers('skeydest')
|
||||
->sPop('skey2')
|
||||
->sSize('skey2')
|
||||
->sUnion('skey2', 'skeydest')
|
||||
->sUnionStore('skeyUnion', 'skey2', 'skeydest')
|
||||
->sMembers('skeyUnion')
|
||||
->sDiff('skey1', 'skey2')
|
||||
->sDiffStore('sDiffDest', 'skey1', 'skey2')
|
||||
->sMembers('sDiffDest')
|
||||
->exec();
|
||||
var_dump($ret);
|
||||
|
||||
/* sets */
|
||||
$ret = $r->multi($type)
|
||||
->zadd('zkey1', 1, 'zValue1')
|
||||
->zadd('zkey1', 5, 'zValue5')
|
||||
->zadd('zkey1', 2, 'zValue2')
|
||||
->zrange('zkey1', 0, -1)
|
||||
->zDelete('zkey1', 'zValue2')
|
||||
->zrange('zkey1', 0, -1)
|
||||
->zadd('zkey1', 11, 'zValue11')
|
||||
->zadd('zkey1', 12, 'zValue12')
|
||||
->zadd('zkey1', 13, 'zValue13')
|
||||
->zadd('zkey1', 14, 'zValue14')
|
||||
->zadd('zkey1', 15, 'zValue15')
|
||||
->zDeleteRangeByScore('zkey1', 11, 13)
|
||||
->zrange('zkey1', 0, -1)
|
||||
->zReverseRange('zkey1', 0, -1)
|
||||
//->zRangeByScore('zkey1', 1, 6) /* seg fault */
|
||||
->zCard('zkey1')
|
||||
//->zScore('zkey1', 'zValue15') /* no result */
|
||||
->zadd('zkey2', 5, 'zValue5')
|
||||
->zadd('zkey2', 2, 'zValue2')
|
||||
//->zRange('zkey1', 'zkey2')
|
||||
->zInter('zInter', array('zkey1', 'zkey2'))
|
||||
->zRange('zkey1', 0, -1)
|
||||
->zRange('zkey2', 0, -1)
|
||||
->zRange('zInter', 0, -1)
|
||||
->zInter('zUnion', array('zkey1', 'zkey2'))
|
||||
->zRange('zUnion', 0, -1)
|
||||
->zadd('zkey5', 5, 'zValue5')
|
||||
->zIncrBy('zkey5', 3, 'zValue5') /* fix this */
|
||||
->zScore('zkey5', 'zValue5')
|
||||
->exec();
|
||||
var_dump($ret);
|
||||
|
||||
/* hash */
|
||||
$ret = $r->multi($type)
|
||||
->hset('hkey1', 'key1', 'value1')
|
||||
->hset('hkey1', 'key2', 'value2')
|
||||
->hset('hkey1', 'key3', 'value3')
|
||||
->hget('hkey1', 'key1')
|
||||
->hlen('hkey1')
|
||||
//->hdel('hkey1', 'key2')
|
||||
//->hexists('hkey1', 'key2')
|
||||
->hkeys('hkey1')
|
||||
->hvals('hkey1')
|
||||
->hgetall('hkey1') /* bug */
|
||||
//->hincrby()
|
||||
->exec();
|
||||
var_dump($ret);
|
||||
}
|
||||
|
||||
|
||||
$count = 10000;
|
||||
$count = 1;
|
||||
|
||||
for($i = 1; $i <= $count; $i++) {
|
||||
test1($r, Redis::MULTI);
|
||||
test1($r, Redis::PIPELINE);
|
||||
//test1($r, Redis::MULTI);
|
||||
//test1($r, Redis::PIPELINE);
|
||||
|
||||
test2($r, Redis::MULTI);
|
||||
//test2($r, Redis::PIPELINE);
|
||||
/*
|
||||
$r->multi(Redis::MULTI)
|
||||
->get('x')
|
||||
->exec();
|
||||
*/
|
||||
if($i >= 1000 && $i % ($count/1000) == 0) {
|
||||
echo sprintf("%0.1f", 100 * $i/$count)."% (sent ". number_format($i) ." commands)\n";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user