如何在PHP中缓存分页内容


How would I cache paginated content in PHP

我正在制作一个网站,每页显示20条记录,最多无限数量的页面,页面计数将随着用户上传内容而变化。我正在寻找一种方法将这些页面缓存X时间(例如一两个小时),以增加加载时间并减少数据库上的负载。如何缓存分页内容?

我唯一的理论是从数据库中提取一个大子集(比如1000行)并序列化&缓存数组,然后将该子集用于第一个页面,直到我用完为止,当用户达到它的末尾时,我将从DB中提取更多,并处理偏移或重复数据项的风险。

谢谢你的帮助:)

我看到的唯一问题-它是无限数量的页面。这个解决方案可能对您有所帮助:

1)你需要一个唯一的索引列,你将按你的数据排序时,显示它。此索引必须与您的数据排序顺序相同。

2)你不需要缓存所有的数据集-只缓存第一个索引值为每100(或100,或10)页

3)忘记缓存生命周期-当内容更改时手动执行无效

例如你想显示问题:

CREATE TABLE `qeustions` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `created_at` INTEGER UNSIGNED NOT NULL,
  `question` TEXT,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UN_questions_created` (`created_at` DESC, `id`) 
  /* we just add `id` to provide uniqueness */
) ENGINE = InnoDB CHARACTER SET latin1;

当您需要显示第n个页面时,请查看缓存中存储的最靠近的页面。例如,您想要显示第120页,那么请查看缓存中的第100页。如果找不到,直接将用户重定向到第100页,运行select:

SELECT * FROM questions LIMIT 2000, 20;

然后为第100页放入缓存键(created_at, id)。第二次需要显示第120页时,只需从第100页的缓存键中取出并运行如下查询:

SELECT * FROM questions 
WHERE created_at <= [created_at_from_cache] AND id >= [id_from_cache]
LIMIT 400, 20

所以你将避免使用LIMIT中的大数。

这只是一个解决方案,它不是一个很好的解决方案,但我希望这个解决方案能帮助你。

将所有内容存储在缓存中可能不是一个好主意。但是,如果你明白你在做什么,看看MySQL的内存表,memcache, redis。有很多键值存储