Memcached 工作原理和内存管理

memcache 的回收机制会采用 最近最少算法 将很久没有使用的数据进行清除
Ubuntu 下安装
如果需要编译安装的话,需要先安装 libmemcached 组件才可以
# 安装 memcached
sudo apt-get install memcached
# 安装 php-memcached 扩展
sudo apt install php-memcached
进入 memecached 环境,直接使用 telnet 访问 11211 端口
telnet 127.0.0.1 11211
测试
# 设置键名为 user1 对值不进行压缩 过期时间为 900s 长度为 8 字节
set user1 0 900 8 <直接回车>
alex <直接回车>
get user1 <直接回车>
另外还需要去 phpinfo() 中去查询一下 memcached 扩展是否安装完毕!
清空 memcached 中所有数据
# 直接重启 memcached 服务即可
service memcached restart
在 PHP 中使用 Memcached
特别说明:
以下命令中,flags 的意思是是否将值使用 MEMCACHE_COMPRESSED 指定对值进行压缩(使用zlib),如果需要不压缩,直接设置为 false 即可。exptime (单位:秒) 如果设置为 0 则表示,没有过期时间。bytes 为字节数。
| 命令 | 说明 | Cli 命令示例 | PHP 的写法 |
|---|---|---|---|
| set | 存储 | set key flags exptime bytes [noreply] value | m->setMulti(array('key1' => 'value1', 'key2' => 'value2'), time() + 300); |
| add | 不存在则存储 | add key flags exptime bytes [noreply] value | $m->add(key, value, 3600); |
| replace | 存在则替换 | replace key flags exptime bytes [noreply] value | $m->replace(key, value, time() + 300); |
| append | 已存在键后面追加数据 | append key flags exptime bytes [noreply] value | $m->append(key, value); |
| prepend | 已存在键前面追加数据 | prepend key flags exptime bytes [noreply] value | $m->prepend(key, value); |
| cas | 最后一次取值后未修改再写入 | cas key flags exptime bytes unique_cas_token [noreply] value | $m->cas(cas_token, key, value); |
| get | 取值 | get key get key1 key2 key3 | m->getMulti(array('key1', 'key3', 'badkey')); |
| gets | 获取带有 cas 令牌的值 | get key gets key1 key2 key3 | cas); cas); |
| delete | 删除 | delete key [noreply] | $m->delete(key, time); |
| incr | 数字值自增 | incr key number | $m->increment(key, number); |
| decr | 数字值自减 | decr key number | $m->decrement(key, number); |
| stats | 统计信息 | stats | $m->getStats(); |
php 演练
<?php
class MyMemcached
{
private static $handle;
/**
* 连接 memcached 数据库
*
* @return \Memcached
*/
public static function init()
{
$option = ['host' => '127.0.0.1', 'port' => 11211];
if (!self::$handle) {
self::$handle = new \Memcached();
self::$handle->addServer($option['host'], $option['port']);
}
return self::$handle;
}
/**
* 设置数据
*
* @param $key string 键名
* @param $value 键值
* @param int $expire 过期时间,默认为 0,不过期,但重启 memcached 后,会清空所有的值
* @return bool
*/
public static function set($key, $value, $expire = 0)
{
if (!self::init()) return false;
return self::init()->set($key, $value, $expire);
}
/**
* 获取指定键名所对应的值
*
* @param $key string|array 键名
* @return bool
*/
public static function get($key)
{
if (!self::init()) return false;
$func = is_array($key) ? 'getMulti' : 'get';
return self::init()->{$func}($key);
}
/**
* 数字递增
*
* @param $key string 键名
* @param int $number 步长,默认为 1
* @return bool|int
*/
public static function incr($key, $number = 1)
{
if (!self::init()) return false;
// 有 key 时,才能够递增
// 不存在 key 时则存储,用于设置起始值
self::init()->add($key, 0);
return self::init()->increment($key, $number);
}
/**
* 调用
*/
public function index()
{
// 连接 memcached
$m = self::init();
// 使用 memcached 原生类设置值
$m->set('user1', 'alex');
// 使用封装方法调用
$data = self::get('user1');
var_dump($data);
}
}

最后说个事
公号算法变了,为防止看不到我的更新
大家帮忙加个星标
点击上方的公众号卡片
再点右上角三个点
就能看到设为星标
算我跪下来求你们
往期精选:
文章转载自蒲东平,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




