暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Memcached 迷之初探

蒲东平 2023-12-15
194

Memcached 工作原理和内存管理

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] valuem->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 key3m->getMulti(array('key1', 'key3', 'badkey'));
gets获取带有 cas 令牌的值get key    gets key1 key2 key3cas);  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);
    }


}



最后说个事
公号算法变了,为防止看不到我的更新
大家帮忙加个星标
点击上方的公众号卡片
再点右上角三个点
就能看到设为星标
算我跪下来求你们

往期精选:

微信又出了款重磅APP,体验下?

还在使用默认的微信图标?赶紧换个吧!

我的微信和你们的不一样!?

文章转载自蒲东平,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论