我创建的网站每页显示20条记录,最多可显示无限量的页面,并且页面数量会随着用户上传内容而改变。我正在寻找一种方法来缓存这些页面的X时间(比如一两个小时),以增加加载时间并减少数据库的负载。我将如何缓存分页内容?
我唯一的理论是从数据库(比方说1000行)拉出一个大的子集并序列化&缓存数组,然后将该子集用于第一页,直到我用完为止,当用户点击结束时,我只需从数据库中提取更多信息并处理偏移或重复数据项的风险。 / p>
感谢您的帮助:)
答案 0 :(得分:1)
我看到的唯一问题 - 它是无限量的页面。此解决方案可以帮助您:
1)您需要一个唯一的索引来显示您在显示时按数据排序的列。该索引的顺序必须与订购数据的顺序相同。
2)你不需要缓存所有数据集 - 只为第100页(或第100页或第10页)缓存第一个索引值
3)忘记缓存liferime - 只在内容更改时手动执行失效
例如,您想要显示问题:
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;
然后将缓存键(created_at,id)放入第100页。第二次需要显示第120页时,只需从缓存键中获取第100页并运行如下查询:
SELECT * FROM questions
WHERE created_at <= [created_at_from_cache] AND id >= [id_from_cache]
LIMIT 400, 20
所以你会避免LIMIT的大数字。
这只是解决方法 - 它不是一个出色的解决方案,但我希望这种解决方法可以帮助您。
答案 1 :(得分:0)
将所有内容存储在缓存中可能不是一个好主意。但是,如果您了解自己在做什么,请查看MySQL`s MEMORY tables,memcache,redis。有很多键值存储。