mirror of
https://github.com/phpredis/phpredis.git
synced 2026-06-19 07:35:31 +00:00
Implement MSETEX for RedisCluster
We also need to revisit the multi key command logic (MSET, DEL, and friends). We may want to create a "per slot" distribution mechanism.
This commit is contained in:
committed by
Michael Grunder
parent
bd4989e004
commit
41922b6740
@@ -814,6 +814,10 @@ PHP_METHOD(RedisCluster, unlink) {
|
||||
cluster_generic_delete(INTERNAL_FUNCTION_PARAM_PASSTHRU, "UNLINK", sizeof("UNLINK") - 1);
|
||||
}
|
||||
|
||||
PHP_METHOD(RedisCluster, msetex) {
|
||||
CLUSTER_PROCESS_CMD(msetex, cluster_long_resp, 0);
|
||||
}
|
||||
|
||||
/* {{{ proto array RedisCluster::mget(array keys) */
|
||||
PHP_METHOD(RedisCluster, mget) {
|
||||
zval *z_ret = emalloc(sizeof(*z_ret));
|
||||
|
||||
@@ -760,6 +760,11 @@ class RedisCluster {
|
||||
*/
|
||||
public function msetnx(array $key_values): RedisCluster|array|false;
|
||||
|
||||
/**
|
||||
* @see \Redis::msetex()
|
||||
*/
|
||||
public function msetex(array $key_vals, int|float|array|null $expiry = null): Redis|int|false;
|
||||
|
||||
/* We only support Redis::MULTI in RedisCluster but take the argument
|
||||
so we can test MULTI..EXEC with RedisTest.php and in the event
|
||||
we add pipeline support in the future. */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 96071dc7899a04e81da1300194f4966c4e0c736d */
|
||||
* Stub hash: 4da627e0a1830f4b222975eb4d27f59e28b6bf2b */
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
|
||||
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 1)
|
||||
@@ -628,6 +628,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_msetnx, 0
|
||||
ZEND_ARG_TYPE_INFO(0, key_values, IS_ARRAY, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_msetex, 0, 1, Redis, MAY_BE_LONG|MAY_BE_FALSE)
|
||||
ZEND_ARG_TYPE_INFO(0, key_vals, IS_ARRAY, 0)
|
||||
ZEND_ARG_TYPE_MASK(0, expiry, MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_ARRAY|MAY_BE_NULL, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_multi, 0, 0, RedisCluster, MAY_BE_BOOL)
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, value, IS_LONG, 0, "Redis::MULTI")
|
||||
ZEND_END_ARG_INFO()
|
||||
@@ -1332,6 +1337,7 @@ ZEND_METHOD(RedisCluster, ltrim);
|
||||
ZEND_METHOD(RedisCluster, mget);
|
||||
ZEND_METHOD(RedisCluster, mset);
|
||||
ZEND_METHOD(RedisCluster, msetnx);
|
||||
ZEND_METHOD(RedisCluster, msetex);
|
||||
ZEND_METHOD(RedisCluster, multi);
|
||||
ZEND_METHOD(RedisCluster, object);
|
||||
ZEND_METHOD(RedisCluster, persist);
|
||||
@@ -1593,6 +1599,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
|
||||
ZEND_ME(RedisCluster, mget, arginfo_class_RedisCluster_mget, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, mset, arginfo_class_RedisCluster_mset, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, msetnx, arginfo_class_RedisCluster_msetnx, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, msetex, arginfo_class_RedisCluster_msetex, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, multi, arginfo_class_RedisCluster_multi, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, object, arginfo_class_RedisCluster_object, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, persist, arginfo_class_RedisCluster_persist, ZEND_ACC_PUBLIC)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 96071dc7899a04e81da1300194f4966c4e0c736d */
|
||||
* Stub hash: 4da627e0a1830f4b222975eb4d27f59e28b6bf2b */
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, name)
|
||||
@@ -536,6 +536,11 @@ ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_RedisCluster_msetnx arginfo_class_RedisCluster_mset
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_msetex, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, key_vals)
|
||||
ZEND_ARG_INFO(0, expiry)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_multi, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, value)
|
||||
ZEND_END_ARG_INFO()
|
||||
@@ -1158,6 +1163,7 @@ ZEND_METHOD(RedisCluster, ltrim);
|
||||
ZEND_METHOD(RedisCluster, mget);
|
||||
ZEND_METHOD(RedisCluster, mset);
|
||||
ZEND_METHOD(RedisCluster, msetnx);
|
||||
ZEND_METHOD(RedisCluster, msetex);
|
||||
ZEND_METHOD(RedisCluster, multi);
|
||||
ZEND_METHOD(RedisCluster, object);
|
||||
ZEND_METHOD(RedisCluster, persist);
|
||||
@@ -1419,6 +1425,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
|
||||
ZEND_ME(RedisCluster, mget, arginfo_class_RedisCluster_mget, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, mset, arginfo_class_RedisCluster_mset, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, msetnx, arginfo_class_RedisCluster_msetnx, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, msetex, arginfo_class_RedisCluster_msetex, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, multi, arginfo_class_RedisCluster_multi, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, object, arginfo_class_RedisCluster_object, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(RedisCluster, persist, arginfo_class_RedisCluster_persist, ZEND_ACC_PUBLIC)
|
||||
|
||||
+5
-5
@@ -1961,7 +1961,7 @@ gen_vararg_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
|
||||
|
||||
static void
|
||||
redis_cmd_append_sstr_mset_kvals(smart_string *cmdstr, RedisSock *redis_sock,
|
||||
HashTable *kvals)
|
||||
HashTable *kvals, short *slot)
|
||||
{
|
||||
zend_string *key;
|
||||
zend_ulong idx;
|
||||
@@ -1970,9 +1970,9 @@ redis_cmd_append_sstr_mset_kvals(smart_string *cmdstr, RedisSock *redis_sock,
|
||||
ZEND_HASH_FOREACH_KEY_VAL(kvals, idx, key, zv) {
|
||||
ZVAL_DEREF(zv);
|
||||
if (key) {
|
||||
redis_cmd_append_sstr_key_zstr(cmdstr, key, redis_sock, NULL);
|
||||
redis_cmd_append_sstr_key_zstr(cmdstr, key, redis_sock, slot);
|
||||
} else {
|
||||
redis_cmd_append_sstr_key_long(cmdstr, idx, redis_sock, NULL);
|
||||
redis_cmd_append_sstr_key_long(cmdstr, idx, redis_sock, slot);
|
||||
}
|
||||
redis_cmd_append_sstr_zval(cmdstr, zv, redis_sock);
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
@@ -1994,7 +1994,7 @@ int redis_mset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
|
||||
|
||||
redis_cmd_init_sstr(&cmdstr, zend_hash_num_elements(kvals) * 2, kw,
|
||||
strlen(kw));
|
||||
redis_cmd_append_sstr_mset_kvals(&cmdstr, redis_sock, kvals);
|
||||
redis_cmd_append_sstr_mset_kvals(&cmdstr, redis_sock, kvals, slot);
|
||||
|
||||
*cmd = cmdstr.c;
|
||||
*cmd_len = cmdstr.len;
|
||||
@@ -2552,7 +2552,7 @@ int redis_msetex_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
|
||||
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "MSETEX");
|
||||
|
||||
redis_cmd_append_sstr_u64(&cmdstr, zend_hash_num_elements(kvals));
|
||||
redis_cmd_append_sstr_mset_kvals(&cmdstr, redis_sock, kvals);
|
||||
redis_cmd_append_sstr_mset_kvals(&cmdstr, redis_sock, kvals, slot);
|
||||
redis_cmd_append_sstr_set_type(&cmdstr, opt.type);
|
||||
redis_cmd_append_sstr_expiry(&cmdstr, &opt.expiry);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user