You need to cache $this->request->params['paging']
array.
And you have to add Paginator Helper to $helpers
array. If you don't, beforeRender method of Paginator helper won't be invoked and paging links will be broken.
$page = !isset($this->request->named['page']) ? '1' : $this->request->named['page'];
$products = Cache::read('my_unique_cache_id_' . $page, 'query');
$paging = Cache::read('my_unique_cache_id_paging_' . $page, 'query');
if ($products && $paging) {
$this->set('products', $products);
$this->request->params['paging'] = $paging;
}else{
$products = $this->paginate('Product');
Cache::write('my_unique_cache_id_paging_' . $page, $this->request->params['paging'], 'query');
Cache::write('my_unique_cache_id_' . $page, $products, 'query');
$this->set('products', $products);
}