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:
michael-grunder
2025-11-11 11:19:46 -08:00
committed by Michael Grunder
parent bd4989e004
commit 41922b6740
5 changed files with 30 additions and 7 deletions
+4
View File
@@ -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));
+5
View File
@@ -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. */
+8 -1
View File
@@ -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)
+8 -1
View File
@@ -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
View File
@@ -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);