编程技术

PHP 之 Memcache 入门

cnguu · 10月29日 · 2018年 ·

使用场景

  1. 非持久化存储:对数据存储要求不高
  2. 分布式存储:不适合单机使用
  3. Key/Value 存储:格式简单,不支持 List、Array 数据格式

Memcached 是升级版,建议使用

Memcache:文档

Memcached:文档

常见操作

分类名称
系统类addServer
addServers
getStats
getVersion
数据类add
set
delete
flush
replace
increment
decrement
get
进阶类setMulti
deleteMulti
getMulti
getResultCode
getResultMessage

系统类简单操作

<?php
$m = new Memcached();
$servers = [
    ['127.0.0.1', 11211],
    ['127.0.0.2', 11211],
];
$m->addServers($servers);
print_r($m->getVersion());

运行结果:

Array
(
    [127.0.0.1:11211] => 1.4.22
    [127.0.0.2:11211] => 255.255.255
)

数据类简单操作

<?php
$m = new Memcached();
$servers = [
    ['127.0.0.1', 11211],
];
$m->addServers($servers);

$m->add('name', 'cnguu', 600);   // 添加
echo $m->get('name');            // cnguu
$m->replace('name', 'Tom', 600); // 替换值
echo $m->get('name');            // Tom
                                 // set() 是 add() 和 replace() 的合体
$m->delete('name');              // 删除

批量操作

<?php
$m = new Memcached();
$servers = [
    ['127.0.0.1', 11211],
];
$m->addServers($servers);

$data = [
    'name1' => 'first name',
    'name2' => 'second name',
];
$m->setMulti($data, 0);
$result = $m->getMulti(['name1', 'name2']);
print_r($result);

运行结果:

Array
(
    [name1] => first name
    [name2] => second name
)

简单封装

memcached.class.php 文件

<?php
class Mem
{
    private $type = 'Memcached';
    private $m;
    private $time = 0;
    private $error;
    private $debug = true;

    public function __construct()
    {
        if (!class_exists($this->type)) {
            $this->error = '没有找到:' . $this->type;
            return false;
        } else {
            $this->m = new $this->type;
        }
    }

    public function addServer($servers)
    {
        $this->m->addServers($servers);
    }

    public function s($key, $value = '', $time = null)
    {
        $number = func_num_args();
        if ($number == 1) {
            return $this->get($key);
        } else if ($number >= 2) {
            if ($value === null) {
                $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)
    {
        $return = $this->m->get($key);
        if ($this->debug) {
            if ($this->m->getResultCode() != 0) {
                return false;
            }
        }
        return $return;
    }

    private function delete($key)
    {
        $this->m->delete($key);
    }

    public function getError()
    {
        if ($this->error) {
            return $this->error;
        } else {
            return $this->m->getResultMessage();
        }
    }
}

index.php 文件

<?php
require_once 'memcached.class.php';
$m = new Mem();
$m->addServer([['127.0.0.1', 11211]]);
$m->s('name', 'cnguu', 1800); // 添加
echo $m->s('name');           // cnguu
$m->s('name', null);          // 删除

注意事项

  1. 不要在单机模式中使用
  2. 不要只使用 Memcache 保存重要数据
  3. 定期查看缓存的分布状况和击中情况
0 条回应