如何随机选择墙纸,但最后选择的墙纸缓存10秒(出于性能原因)?
更快的RAND()函数在墙纸或图像中使用缓存我使用了这个,但我需要在图像中缓存1分钟或5分钟后及时更改以更改RAND()随机壁纸中的图像
我使用的是:
$sql_wallpaper = "SELECT SQL_CACHE * FROM `wallpaper`
WHERE wallpaperid >=
(SELECT FLOOR( MAX(wallpaperid) * RAND()) FROM `wallpaper` )
ORDER BY wallpaperid LIMIT 0,7";但我认为它不会更快。它没有使用缓存
发布于 2010-07-24 06:45:24
a)如果查询包含RAND(),则将忽略SQL_CACHE!
b)您需要将您的随机id保存在某个地方,例如数据库或apc用户数据中。如果使用数据库,您将需要保存一个时间戳,这表示此id已经在使用中,因此您可以每5分钟更改一次。如果使用梯子,只需指定ttl为5分钟。
发布于 2010-07-24 21:31:38
假设PDO和Memcached:
$pdo; //is the PDO database instance;
$memcached;//is the memcached instance;
function _getThe7Wallpapers(){
global $memcached;
$cached = $memcached->get('my7wallpapers');
if($cached!==false) return $cached;
global $pdo;
$pdo->query('SELECT COUNT(*) FROM d INTO @count;');
$pdo->query('SET @stmt = CONCAT(\'SELECT * FROM d ORDER BY id LIMIT \',ROUND(RAND()*GREATEST(@count-7,0)),\',7\');');
$pdo->query('PREPARE rander FROM @stmt;');
$rows = $pdo->query('EXECUTE rander;')->fetchAll(PDO::FETCH_ASSOC);
$memcached->set('my7wallpapers',$rows,300);//cache for 5 minutes
return $rows;
}如何实际设置PDO实例(或其他db-lib)和memcached可以在优秀的文档中阅读,因此我将把它留给您作为练习。
发布于 2010-07-24 21:37:07
只需在sql - SELECT * FROM wallpaper ORDER BY RAND() LIMIT 0,7中使用ORDER BY RAND(),然后使用其他答案中描述的任何方法在PHP端缓存结果X次。
https://stackoverflow.com/questions/3322646
复制相似问题