Maison >développement back-end >tutoriel php >PHP Memcache et Memcached

PHP Memcache et Memcached

不言
不言original
2018-04-26 14:46:0610510parcourir

Cet article présente Memcache et Memcached en PHP. Les amis intéressés peuvent y jeter un œil

**Introduction à Memcache :**Memcache est un système de cache distribué, et distribué est On dit que le service Memcache est distribué. peut être installé sur plusieurs serveurs en même temps, afin d'obtenir un bon effet de cluster. La vitesse élevée est due au fait que les données Memcache sont conservées en mémoire et que leur vitesse de lecture est beaucoup plus rapide que la vitesse de lecture des données stockées sur le disque dur.
Fonction : Lorsque notre application a un nombre de visites relativement important, la pression sur la base de données sera particulièrement élevée. Memcache peut ajouter une couche tampon entre l'application et la base de données, ce que nous avons. précédemment obtenues à partir de la base de données. Lorsque nous lisons les données pour la deuxième fois ou la prochaine fois, nous pouvons accéder directement à Memcache pour lire les données, réduisant ainsi la pression sur Mysql et d'autres bases de données
Comment gérer Memcache :En fait, on peut comprendre qu'il s'agit d'une base de données avec une seule table. Cette table comporte deux champs, à savoir la clé et la valeur sont les données enregistrées, et la clé est l'ID des données, qui est utilisé pour garantir. les résultats de la recherche. Unicité
Scénarios d'utilisation :
(1) Stockage non persistant : Les exigences en matière de stockage de données ne sont pas élevées, c'est-à-dire que si ces données sont perdues, elles le seront. ne cause pas beaucoup de dommages au système. L'impact est dû au fait que lorsque le système est éteint ou redémarré, la mémoire sera effacée et les données précédemment stockées dans Memcache seront également effacées. Par conséquent, Memcache doit être utilisé comme cache, pas comme une véritable base de données
(2) Stockage distribué : ne convient pas à une utilisation autonome, car Memcache consomme beaucoup de mémoire. Si vous utilisez Memcache, il est recommandé de l'installer. sur une autre machine. Utilisez une seule machine comme système de cache au lieu d'installer à la fois Memcache et la base de données sur une seule machine.
(3) Stockage clé/valeur : format simple, ne prend pas en charge les formats de données List et Array

Memcached et Memcache sont deux versions, Memcached est recommandé, il a plus d'améliorations et de fonctions, et Memcache la mise à niveau la version a une vitesse et une stabilité plus élevées

Installer Memcached
1 Installation du serveur Memcache
(1) Compilez et installez Libevent Memcache
En premier. installez l'extension Libevent. L'avantage de la compilation et de l'installation est que vous pouvez effectuer certains paramètres personnalisés pendant le processus d'installation, tels que spécifier l'emplacement d'installation du logiciel, par exemple les erreurs survenues lors du processus de compilation et d'installation, et je ne le fais pas. en savez beaucoup sur Linux. Dans ce cas, il peut être relativement difficile pour vous de gérer les erreurs
(2) Utilisez les outils de gestion des dépendances yum et apt-get pour installer

Installation réelle : (Le système d'exploitation est Centos 64 bits)
Si vous souhaitez compiler et installer, vous devez télécharger le package d'installation libevent et memcached à l'avance
Utilisez l'outil de gestion des dépendances pour l'installer ici

#yum install memcached

Démarrez 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(线上的时候最好不要用超级管理员用户)*/

Vous pouvez utiliser ps pour le voir. Si le processus memcached est démarré

#ps -ef | grep memcached

2. Installation du client Memcache
1. Installez la pré-extension Libmemcached
Téléchargez libmemcached et memcached, et décompressez libmemcached
Utilisez la compilation et l'installation ici, entrez dans le dossier décompressé
Exécutez

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

2, installez l'extension memcached pour php
Extraire memcached, entrez dans le répertoire de décompression
Utiliser phpize Installer l'extension 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

Utiliser memcached en PHP
Classes système : addServer, addServers, getStats, getVersion
Classes de données : ajouter, set, supprimer, vider, remplacer, incrémenter, get
Classes avancées : setMulti, deleteMulti, getMulti, getResultCode , getResultMessage
Pour plus d'opérations sur memecached, vous pouvez accéder au site officiel de 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

Encapsuler votre propre classe 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();
        }
    }

}

Utilisez Memcache dans le projet
1, la génération de cache instantanée
est plus adaptée aux pages de détails d'actualités Lorsque la première personne entre dans la page, un cache est créé. généré lorsque les personnes suivantes entrent à nouveau dans la page, elles peuvent accéder directement au cache à partir du cache et vous pouvez définir un délai d'expiration pour les données. Dans ce cas, le cache peut être vidé à temps lorsqu'il y en a moins. les gens qui regardent les informations, ce qui peut atteindre l'objectif d'économiser de la mémoire
2. Générer du cache à l'avance
Cette méthode de génération de cache est plus adaptée aux situations où le nombre de visites est relativement important et la quantité de données est importante, similaire à la page d'accueil du site Web. Vous pouvez utiliser un script chronométré pour générer un cache
3 à l'avance et un cache permanent
Ce schéma de mise en cache est plus adapté aux pages individuelles. Sa fréquence de modification est très faible. peut être généré Cache permanent

**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教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn