gpt4 book ai didi

phpredis Redis集群连接对象跨请求重用

转载 作者:IT王子 更新时间:2023-10-29 06:10:55 26 4
gpt4 key购买 nike

我们使用 phpredis 库从我们的服务机器连接到我们的 64 节点 Redis 集群。尽管我们使用持久连接,但由于 php 不会跨请求重用对象,因此每个请求都会首先调用 CLUSTER SLOTS 调用 Redis 集群,然后进行数据获取。这被证明是非常昂贵的,因为这会增加 API 和 Redis 上的 CPU,并且还会增加元信息(CLUSTER SLOTS)的网络使用,否则这些信息可能会被缓存。基本上,我们希望在同一个 php-fpm 进程中跨多个请求重用 Redis 集群连接对象。有关如何执行此操作的任何建议?

更新:我在 cluster_library.c 代码中尝试了以下差异,但这似乎导致了 php 中的随机运行时异常。

index 3e532b7..b2cbf16 100644
--- a/cluster_library.c
+++ b/cluster_library.c
@@ -7,6 +7,10 @@
#include <zend_exceptions.h>

extern zend_class_entry *redis_cluster_exception_ce;
+int cache_count = 0;
+//Cache the cluster slots value for every n requests/calls, n being 100 for now
+int CACHE_COUNT_VAL = 10;
+clusterReply *permSlots=NULL;

/* Debugging methods/
static void cluster_dump_nodes(redisCluster *c) {
@@ -939,7 +943,18 @@ PHP_REDIS_API int cluster_map_keyspace(redisCluster *c TSRMLS_DC) {
}

// Parse out cluster nodes. Flag mapped if we are valid
- slots = cluster_get_slots(seed TSRMLS_CC);
+ if (permSlots && cache_count <= CACHE_COUNT_VAL) {
+ slots = permSlots;
+ cache_count++;
+ }
+ else {
+ slots = cluster_get_slots(seed TSRMLS_CC);
+ }
+
if (slots) {
mapped = !cluster_map_slots(c, slots);
// Bin anything mapped, if we failed somewhere
@@ -951,8 +966,16 @@ PHP_REDIS_API int cluster_map_keyspace(redisCluster *c TSRMLS_DC) {
if (mapped) break;
} ZEND_HASH_FOREACH_END();

+ if((!permSlots && mapped && slots) ||
+ cache_count >= CACHE_COUNT_VAL) {
+ permSlots = slots;
+ cache_count = 0;
+ }
+
// Clean up slots reply if we got one
- if(slots) cluster_free_reply(slots, 1);
+ // if(slots) cluster_free_reply(slots, 1);

// Throw an exception if we couldn't map
if(!mapped) {

最佳答案

这里是 phpredis 的开发者。目前这是 phpredis 的一个限制/缺陷,因为它必须为每个新请求发出一个 CLUSTER SLOTS 命令。据我所知,避免这种情况的唯一方法是将 phpredis 指向代理,如 CodisCorvis但我没有任何使用它们的个人经验。

也就是说,我确实在 this 中实现了对该功能的实验性支持。分支。它使用 PHP 的 persistent_list 跨请求缓存槽信息。

随着 Redis Cluster 的采用率似乎越来越高,我将尝试尽快将其纳入主线开发分支,并可能纳入下一个稳定版本!

干杯,迈克

关于phpredis Redis集群连接对象跨请求重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46666973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com