搜尋
首頁後端開發php教程PHP之Memcache和Memcached

PHP之Memcache和Memcached

Apr 26, 2018 pm 02:46 PM
memcachememcached

這篇文章向大家介紹的是PHP中的Memcache和Memcached ,有興趣的朋友可以看一下

**Memcache介紹:**Memcache是​​一套分散式快取系統,分散式就是說可以在多台伺服器上同時安裝Memcache服務,這樣可以達到很好的叢集效果。高速,是因為Memcache資料都是維護在記憶體中的,它的讀取速度比儲存在硬碟中的資料的讀取速度快很多。
作用:當我們的應用訪問量比較大的時候,資料庫的壓力也會特別大,Memcache可以在應用程式和資料庫之間增加一個緩衝層,就是我們之前從資料庫中已經讀取到的數據,我們第二次或是接下來再讀取的時候,就可以直接存取Memcache去讀取這些數據,從而減輕Mysql等等資料庫的壓力
怎麼理Memcache:其實可以理解成,它是一個只有一張表的資料庫,這張表有兩個字段,分別是key和value,value是保存的數據,key就是這個數據的ID,用來保證查找時的唯一性
使用場景:
(1)非持久化儲存:對資料儲存要求不高,也就是說,如果這份資料遺失,也不會對系統造成太大的影響,因為當系統斷電或被重啟後記憶體會被清空掉,那麼之前保存在Memcache中的資料也會被清空掉。所以要把Memcache當作快取使用,而不要當成真正的資料庫
(2)分散式儲存:不適合單機使用,因為Memcache對記憶體的消耗很大,如果使用Memcache,推薦將其安裝在另一台台機器上單獨當作快取系統,而不要把Memcache和資料庫都裝到一台機器。
(3)Key/Value儲存:格式簡單,不支援List、Array資料格式

Memcached和Memcache是​​兩個版本,推薦Memcached,它有更多的改進和功能函數,是Memcache的升級版本,速度和穩定性都比較高

安裝Memcached
1,Memcache服務端的安裝
(1)編譯安裝,Libevent Memcache
先安裝Libevent這個擴展,編譯安裝的好處就是可以在安裝的過程進行一些自訂的設置,例如指定軟體安裝在哪裡,例如編譯安裝過程出現了哪些錯誤,而對Linux了解不是特別多的情況下,你可能處理錯誤的時候就會相對困難
(2)使用依賴管理工具yum、apt-get進行安裝

實際安裝:(作業系統是64位元的Centos)
如果要編譯安裝,需要將安裝套件提前下載下來libevent、memcached
這裡使用依賴管理工具安裝

#yum install memcached

啟動memcached

#/usr/bin/memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root/*
    -d:守护进程的模式启动。守护进程就是,当你从终端窗口推出之后,程序依然进行    -l:指定IP地址    -p:指定端口号    -m:为memcached分配多少内存,这里是以M为单位    -u:以哪个身份去启动memcached(线上的时候最好不要用超级管理员用户)*/

可以使用ps查看memcached進程是否啟動

#ps -ef | grep memcached

2,Memcache客戶端的安裝
1,安裝前置擴充功能Libmemcached
下載好libmemcached和memcached,對libmemcached進行解壓縮
這裡使用編譯安裝,
這裡有使用編譯安裝,進入解壓縮出來的資料夾

執行

#./configure --prefix=/usr/lib/libmemcached然后执行#make && makeinstall

2,為php安裝memcached擴充功能
解壓縮memcached,進入到解壓縮目錄當中

使用phpize的方式安裝memcached擴充

#phpize此时就会做出一个configure的文件#./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/lib/libmemcached-sasl后边是指定php的配置文件和刚安装的libmemcached的位置,大家根据自己的配置文件路径进行填写#make#make install执行完make install之后,我们会看见一个扩展目录,将该路径添加到php配置文件中
php.ini中加入
extension=memcached.so
然后重启服务器环境,查看php扩展#php -m | grep memecached

在PHP中使用memcached 系統類別:addServer
、addServers、getStats、getVersion 資料類別:add、setdelete、 flush、replace、increment、get

進階類別:setMulti、deleteMulti、getMulti、getResultCode、getResultMessage

更多關於memecached的操作,可以到php官網查看(php.net)

