緩存應對的場景php
一個網頁存在不一樣區域的內容,不一樣區域的更新內容和頻率各不相同html
動態計算信息,並根據結果展現不一樣的內容,例如登錄狀態,每一個用戶狀態不一樣,顯示不一樣mysql
頁面級的緩存(靜態文件),只提升了讀的效率,沒有解決寫的效率的問題算法
在數據庫和動態內容之間創建緩存區,並部署在獨立服務器上,用於加速讀寫操做,這裏是使用memcached
來講明sql
memcached使用了高效的基於key的hash算法來存儲數據結構,而且使用了精心設計的內存分配器,使得查詢時間複雜度達到O(1),無論存了多少數據,查詢出來的時間都不變(看不懂就跳過,其實我也不是特別明白)。數據庫
既然是緩存,即對要緩存的數據進行過時時間設置緩存
做爲分佈式緩存系統,memcached能夠運行在獨立服務器上,使用TCP Socket來訪問服務器
使用了libevent函數庫來實現網絡併發模型,其中包括epoll,較大併發依然有很好的性能網絡
存儲複雜內容的時候,使用序列化技術,將要存儲的對象進行序列化,取出時,在進行反序列化操做數據結構
<?php $user_ticket = '0sdb129dst1ef021263ff121'; $memcache = memcache_conect('192.168.100.100', 11711); $user = $memcache->get($user_ticket); if ($user !== false) { var_dump($user); //緩存獲取的對象,打印出來 exit; } $sql = "select * from users where user_ticket = '{$user_ticket}'"; // 沒有緩存對象,從數據庫讀取 $conn = mysql_connect('localhost', 'root', 'pass','db_user'); $res = mysql_query($sql, $conn); $user = mysql_fetch_array($res, MYSQL_ASSOC); $memcach->add($user_ticket, $user, false, 3600); // 將從數據庫讀取的內容,緩存起來,下次就從緩存讀取 var_dump($user);
<?php $page = 'article_9212f.html'; $memcache = memcache_connect('192.168.100.100', 11711); $count = $memcache->increment($page, 1); if ($count === false) { $memcache->add($page, 1, false, 0); // 第一次,使用新增緩存數據 exit(1); } if ($count == 1000) { // 當緩存數達到1000時,執行一次寫入數據庫操做 $memcache->set($page, 0, false, 0); // 對1000的緩存項,進行歸零操做,便於下個1000的遞增 $sql = "update page_view set view_count=view_count + ".$count." where page = '{$page}'"; $conn = mysql_connect('localhost','root','pass','db_user'); mysql_query($sql,$conn); mysql_close($conn); }
memcached的水平擴展代碼實現
<?php function memcache_connector($key){ // 多臺主機IP $hosts = [ '192.168.100.101', '192.168.100.102', '192.168.100.103', ]; // $key 實現md5加密得到相似「e4u7r3194fj12dfhu1」值 // 只獲取前5個字符 // 使用hexdc將前5個字符進行十進制轉換 // 得到數值進行「模3」的處理,若是有4臺主機,就進行「模4」的處理,依次類推,注意,0表明第一臺主機 $host_index = hexdec(substr(md5($key), 0, 5)) % 3; $host = $hosts[$host_index]; return memcache_connect($host, 11711); }