• memcached的安装、常用命令以及在实际开发中的案例


    Memcached注意
    缺乏安全认证以及安全管制
    需要将Memcached服务器放置在防火墙(iptables)之后


    Linux平台 (CentOS)安装Memcached

    安装依赖
    yum -y install libevent libevent-devel

    以下方式任选一种

    方式1. 自动安装方式
    yum -y install memcached
    
    # 方式2. 源代码编译方式安装
    wget https://memcached.org/latest
    mv latest memcached-1.5.20.tar.gz
    tar -zxvf memcached-1.5.20.tar.gz
    cd memcached-1.5.20
    ./configure --prefix=/usr/local/memcached
    make && sudo make install
    # Linux平台启动
    ./memcached -p 11211 -u root -m 64m
    或者
    ./memcached -p 11211 -u root -m 64m -d
    或者
    ./memcached -p 11211 -m 64m -d -u root -l 127.0.0.1 -c 256 -P /tmp/memcached.pid
    
    # Linux平台服务进程查看
    ps -ef | grep memcached
    # 根据端口查看
    netstat -tunpl | grep 11211
    
    # 关闭进程
    kill -9 pid号

    知识补充:
    Memcached命令启动
    -d:启动一个守护进程
    -m:分配给mecached服务的内存大小,单位MB
    -u:运行memcached服务的系统用户
    -l:服务监听的IP地址,可以有多个地址
    -p:服务监听的端口,默认11211
    -c:最大运行的并发客户端连接数,默认1024
    -P:设置保存服务的pid文件

    emcached客户端
    yum -y install telnet
    telnet 127.0.0.1 11211
        Trying 127.0.0.1...
        Connected to 127.0.0.1.
        Escape character is '^]'.
    
    ctrl + c 
    退出客户端

    Windows 平台

    32位系统下载地址
    http://downloads.northscale.com/memcached-win32-1.4.4-14.zip
    
    # 64位系统下载地址
    http://downloads.northscale.com/memcached-win64-1.4.4-14.zip
    
    # Windows平台安装启动
    C:memcachedmemcached.exe -d install
    C:memcachedmemcached.exe -d start
    C:memcachedmemcached.exe -d stop
    
    运行 -> pkgmgr /iu:"TelnetClient"

    Memcached常用命令

    set命令
    - 将数据值存储到内存当中,将value存储到key当中
    - 如果key已经存在,则更新该key的值,否则存储一个新的值
    - key:键名称
    - flags:服务器与用户提供的数据一起存储的32位无符号整数,并在检索到项目时随数据一起返回
    - exptime:在内存中保存数据的时间长度(单位:秒,0:永不过期)
    - bytes:缓存数据的字节数
    - noreply:不需要返回响应

        # 登录客户端
        telnet 127.0.0.1 11211
    
        # 存储命令
    
        # set 命令
        set www.test.com 1 0 4
        best
        STORED
    
        set www.test.com 1 0 4 noreply
        best
    
        # get 命令
        get www.test.com

    add命令
    - 将数据值存储到内存当中,将value存储到key当中

    add www.test.com 1 0 4
    best
    NOT_STORED
    
    add www.test.com 1 0 4 noreply
    best
    
    add new 1 0 4
    test
    STORED

    replace命令
    - 将已存储的key使用新值替换,如果key不存在,则替换失败

    replace www.test.com 1 0 4
    best
    STORED
    
    replace www.test.com 1 0 4 noreply
    best
    
    replace new2 1 0 4
    test
    NOT_STORED

    append命令
    - 向已存储的key的值后追加数据

    append www.test.com 1 0 4
    best
    STORED
    
    append www.test.com 1 0 4 noreply
    best
    
    append new3 1 0 4
    test
    NOT_STORED

    prepend命令
    - 向已存储的key的值前追加数据

    prepend www.test.com 1 0 4
    best
    STORED
    
    prepend www.test.com 1 0 4 noreply
    best
    
    prepend new3 1 0 4
    test
    NOT_STORED

    cas(check-and-set)命令
    - 当上一次当前客户端取值后,其他客户端没有对该key进行修改,才可以将值写入
    - flags:服务器与用户提供的数据一起存储的32位无符号整数,并在检索到项目时随数据一起返回
    - exptime:在内存中保存数据的时间长度(单位:秒,0:永不过期)
    - bytes:缓存数据的字节数,
    - unique_cas_token:通过 gets 命令获取的一个唯一的64位值
    - noreply:不需要返回响应

    gets www.imooc.com
    VALUE www.imooc.com 1 4 36
    best
    END
    
    cas www.imooc.com 1 0 4 36
    test
    STORED

    get命令
    - 获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空

    get www.test.com
    VALUE www.test.com 1 4
    test
    END
    
    get www.test.com test
    VALUE www.test.com 1 4
    test
    VALUE test 1 4
    test
    END

    gets命令
    - gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空

    gets www.test.com
    VALUE www.test.com 1 4 36
    test
    END
    
    gets www.test.com test
    VALUE www.test.com 1 4 36
    test
    VALUE test 1 4 37
    test
    END

    incr命令
    - 用于对已存在的 key(键) 的数字值进行自增操作

    set count 1 0 1
    1
    STORED
    
    incr count 1
    2
    
    incr count 1
    3

    decr命令
    - 用于对已存在的 key(键) 的数字值进行自减操作

    decr count 1
    2
    
    decr count 1
    1

    stats命令
    - 返回统计信息例如 PID(进程号)、版本号、连接数等

    stats items命令
    - 用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)

    # stats cachedump 命令

    stats cachedump 1 0
    ITEM www.test.com [4 b; 0 s]
    ITEM test [4 b; 0 s]
    END

    stats slabs命令
    - 用于显示各个slab的信息,包括chunk的大小、数目、使用情况等

    stats sizes命令
    - 用于显示所有item的大小和个数

    # 需要启动memcached时开启track_sizes
    ./memcached -u root -p 11211 -l 127.0.0.1 -d -o track_sizes

    stats sizes
    STAT 96 1
    END

    # delete 命令

    delete www.test.com
    DELETED

    flush_all命令
    - 用于清理缓存中的所有 key,value对
    - time:指定时间后清除


    安装PHP的memcached扩展

    方式1:自动安装

    yum -y install php-memcached
    
    重启httpd服务
    service httpd restart
    
    移除yum安装的php-memcached
    yum -y remove php-memcached

    方式2:编译安装

    # 安装依赖
    yum -y install zlib-devel
    yum -y install libmemcached-devel
    
    # 编译安装
    wget https://pecl.php.net/get/memcached-3.1.4.tgz 
    tar zxvf memcached-3.1.4.tgz
    
    cd memcached-3.1.4 
    /usr/bin/phpize
    
    ./configure --with-php-config=/usr/bin/php-config 
     make && make install
    
    # 修改php.ini
    vim /etc/php.ini
    
    # 添加
    extension="memcached.so"
    
    # 保存退出
    
    # 重启httpd服务
    service httpd restart
    
    # 临时关闭
    selinux
    setenforce 0
    
    # 永久关闭
    selinux
    vim /etc/selinux/config
    
    # 修改
    selinux
    selinux=disabled
    
    # 保存退出

    PHP案例:构建高速缓存
    - 如果缓存数据存在,请求memcached服务,查询缓存数据,显示给用户
    - 如果缓存数据不存在,请求数据源数据,将数据存储至缓存中
    第一次从数据库获取 


    第二次从缓存读取

    进入mysql 
    mysql -uroot -p
    
    创建数据库
    create database cms;
    use cms;
    
    创建数据表
    create table cms_users(
    id int unsigned not null auto_increment primary key,
    username varchar(50) not null default '',
    age tinyint unsigned not null default 0,
    sex tinyint unsigned not null default 0,
    major varchar(100) not null default '',
    created_time datetime null default CURRENT_TIMESTAMP
    )engine=innodb default charset=utf8;
    
    插入数据
    insert into cms_users(username,age,sex,major) values('cyy',22,1,'math');
    insert into cms_users(username,age,sex,major) values('cyy2',22,2,'chinese');
    insert into cms_users(username,age,sex,major) values('cyy3',23,3,'english');
    insert into cms_users(username,age,sex,major) values('cyy4',24,4,'business');
    insert into cms_users(username,age,sex,major) values('cyy5',25,5,'php');
    
    查看数据
    select * from cms_users;

    users.php

    <?php
    $start = microtime(true);
    
    # 建立memcached连接
    $mem = new Memcached();
    $mem->addServer('127.0.0.1', 11211);
    $key_name = 'users';
    $expire_time = 60;//过期时间
    
    # 判断用户数据在缓存当中是否存在,如果存在,直接get,显示给用户
    # 如果不存在,查询数据库,将数据写入到memcached当中,显示给用户
    
    if (false === ($users = $mem->get($key_name))) {
        # 数据不存在于缓存当中,调用PDO查询DB
        $users = fetchDataFromDB();
        # 将查询出的数据写入到memcached当中
        $mem->set($key_name, $users, time() + $expire_time);
    }
    
    function fetchDataFromDB() {
        echo 'Fetching data from db....';
        # Fetch users from mysql using PDO
        try {
            $dsn = "mysql:dbname=cms;host=localhost;port=3306";
            $pdo = new PDO($dsn, 'root', '123456', 
                    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
            $sql = 'select * from cms_users';
            $stmt = $pdo->prepare($sql);
            $stmt->execute();
            $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $pe) {
            echo $pe->getMessage();
        }
        return $users;
    }
    
    $sex_array = ['unknown', 'male', 'female'];
    echo '<table border=1>';
    echo '<tr><th>ID</th><th>USERNAME</th><th>AGE</th><th>SEX</th><th>MAJOR</th><th>CREATED_TIME</th></tr>';
    foreach ($users as $user) {
        echo '<tr>';
        echo '<td>'.$user['id'].'</td>';
        echo '<td>'.$user['username'].'</td>';
        echo '<td>'.$user['age'].'</td>';
        echo '<td>'.$sex_array[$user['sex']].'</td>';
        echo '<td>'.$user['major'].'</td>';
        echo '<td>'.$user['created_time'].'</td>';
        echo '</tr>';
    }
    echo '</table>';
    $end = microtime(true);
    echo "Running time: ". ($end-$start);

    小案例

    <?php
    
    $mem = new Memcached();
    
    # telnet 127.0.0.1 11211
    $mem->addServer('127.0.0.1', 11211);
    
    # stats
    $stats = $mem->getStats();
    # var_dump($stats);
    $mem->set('php_client', ['one' => 1, 'two' => 2], time() + 60);
    $res = $mem->get('php_client');
    var_dump($res);
  • 相关阅读:
    Unity Animation扩展方法总结
    Unity 离线建造系统
    Unity 任意区域截屏创建Sprite
    Unity ugui拖动控件(地图模式与物件模式)
    Unity 极简UI框架
    Unity 芯片拼图算法
    Unity Procedural Level Generator 基础总结与功能优化
    MANIFEST.MF是个什么?
    外包程序员怎么办?
    文件上传transferTo一行代码的bug
  • 原文地址:https://www.cnblogs.com/chenyingying0/p/12202188.html
Copyright © 2020-2023  润新知