test.php<?php/*系统类*/$m = new Memcached();/*添加服务器*/$m->addServer(&#39;127.0.0.1&#39;, 11211);/*添加多台服务器*/$array = array(    array(&#39;127.0.0.1&#39;, 11211),    array(&#39;127.0.0.1&#39;, 11211)
);$m->addServers($array);/*查看服务器状态*/print_r($m->getStats());/*查看服务端版本号*/print_r($m->getVersion());/*数据类*/$m->add(&#39;mkey&#39;, &#39;mvalue&#39;, 0);//第三个参数是数据存在的时间,0表示永久echo $m->get(&#39;mkey&#39;);//获取数据/*假设对同一个key值进行两次添加的话,后边的操作不会覆盖前边的value,如果想替换掉,就使用replace*/$m->replace(&#39;mkey&#39;, &#39;mvalue2&#39;);/*还可以使用set方法表添加数据,它的好处就是,当我们的数据不存在时会帮我们新建数据,如果存在,就会覆盖原值*/$m->add(&#39;mkey&#39;, &#39;mvalue&#39;, 600);/*删除数据*/$m->delete(&#39;mkey&#39;);/*清空memcache中的所有缓存*/$m->flush();/*对memcache中整形数据进行+1或+任意数值的操作*/$m->set(&#39;num&#39;, 5, 0);$m->increment(&#39;num&#39;, 5);//每次刷新页面,num自增5$m->get(&#39;num&#39;);/*自减decrement用法相同*//*下边的方法只支持Memcached,不支持Memcache*//*一次添加多条数据*///原始方法,多次使用set()//现在可以使用setMulti()$data = array(    &#39;key&#39; => &#39;value&#39;,    &#39;key1&#39;=> &#39;value1&#39;);$m->setMulti($data,0);$result = $m->getMulti(array(&#39;key&#39;,&#39;key1&#39;));//获取多条数据print_r($result);//删除多条数据$m->deleteMulti(array(&#39;key&#39;,&#39;key1&#39;));//返回上一次操作返回的编码(数字的形式存在) 可以到手册中查看每一个编码的含义 echo $m->getResultCode();//比如  成功  返回0//获取操作结果echo $m->getResultMessage();//比如  成功  返回SUCCESS
封裝一個自己的Memcache類別

Memcached.class.php<?php/*
封装自己的Memcached类
1,扩展性
2,可调性
3,尽量简便的操作,一个方法多种功能
*//*
通过一个s()方法实现set()、get()、delete()操作
set    s($key,$value,$time)
get    s($key)
delete s($key,NULL)
*/class Mem
{    private $type = &#39;Memcached&#39;;//考虑到扩展性,实例化的可能是Memcache也可能是Memcached
    private $m;    private $time = 0;    private $error;    private $debug = &#39;true&#39;;    public function __construct()
    {         if(!class_exists($this->type)){            $this->error="No ".$this->type;            return false;
        }else{            $this->m=new $this->type;
        }
    }    //添加服务器
    public function addServer($arr)
    {        $this->m->addServers($arr);
    }    public function s($key, $value=&#39;&#39;, $time=NULL)
    {        $number = func_num_args();//该函数用来判断传递过来了几个参数
        if($number == 1){            return $this->get($key);
        }else if($number >= 2){            if($value === NULL){//一定要使用“全等于”,因为如果不是全等于,传递过来0也会通过
                $this->delete($key);
            }else{                $this->set($key, $value, $time);
            }
        }
    }    private function set($key, $value, $time=NULL)
    {        if($time === NULL)            $time = $this->time();        $this->m->set($key, $value, $time);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;
            }
        }
    }    private function get($key){        $result = $this->m->get($key);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;
            }
        }        return $result;
    }    private function delete($key)
    {        $this->m->delete($key);
    }    public function getError()
    {        if($this->error){            return $this->error();
        }else{            return $this->m->getResultMessage();
        }
    }

}
專案中使用Memcache
1,即時產生快取

比較適用於類似於新聞詳情頁,第一個人進入頁面時,生成緩存,當後邊的人再進入這個頁面時,可以直接從緩存中獲取數據,並且可以給數據設置一個過期時間,這樣的話,等看這個新聞的人比較少的時候就可以及時清除緩存,這樣可以達到節約內存的目的2,提前生成緩存

這種生成緩存的方式,比較適用於訪問量比較大且資料量比較多,類似網站首頁這種情況。可以使用定時腳本的方式,提前將快取生成3,永久快取

這種快取方案比較適合於關於單獨的頁面,它的修改頻率非常低,這時可以生成永久緩存###

