2010-07-23 106 views
1

如何隨機選擇壁紙,但緩存最後選擇的10秒(出於性能的原因)?在壁紙rand()更快MySQL的功能

更快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"; 

但我認爲它不是更快...... 它不使用緩存

+2

很難確定你在問什麼。我最好的猜測是這樣的:「我如何隨機選擇壁紙,但緩存最後選擇的5分鐘(出於性能原因)」? – 2010-07-23 22:00:29

+0

相關:http://stackoverflow.com/questions/1823306/mysql-alternatives-to-order-by-rand – 2010-07-23 22:05:33

+0

是的,我問這樣的圖像緩存,並在1分鐘後改變,否則使用緩存在rand()的幫助? – Hassan 2010-07-23 22:15:36

回答

2

一)SQL_CACHE將被忽略,如果查詢CONTA ins RAND()

b)您需要將您的隨機ID保存在某個地方,例如,在數據庫或apc用戶數據中。如果使用數據庫,則需要使用該數據庫保存時間戳,這表示此ID已在使用中,因此您可以每5分鐘更改一次。如果使用梯子,只需指定5分鐘ttl。

+1

請爲我做一個代碼 – Hassan 2010-07-23 22:51:05

+1

請爲它做一個代碼使用就像這樣多數民衆贊成你說... – Hassan 2010-07-23 22:59:51

1

假設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)和分佈式緩存可以出色的文檔閱讀,所以我會離開,你作爲練習。

+0

它的偉大,但它顯示一個隨機壁紙我需要7壁紙顯示,怎麼做?回覆必須 – Hassan 2010-07-24 21:20:00

+0

我需要它來顯示限制0,7 7隨機拇指顯示 如何? – Hassan 2010-07-24 21:30:10

+0

它將獲取7行,如何以及何時將這些行更改爲您喜歡的某個html完全取決於您。 'fetchAll'應該返回7行數據。 – Wrikken 2010-07-25 03:10:37

0

在SQL只需ORDER BY RAND() - SELECT * FROM wallpaper ORDER BY RAND() LIMIT 0,7然後從其他的答案高速緩存使用任何所描述的方法爲X的時間在PHP端的結果

+0

如何做到這一點請爲X時間添加代碼 – Hassan 2010-07-24 22:07:07