php - 在PHP SESSION中缓存数据,还是每次都从db查询?

标签 php mysql caching session-variables

(A) 缓存 $_SESSION 数组中每次页面加载时使用的数据是否“更好”(更高效、更快、更安全等)(但仍在查询表以获取标志以重新加载数据新鲜), 或 (B) 每次都从数据库加载它?

我正在使用缓存方法 (A),但我担心有数百个用户时,内存会成为问题吗?这只是简单的数据,例如名字、姓氏、生日等。

无论使用哪种方法,都会有一个查询正在运行。想法?

最佳答案

如果您的数据在每个页面上都使用,并且对所有用户都是相同的,我不会将其缓存在 $_SESSION 中(这意味着每个用户都有该数据的不同副本),而是使用另一种机制,例如:

  • 文件
  • 在内存中,以 APC 为例(如果只有 1 个服务器)
  • 在内存中,例如使用 memcached(如果您有多个服务器)
  • 如果您的数据需要长时间计算或获得多个数据库查询,则将其缓存在数据库中可能是另一种可能性(这意味着只有一个查询可以取回,并且计算更少)


如果每个用户的数据都不相同(在您的情况下似乎就是这种情况,因为您正在缓存姓名、生日……):

  • 我会确保只缓存必要的内容
  • 一旦你只有少量数据要缓存,将它放入 session 中应该就可以了
  • 如果您真的有那么多用户,您可能会遇到其他一些可扩展性问题,并且很可能会开始使用诸如 memcached 之类的东西;这意味着您将有一些其他的缓存方式 ;-)

作为旁注:如果您一遍又一遍地执行相同的查询,您的数据库服务器应该自己缓存它(对于 MySQL,它将进入“query cache”);所以,它不会像你想象的那么糟糕,我想——即使没有那么优化 ^^

关于php - 在PHP SESSION中缓存数据,还是每次都从db查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1387587/

相关文章:

android - 如何在webview android中启用缓存

java - Spring 启动缓存不适用于@PostConstruct 或@AfterPropertiesSet

php - 如果我在 mysqli::query 中使用 SELECT 语句,默认的 ORDER BY 是什么

php - 如何在 PhpStorm 中使用 Bootstrap?

mysql - 如何在mysql查询中选择UNIX date = "2010"?

php - sqldatabse 不接受非英文字符

spring - 什么是属性 management.health.redis.enabled 以及如何使用它?

php - 同时连接表时如何使用 with()

php - Drupal 8 覆盖 session 管理

mysql - SQL 过程不能使用函数 if(exper1,exper2,exper3)