**Memcache介绍:**Memcache是一套分布式缓存系统,分布式就是说可以在多台服务器上同时安装Memcache服务,这样可以达到很好的集群效果。高速,是因为Memcache数据都是维护在内存中的,它的读取速度比存储在硬盘中的数据的读取速度要快很多。
作用:当我们的应用访问量比较大的时候,数据库的压力也会特别大,Memcache可以在应用和数据库之间增加一个缓冲层,就是我们之前从数据库中已经读取到的数据,我们第二次或者是接下来再读取的时候,就可以直接访问Memcache去读取这些数据,从而减轻Mysql等等数据库的压力
怎样理Memcache:其实可以理解成,它是一个只有一张表的数据库,这张表有两个字段,分别是key和value,value是保存的数据,key就是这个数据的ID,用来保证查找时的唯一性
使用场景:
(1)非持久化存储:对数据存储要求不高,也就是说,如果这份数据丢失,也不会对系统造成太大的影响,因为当系统断电或被重启后内存会被清空掉,那么之前保存在Memcache中的数据也会被清空掉。所以要把Memcache当作缓存使用,而不要当成真正的数据库
(2)分布式存储:不适合单机使用,因为Memcache对内存的消耗很大,如果使用Memcache,推荐将其安装在另外一台机器上单独作为缓存系统,而不要把Memcache和数据库都装到一台机器。
(3)Key/Value存储:格式简单,不支持List、Array数据格式

Memcached和Memcache是两个版本,推荐Memcached,它有更多的改进和功能函数,是Memcache的升级版本,速度和稳定性都比较高

安装Memcached
1,Memcache服务端的安装
(1)编译安装,Libevent Memcache
先安装Libevent这个扩展,编译安装的好处就是可以在安装的过程进行一些自定义的设置,比如指定软件安装在哪儿,比如编译安装过程出现了哪些错误,而对Linux了解不是特别多的情况下,你可能处理错误的时候就会相对困难
(2)使用依赖管理工具yum、apt-get进行安装

实际安装:(操作系统是64位的Centos)
如果要编译安装,需要将安装包提前下载下来libevent、memcached
这里使用依赖管理工具安装

#yum install memcached

启动memcached

#/usr/bin/memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root/*
    -d:守护进程的模式启动。守护进程就是,当你从终端窗口推出之后,程序依然进行    -l:指定IP地址    -p:指定端口号    -m:为memcached分配多少内存,这里是以M为单位    -u:以哪个身份去启动memcached(线上的时候最好不要用超级管理员用户)*/

可以使用ps查看memcached进程是否启动

#ps -ef | grep memcached

2,Memcache客户端的安装
1,安装前置扩展Libmemcached
下载好libmemcached和memcached,对libmemcached进行解压
这里使用编译安装,进入解压出来的文件夹
执行

#./configure --prefix=/usr/lib/libmemcached然后执行#make && makeinstall

2,为php安装memcached扩展
解压memcached,进入到解压目录当中
使用phpize的方式安装memcached扩展

#phpize此时就会做出一个configure的文件#./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/lib/libmemcached-sasl后边是指定php的配置文件和刚安装的libmemcached的位置,大家根据自己的配置文件路径进行填写#make#make install执行完make install之后,我们会看见一个扩展目录,将该路径添加到php配置文件中
php.ini中加入
extension=memcached.so
然后重启服务器环境,查看php扩展#php -m | grep memecached

在PHP中使用memcached
系统类:addServer、addServers、getStats、getVersion
数据类:add、setdelete、flush、replace、increment、get
进阶类:setMulti、deleteMulti、getMulti、getResultCode、getResultMessage
更多关于memecached的操作,可以到php官网查看(php.net)

