小编use*_*081的帖子

PHP5-FPM静态,动态或按需?

我有一个Nginx + PHP5-FPM服务器,几乎没有高流量网站.

根据我对PHP5-FPM池配置的理解,我理解:

static =可用于立即创建N个子进程,因此它们不需要打开/重新打开,它们已经打开并且可以在需要时使用,否则它们正在"休眠".

dynamic =可用于打开有限数量的子进程,然后在达到限制时重新生成(最小/最大服务器数).

ondemand =我指定要创建的子进程的最大数量,然后在需要时按需创建子进程,在不再需要时关闭子进程,保持较低的内存使用率,但增加几毫秒的响应时间.

从我在高流量WordPress网站上的测试中,我注意到:

如果我使用"静态",网站肯定会更快,并且可以立即处理大量并发连接,但内存总是增加其使用量,并且在N小时后它似乎几乎使用可用的总RAM.所以我必须定期(每1小时)使用一个cronjob重新加载PHP5-FPM并重新加载/etc/init.d/php5-fpm.

如果我使用"动态"它使用较少的RAM,但在N个并发连接之后会出现频繁的502错误(但可能我配置得不好).

如果我使用"ondemand"这个网站有点慢(比如+ 50/100ms的响应时间),但它可以处理所有高流量但不占用太多RAM.

所以我个人的结论是"ondemand"真的是在低/受控内存使用方面使用的最佳方法,唯一的缺点是响应时间+50/100 ms,但在我的情况下它不是一个大问题.

我的假设是否正确?

php nginx

15
推荐指数
2
解决办法
1万
查看次数

在 Redis 上,将一个带有 JSON 数据的键作为值存储还是将多个键作为一个值存储更好?

我正在开发一个 Web 应用程序(Nginx+PHP7.3),它将使用 Redis 数据库来存储一些数据(主要是计算事物),我必须决定如何存储数据。在我的情况下,重要的是速度和性能,并且还要保持每秒低操作数,以便能够处理与 Web 应用程序的许多并发连接。

选项 1:将 JSON 数据存储在单个键上

为了保存数据,我将使用单个 SET 操作,即:

$redis->set("MyKey-UserID", '{"clicks":123,"downloads":1234,"views":123}');
Run Code Online (Sandbox Code Playgroud)

然后更新数据我会使用两个操作(GET + SET),即:

$array = json_decode($redis->get("MyKey-UserID"), true);

$array['clicks']++;
$array['downloads']++;
$array['views']++;

$redis->set("MyKey-UserID", json_encode($array));
Run Code Online (Sandbox Code Playgroud)

选项 2:具有单个值的多个键

为了保存数据,我将使用多个 SET 操作,即:

$redis->set("MyKey-UserID-Clicks", 123);
$redis->set("MyKey-UserID-Downloads", 1234);
$redis->set("MyKey-UserID-Views", 123);
Run Code Online (Sandbox Code Playgroud)

然后更新数据我会使用多个 INCR 操作,即:

$redis->incr("MyKey-UserID-Clicks");
$redis->incr("MyKey-UserID-Downloads");
$redis->incr("MyKey-UserID-Views");
Run Code Online (Sandbox Code Playgroud)

我选择的选项 + 问题

我个人会使用选项 1,您有什么看法?

您认为使用 GET + SET 仍然会像使用 INCR 一样快吗?

您如何看待选项 2?

我对选项 1 的利弊

选项 1 优点:

  • 更好的数据库组织,因为我将为每个用户只有一个密钥
  • 通过单个 GET 操作,我将拥有所有 JSON 数据
  • 要更新所有 JSON 字段,我将只使用两个操作 (GET + SET)
  • 数据库的文件大小会更小

选项 1 …

php redis

3
推荐指数
1
解决办法
5143
查看次数

标签 统计

php ×2

nginx ×1

redis ×1