【问题标题】:cache large data in session on memcache server在 memcache 服务器上的 session 中缓存大数据
【发布时间】:2016-07-19 03:07:28
【问题描述】:

我为我的 php 服务器设置了两个 memcached 服务器来缓存会话中的一些数据库数据。
当我选择超过 20000 条包含 20 列数据的记录并缓存到 php 会话中时,执行 session_start() 需要 1 秒以上;
为什么?我怎样才能加快速度?

【问题讨论】:

  • 为什么要在一大块(表)中缓存这么多数据?有关如何决定缓存什么以及如何使用缓存数据的更多信息会有所帮助。
  • 我的网站使用数据表的服务器端显示用户数据,如果不使用缓存,每次客户端更改页面时都会访问数据库,所以我想将所有用户数据缓存到会话中,并采取形式会话而不是数据库。
  • *Datatable的服务器端只会获取当前页面的数据,所以客户端换页时会请求php。

标签: php session memcached


【解决方案1】:

我认为启动会话需要很长时间,因为 memcache 和 PHP 必须为每个请求反序列化数十万个表格单元格。我敢打赌,这比您只使用数据库需要更长的时间。

您的实现确实效率低下:如果单个用户需要访问她的会话,则您会加载有关所有用户的数据。要显着加快速度,请更改在缓存中存储值的方式;只存储当前用户的数据,而不是整个表!

不要以这种方式构建缓存:

$SESSION['data'] = [
    'ID_1'=>['name'=>'jane', 'email'=>'...'],
    'ID_2'=>['name'=>'john', 'email'=>'...'],
    ... //20,000 rows
];

这样做:

$SESSION['data'] = [
    'ID_1'=>['name'=>'jane', 'email'=>'...']//a single row
];

现在当您调用session_start() 时,只会加载当前用户的行,而不是整个表。

附录

我的回应是针对浏览其网页的个人用户。对于需要脚本过滤所有记录的管理员,我只需使用SELECT 语句访问数据库。确保只选择所需的列和行。它可能比从缓存中加载整个表要快。

无论如何,您可以通过注释掉 session_start() 和所有 $_SESSION 引用并在数据库中查询您需要的信息来快速测试它。

【讨论】:

  • 但是如果我是管理员,我需要将所有用户数据显示到列表中(数据表列出每页 10 个用户,当管理员更改页面时数据表将请求 php 获取 10 条记录),我必须加载所有数据并从会话中获取部分数据。另外,为了减少命中数据库,我想缓存会话中的所有用户数据。当我需要前 10 条记录时,我将 $_SESSION['data][0] 带到 $_SESSION['data][9]。当我需要 1001 到 1010 条记录时,我将 $_SESSION['data'][1000] 到 $_SESSION['data'][1009] 如果我想减少命中数据库时间,我必须将所有数据保存在会话中,但是它会慢下来。那么,我的想法错了吗?
  • 如果不是,大数据是否会拖慢session_start();?如果是,我必须使用其他方法吗?
  • 使用数据库可能会更快。我添加到我的答案中。
猜你喜欢
  • 2012-09-29
  • 2010-12-20
  • 2015-05-02
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多