Неправильно использовать полные запросы SQL в качестве ключа. Сделайте уникальный идентификатор или хотя бы хешите его. Причина в том, что когда вы увеличиваете масштаб, чем больше ваш ключ, тем медленнее совпадение и скорость передачи данных (1000 м / с на сервер memcache с маленьким ключом быстрее, чем те же 1000 р / с с большим ключом:)).
Также данные могут быть нулевыми, не стоит проверять это и снова попадать в SQL-запрос, если пользователь запрашивает выход за пределы диапазона.
// Generate key
$key = 'recent:'. $offset .':'. $rowsperpage;
// If nothing found within cache instance, retrieve and set it
if(!$data = $memcache->get($key)) {
$sql = "SELECT `id`, `title`, `vtext`
FROM `tpost`
ORDER BY `id` DESC LIMIT ?, ?";
$stmt = $this->$mysqli->prepare($sql);
$stmt->bind_param('ii', $offset, $rowsperpage);
// Retrieve result set
if($stmt->execute()) {
$data = array();
$stmt->bind_result($r_id, $r_title, $r_vtext);
while ($stmt->fetch()) {
$data[] = array(
'id' => $r_id,
'title' => $r_title,
'vtext' => $r_vtext);
}
}
$stmt->close();
// Set cache entry
$memcache->set($key, $data, 0, $cache_time);