構建高性能Web站點-10.分佈式緩存

緩存應對的場景php

  • 一個網頁存在不一樣區域的內容,不一樣區域的更新內容和頻率各不相同html

  • 動態計算信息,並根據結果展現不一樣的內容,例如登錄狀態,每一個用戶狀態不一樣,顯示不一樣mysql

  • 頁面級的緩存(靜態文件),只提升了讀的效率,沒有解決寫的效率的問題算法

memcached

在數據庫和動態內容之間創建緩存區,並部署在獨立服務器上,用於加速讀寫操做,這裏是使用memcached來講明sql

memcached是啥?

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);

閱讀數+1(寫操做)

<?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

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);
}
相關文章
相關標籤/搜索