test.php<?php/*系统类*/$m = new Memcached();/*添加服务器*/$m->addServer(&#39;127.0.0.1&#39;, 11211);/*添加多台服务器*/$array = array(    array(&#39;127.0.0.1&#39;, 11211),    array(&#39;127.0.0.1&#39;, 11211)
);$m->addServers($array);/*查看服务器状态*/print_r($m->getStats());/*查看服务端版本号*/print_r($m->getVersion());/*数据类*/$m->add(&#39;mkey&#39;, &#39;mvalue&#39;, 0);//第三个参数是数据存在的时间,0表示永久echo $m->get(&#39;mkey&#39;);//获取数据/*假设对同一个key值进行两次添加的话,后边的操作不会覆盖前边的value,如果想替换掉,就使用replace*/$m->replace(&#39;mkey&#39;, &#39;mvalue2&#39;);/*还可以使用set方法表添加数据,它的好处就是,当我们的数据不存在时会帮我们新建数据,如果存在,就会覆盖原值*/$m->add(&#39;mkey&#39;, &#39;mvalue&#39;, 600);/*删除数据*/$m->delete(&#39;mkey&#39;);/*清空memcache中的所有缓存*/$m->flush();/*对memcache中整形数据进行+1或+任意数值的操作*/$m->set(&#39;num&#39;, 5, 0);$m->increment(&#39;num&#39;, 5);//每次刷新页面,num自增5$m->get(&#39;num&#39;);/*自减decrement用法相同*//*下边的方法只支持Memcached,不支持Memcache*//*一次添加多条数据*///原始方法,多次使用set()//现在可以使用setMulti()$data = array(    &#39;key&#39; => &#39;value&#39;,    &#39;key1&#39;=> &#39;value1&#39;);$m->setMulti($data,0);$result = $m->getMulti(array(&#39;key&#39;,&#39;key1&#39;));//获取多条数据print_r($result);//删除多条数据$m->deleteMulti(array(&#39;key&#39;,&#39;key1&#39;));//返回上一次操作返回的编码(数字的形式存在) 可以到手册中查看每一个编码的含义 echo $m->getResultCode();//比如  成功  返回0//获取操作结果echo $m->getResultMessage();//比如  成功  返回SUCCESS

封装一个自己的Memcache类

Memcached.class.php<?php/*
封装自己的Memcached类
1,扩展性
2,可调性
3,尽量简便的操作,一个方法多种功能
*//*
通过一个s()方法实现set()、get()、delete()操作
set    s($key,$value,$time)
get    s($key)
delete s($key,NULL)
*/class Mem
{    private $type = &#39;Memcached&#39;;//考虑到扩展性,实例化的可能是Memcache也可能是Memcached
    private $m;    private $time = 0;    private $error;    private $debug = &#39;true&#39;;    public function __construct()
    {         if(!class_exists($this->type)){            $this->error="No ".$this->type;            return false;
        }else{            $this->m=new $this->type;
        }
    }    //添加服务器
    public function addServer($arr)
    {        $this->m->addServers($arr);
    }    public function s($key, $value=&#39;&#39;, $time=NULL)
    {        $number = func_num_args();//该函数用来判断传递过来了几个参数
        if($number == 1){            return $this->get($key);
        }else if($number >= 2){            if($value === NULL){//一定要使用“全等于”,因为如果不是全等于,传递过来0也会通过
                $this->delete($key);
            }else{                $this->set($key, $value, $time);
            }
        }
    }    private function set($key, $value, $time=NULL)
    {        if($time === NULL)            $time = $this->time();        $this->m->set($key, $value, $time);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;
            }
        }
    }    private function get($key){        $result = $this->m->get($key);        if($this->debug){            if($this->m->getResultCode() != 0){                return false;
            }
        }        return $result;
    }    private function delete($key)
    {        $this->m->delete($key);
    }    public function getError()
    {        if($this->error){            return $this->error();
        }else{            return $this->m->getResultMessage();
        }
    }

}

项目中使用Memcache
1,即时生成缓存
比较适用于类似于新闻详情页,第一个人进入页面时,生成缓存,当后边的人再进入这个页面时,可以直接从缓存中获取数据,并且可以给数据设置一个过期时间,这样的话,等看这个新闻的人比较少的时候就可以及时清除缓存,这样可以达到节约内存的目的
2,提前生成缓存
这种生成缓存的方式,比较适用于访问量比较大且数据量比较多,类似于网站首页这种情况。可以使用定时脚本的方式,提前将缓存生成
3,永久缓存
这种缓存方案比较适合于关于单独的页面,它的修改频率非常低,这时可以生成永久缓存

相关推荐:

php模块memcache和memcached区别分析_PHP教程

以上是PHP之Memcache和Memcached的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP的當前狀態:查看網絡開發趨勢PHP的當前狀態:查看網絡開發趨勢Apr 13, 2025 am 12:20 AM

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP與其他語言:比較PHP與其他語言:比較Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能PHP與Python:核心功能Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP:網絡開發的關鍵語言PHP:網絡開發的關鍵語言Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP:許多網站的基礎PHP:許多網站的基礎Apr 13, 2025 am 12:07 AM

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

超越炒作:評估當今PHP的角色超越炒作:評估當今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

PHP中的弱參考是什麼?什麼時候有用?PHP中的弱參考是什麼?什麼時候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

解釋PHP中的__ Invoke Magic方法。解釋PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器