PHP 1.5m 会话文件。磁盘占用大小大于实际内容。我应该使用 Redis 吗?

PHP 1.5m 会话文件。磁盘占用大小大于实际内容。我应该使用 Redis 吗?

我注意到我的 PHP 会话文件夹中有数百万个包含相同会话数据的文件。例如,假设它是一个 48 字节长的字符串,内容保持不变。

我们假设 /var/tmp/php/sessions 中有大约 150 万个这样的会话文件

如果我算得没错的话,48 字节 * 1500000 个文件 / 1024 / 1024 = 约 68 MB。

但如果我执行以下操作,我会得到 6G 的结果

cd
/var/tmp/php/sessions
du -ch

1)为什么显示6G(大约)?(下面我的第二个问题中可能包含答案)

更多检查:按文件大小降序排列文件,以检查最大文件大小。单个文件大小为 4k

du -a | sort -n -r | head -n 10
6464600 .
4       ./sess_fffffABCDcdf9c312340f094d165678

我替换了上面文件名中的某些字符。

2)为什么显示4k? 这与文件系统块大小有关。6G 的使用现在有点意义了。参考:https://stackoverflow.com/questions/26666642/why-the-size-of-an-empty-directory-in-linux-is-4kb

3)如果我使用 Redis 作为 PHP 的会话句柄,它肯定会比磁盘更快,但理论上它只会使用 RAM 上大约 68 MB 的数据,也许还会加上一些开销?

4)如果 Redis 中存储的值相同,即对于不同的会话键,相同的值重复 150 万次,Redis 是否会尝试减少实际内存使用量?

我无法控制会话及其数据,也无法阻止会话的创建或删除其内容,即使它是重复的。

我希望得到对我的前两个问题的确认,并且如果可能的话,对问题 3 和 4 提供更多的解释和参考。

答案1

  1. 它显示六千兆字节,因为文件系统上的最小分配块大小为四千字节。
  2. 是的,它与FS块大小有关。
  3. Redis 的速度会比磁盘快,但速度不会快太多,因为数据很可能位于操作系统文件系统缓存中。它使用的内存比磁盘上的会话存储要少。但是,确切的规模很难知道,需要阅读代码才能估计,或者设置测试系统并测量内存使用情况。
  4. 在 Google 上搜索“redis 重复数据删除”会显示一些页面,这些页面表明 Redis 可以执行您描述的任务以减少内存占用。我不知道这些功能的实际实现状态。

相关内容