高性能内存对象缓存 Memcached

高性能内存对象缓存 Memcached

Memcached 概述

  • 一套开源的高性能分布式内存对象缓存系统

  • 所有的数据都存储在内存中

  • 支持任意存储类型的数据

  • 提高网站的访问速度

Memcached 是典型的 C/S 架构,因此需要安装 Memcached 服务端与 Memcached API 客户端。

高性能内存对象缓存 Memcached_第1张图片

数据存储方式与数据过期方式

①数据存储方式: Slab Allocation

  • 按组分配内存,每次先分配一个Slab,相当于一个大小为 1M 的页,然后在 1M 的空间里根据数据划分大小相同的 Chunk

  • 能够有效解决内存碎片问题,但是对内存空间会有所浪费

高性能内存对象缓存 Memcached_第2张图片

②数据过期方式

  • LRU: 数据空间不足时,会根据 LRU 的情况淘汰最近最少使用的记录

  • Laxzy Expiration: 情性过期,是指使用 get 时查看记录时间,从而检查记录是否已经过期

Memcached缓存机制

当程序写入缓存数据请求时,Memcached 的 API 接口将 Key 输入路由算法模块路由到集群中一台服务,之后由 API 接口与服务器进行通信,完成一次分布式缓存写入

高性能内存对象缓存 Memcached_第3张图片

Memcached分布式

要依赖于 Memcached 的客户端来实现

多个 Memcached 服务器是独立的

分布式数据如何存储是由路由算法所决定

高性能内存对象缓存 Memcached_第4张图片

当数据到达客户端程序库时,客户端的算法就依据路由算法来决定保存的 Memcached 服务器。

读取数据时,客户端依据保存数据时的路由算法选中和存储数据时相同的服务器来读取数据。

Memcached 路由算法

①求余数 hash 算法

  • 先用 key 做 hash 运算得到一个整数,再做hash算法,根据余数进行路由·

  • 适合大多数据需求,但是不适合用在动态变化的环境

②一致性 hash 算法

  • 按照 hash 算法把对应的 key 通过一定的 hash 算法处理后映射形成一个首尾相接闭合循环,然后通过使用与对象存储一样的 hash 算法将机器也映射到环中,顺时针方向计算将所有对象存储到里自己最近的机器中
  • 适合在动态变化的环境中使用

安装 Memcached 服务器

1 源码安装 Libevent

Libevent 是一款跨平台的时间处理接口的封装,可以兼容多个操作系统的事件访问。

Memcached 的安装依赖于 Libevent ,因此需要先安装 Libevent 。

# 源码包
libevent-2.1.8-stable.tar.gz
tar -zxvf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable/
./configure --prefix=/usr/local/libevent
make
make install

2 源码安装 Memcached

# 源码包
memcached-1.5.1.tar.gz
tar zxf memcached-1.5.1.tar.gz
cd memcached-1.5.1/
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make
make install

3 Memcached 服务优化

路径优化

ln -s /usr/local/memcached/bin/* /usr/local/bin/

服务启动命令

memcached -d -m 128 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /usr/local/memcached/memcached.pid
-p <num>  要监听的TCP端口号(默认值:11211)
-U <num>  要监听的UDP端口号(默认值:11211,0关闭)
-s <file> 要监听的unix套接字路径(禁用网络支持)
-P <file> PID 文件路径
-l <ip_addr> 要监听的接口,默认为环境变量 INDRR_ANY 的值
-d 作为守护进程运行
-r 最大化核心文件限制
-u <username> 假设 username 的身份(仅当以root身份运行时)
-m <num> 用于项目的最大内存(兆字节),默认为64 MB
-M 内存耗尽时返回错误(而不是删除项目)
-c <num> 最大同时连接数,默认值为1024
-k 锁定所有分页的内存。请注意,有一个限制您可以锁定的内存量。正在尝试分配更多的资源会失败,所以一定要为您启动 的用户正确设置限制带有(不适用于-u <username> 用户;

确定服务是否启动

netstat -anpt | grep 11211

拓展:建立 Memcached 服务启动脚本

vim /etc/init.d/memcached
#!/bin/bash
#description: Memcached Service Daemon
#processname: Memcached
#chkconfig: 2345 90 50

#Source function library.
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network

memcached_exec="/usr/local/bin/memcached"
memcached_pid="/var/run/memcached.pid"
lockfile="/var/lock/subsys/memcached"
prog="memcached"

memcached_host="127.0.0.1"
memcached_port=11211
memcached_memory="1024"

start() {
  if [ $UID -ne 0 ]; then
    echo "User has insufficient privilege."
    exit 4
  fi
  [ -x $memcached_exec ] || exit 5
  echo -n $"starting $prog: "
  daemon $memcached_exec -u daemon -d -m $memcached_memory  -l $memcached_host -p $memcached_port -c 256 -P $memcached_pid
  retval=$?
  echo
  [ $retval -eq 0 ] && touch $lockfile
}

stop() {
  if [ $UID -ne 0 ]; then
    echo "User has insufficient privilege."
    exit 4
  fi
  echo -n $"Stopping $prog: "
    if [ -n "`pidfileofproc $memcached_exec`" ]; then
        killproc $memcached_exec

    else
        failure $"stopping $prog"
    fi
  retval=$?
  echo
  [ $retval -eq 0 ] && rm -f $lockfile
}

status() {
  # run checks to determine if the service is running or use generic status
  status $prog
}

case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "restart")
    stop
    sleep 3
    start
    ;;
  "status")
    status
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart}"
    exit 1
    ;;
esac
exit $?
# 添加执行权限
chmod +x /etc/init.d/memcached
# 查看memcached服务是否在chkconfig管理列表:
chkconfig --list memcached
# 将其加入chkconfig管理:
chkconfig --add memcached
# 在执行等级2,3,5开启memcached系统服务
# linux系统执行等级为0-6级。0代表关机,1是单用户模式,2是多用户状态,3是完整的多用户模式(有NFS),4是暂时没有启用的保留等级,5是图形工作模式,6是系统正常关闭并重启。
chkconfig --level 235 memcached on  
# memcached服务启动
chkconfig --list | grep memcached
service memcached start
service memcached stop
service memcached restart

Memcached 数据库操作与管理

Memcached 协议简单,可直接使用 telnet 连接 Memcached 的 11211 端口。

# telnet默认没有安装,需要自行安装
yum -y install telnet
[root@localhost ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
// 输入操作指令

查看版本

version

操作命令格式

<command name><key><flags><exptime><bytes><data block>

常见操作指令

1 添加一条键值数据 add

add username 0 0 7
1234567
STORED
——————————————
其中add username 0 0 7
username 键值名
第一个0 表示自定义信息为0
第二个0 表示过期时间为0;0表示永不过期,单位秒
7 表示字计数
1234567 是键值,注意输入长度为7字节,与设定值相符合

2 查询键值数据 get

get username
VALUE username 0 7
1234567
END

如果需要检查最近是否更新,可以使用命令 gets ,最后一位显示的是更新因子,每更新一次更新因子数加1.

gets username
VALUE username 0 7 1
1234567
END

3 更新一条键值数据 set

set 后跟需要更新的键值名、标记位、过期时间、字节数。

如果键值名不存在, set 相当于 add

set username 0 0 5
12345
STORED
get username
VALUE username 0 5
12345
END

如果仅是单纯地更新,使用 replace ;此时更新的键值名必须存在,如果不存在,则会报错 NOT_STORED

replace username 0 0 6
123456
STORED
replace abc 0 0 3
123
NOT_STORED

4 清除一条缓存数据 delete

delete username
DELETED
get username
END

使用 delete 删除一条键值为 username 的缓存数据,使用 get 产看发现没有内容存在

5 检查后更新 cas

如果 cas 的最后一个更新因子数与 gets 返回的更新因子数相等,则更新;否则返回 EXISTS。

add username 0 0 7     // 新增一条键值
1234567
STORED
gets username     // 查询 usernaem 键值
VALUE username 0 7 4     // 更新因子数:4
1234567
END
cas username 0 0 7 1    // 输入一个与 gets 查询的更新因子不同的更新因子数
abcdefg
EXISTS    // 报错
cas username 0 0 7 4    // 输入更新因子数4
abcdefg
STORED    // 检查并更新成功
get username    // 查询
VALUE username 0 7
abcdefg    // 键值已经改变
END

6 追加数据 append/prepend

append username 0 0 5    // 向后追加 5 字节
12345
STORED
get username
VALUE username 0 12
abcdefg12345
END
prepend username 0 0 2    // 向前追加 2 字节
AB
STORED
get username
VALUE username 0 14
ABabcdefg12345
END

7 清除所有缓存数据 flush_all

flush_all
OK
get username
END

8 查看服务器统计数据 stats

stats
stats items //返回所有键值对统计信息
stats cachedump 1 0 //返回指定存储空间的键值对
stats slabs //显示各个 slab 的信息,包括 chunk 的大小、数目、使用情况等
stats sizes //输出所有 item 的大小和个数
stats reset //清空统计数据	

安装配置基于PHP的 Memcached API 客户端

Memcache支持多客户端,如perl,php,python,c/c++等等,这里主要基于php配置

高性能内存对象缓存 Memcached_第5张图片

我这里的搭建是基于已经源码安装完成 nginx 和 php;建议使用 LNMP 环境

① 安装 Libmemcached 库

Libmemcached 库提供的 API 与 Memcached 服务端进行交互

memcached 在1.2.4版本(含)以上增加了 CAS(Check and Set) 协议,即对同一 key 的多进程的并发处理问题

类比数据库,如果同时有多个进程对同一张表的同一数据进行更新,数据库可以锁定整张表,也可以锁定表内某一行数据,memcached 的 CAS 功能与此相似;

但 php-memcache 扩展不支持 CAS,需要先安装 php-memcached 扩展(注意与php-memcache扩展的区别),php-memcached 扩展基于 libmemcached,所以要先安装 libmemcached,即php-memcached的库。

# libmemcached版本:1.0.18
libmemcached-1.0.18.tar.gz
# 下载
wget https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz
# 编译安装,生成Makefile文件时,切记“--with-memcached”参数
[root@localhost ~]# tar xf libmemcached-1.0.18.tar.gz
[root@localhost ~]# cd libmemcached-1.0.18
[root@localhost libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --with-memcached
[root@localhost libmemcached-1.0.18]# make && make install

②安装php-memcached,即 Memcached 扩展

编译安装 PHP 的 Memcached 拓展组件

# 安装包
# php-memcached版本:2.2.0(3.0.0及以上版本针对php7.0及以上版本)
memcached-2.2.0.tgz
# 下载
wget http://pecl.php.net/get/memcached-2.2.0.tgz

需要注意的是,在配置 Memcached API 时,memcached-2.2.0.tgz 源码包中默认没有 configure 配置脚本,需要使用 PHP 的 phpize 脚本生成配置脚本 configure

phpize: 用于扩展 php 模块,通过 phpize 可以建立 php 的外挂模块;位于 php 安装目录下 bin 目录下面

[root@localhost ~]# tar xf memcached-2.2.0.tgz
[root@localhost ~]# cd memcached-2.2.0
[root@localhost memcached-2.2.0]# /usr/local/php5/bin/phpize
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@localhost memcached-2.2.0]# ./configure --enable-memcached --with-php-config=/usr/local/php5/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl    # --disable-memcached-sasl 关闭 Memcahced 的 SASL 认证功能,否则报错
[root@localhost memcached-2.2.0]# make && makeinstall
Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/					# 安装完成后,会提示一个共享组件的位置

③安装 php-memcache

# php-memcached版本:2.2.7(stable version)
memcache-2.2.7.tgz
# 下载php-memcache
wget http://pecl.php.net/get/memcache-2.2.7.tgz
[root@localhost ~]# tar xf memcache-2.2.7.tgz
[root@localhost ~]# cd memcache-2.2.7
[root@localhost memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/usr/local/php5/bin/php-config
[root@localhost memcache-2.2.7]# make && make install
Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/

④安装 php-intl (原生扩展样例,非必须项)

# php-intl版本:3.0.0
# 下载
wget http://pecl.php.net/get/intl-3.0.0.tgz
# 通过查看 php 源码解压包下的“ext/”目录,php-intl 属于原生扩展,理论上可以不用下载,直接在“ext/”下相应扩展目录下编译安装即可;

php-intl 是 php 国际化扩展,是 ICU 库的一个包装器,安装 php-intl 扩展前要先安装 ICU 库

[root@localhost ~]# yum install -y icu libicu libicu-devel
[root@localhost ~]# cd /usr/local/php-5.5.24/ext/intl
								// 进入到php源码解压包 intl 所在目录
[root@localhost intl]# /usr/local/php5/bin/phpize 
[root@localhost intl]# ./configure --enable-intl --with-php-config=/usr/local/php5/bin/php-config
[root@localhost intl]# make && make install
Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/

⑤配置 PHP,启动拓展

php启用扩展有2种方式(本文介绍方式1):

(1)直接在php.ini文件中添加扩展如“extension = xxx.so”;

(2)单独创建ini文件,然后php.ini调用这些创建的文件即可(可通过php5enmod工具支持或者手工配置)。

这里采用第一种:编辑 PHP 配置文件vim /usr/local/php5/php.ini

[Intl]
extension = intl.so     # 相对路径
[Memcached]
extension = memcached.so
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/"
[Memcache]
extension = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/memcache.so"
              # 绝对路径

⑥验证拓展是否安装成功

# 重启 nginx 
systemctl restart nginx
# 重启 php-fpm
pkill php-fpm
/usr/local/php5/sbin/php-fpm

查看拓展模块

[root@localhost ~]# /usr/local/php5/bin/php -m | grep -E 'memcache|intl'
intl
memcache
memcached

phpinfo() 方式,利用前面已经生成的 index.php 文件即可

高性能内存对象缓存 Memcached_第6张图片

⑦ 测试 Memcached API 功能

通过编写简单的 PHP 测试代码调用 Memcache 程序接口,来测试是否与 Memcached 服务器协同工作

<?php
$memcache = new Memcache;       #创建一个memcache对象
$memcache->connect('192.168.153.132', 11211) or die ("Could not connect"); 
							#连接 memcached1 服务器
$memcache->set('key', 'memcache-test');    #设置1个变量到内存中,key=key, value=memcache-test
$get_value = $memcache->get('key');     #从内存取出key的value
echo $get_value;     #回显
?> 

高性能内存对象缓存 Memcached_第7张图片

Keepalived+Memcached实现主主复制和高可用

Memcached 主主复制是指在任意一台 Memcached 服务器修改数据都会被同步到另外一台,但是 Memcached API客户端是无法判断连接到哪一台 Memcached 服务器的,所以需要设置 VIP 地址,提供给 Memcached API客户端进行连接。可以使用keepalived 产生的 VIP 地址连接主 Memcached 服务器,并且提供高可用架构。

案例环境

高性能内存对象缓存 Memcached_第8张图片

Memcached 主主复制架构

Memcached 的复制功能支持多个 Memcached 之间进行相互复制(双向复制,主备都是可读可写的),可以解决 Memcached 的容灾问题。

要使用 Memcached 复制架构,需要重新下载支持复制功能的 Memcached 安装包

官网地址:http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz

①安装带有复制功能的 Memcached

安装与之前的 Memcached 方法相同,同样在安装完成 Libevent 之后

# 安装包
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# tar xf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# cd memcached-1.2.8-repcached-2.2.1/
[root@localhost memcached-1.2.8-repcached-2.2.1]# ./configure --prefix=/usr/local/memcached_replication --with-libevent=/usr/local/libevent --enable-replication 
[root@localhost memcached-1.2.8-repcached-2.2.1]# make && make install

make时报错:memcached.c:697:30: 错误:‘IOV_MAX’未声明(在此函数内第一次使用) if (m->msg_iovlen == IOV_MAX ||

提示需要修改memcached.c文件

/* FreeBSD 4.x doesn't have IOV_MAX exposed. */  
#ifndef IOV_MAX  
#if defined(__FreeBSD__) || defined(__APPLE__)  
# define IOV_MAX 1024  
#endif  
#endif  
改成:  
  
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */  
#ifndef IOV_MAX  
# define IOV_MAX 1024  
#endif  

②启动 Memcached 服务

支持复制功能的 Memcached 安装完成之后,需要将编译安装的 libevent-2.1.so.6.0.2 模块复制到 /usr/lib64 目录下,否则在启动带有复制功能的 Memcached 服务时可能不成功

ln -s /usr/local/libevent/lib/libevent-2.1.so.6.0.2 /usr/lib64/libevent-2.1.so.6

启动服务时,使用 -x 选项指向对端

/usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.153.133
# 另一台服务器
/usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.153.132

查看服务是否启动

[root@localhost ~]# netstat -anpt | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*         LISTEN      9502/memcached
tcp        0      0 0.0.0.0:11212           0.0.0.0:*         LISTEN      9502/memcached
tcp6       0      0 :::11211                :::*              LISTEN      9502/memcached

③ 使用 telnet 简单验证复制功能

在其中一台 Memcached 上插入一条数据,在另一台服务器中可以查看到刚刚插入的数据。反之亦然。

高性能内存对象缓存 Memcached_第9张图片

Memcached 主主复制 + Keepalived 高可用架构

①安装 keepalived

yum -y install keepalived

②配置主 keepalived

! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_mem {
    state MASTER
    interface ens34
    virtual_router_id 51
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   // 定义VIP地址
        192.168.153.200
    }
}

③配置备 keepalived

global_defs {
   router_id LVS_DEVEL_2    // 与主机区分
}

vrrp_instance VI_mem {
    state BACKUP    // 备 keepalived
    interface ens34
    virtual_router_id 51
    priority 99    // 优先级低于 MASTER
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.153.200
    }
}

④测试验证

分别启动主从 keepalived 服务

systemctl start keepalived

使用命令ip a验证主 keepalived 获取 VIP 地址

高性能内存对象缓存 Memcached_第10张图片

关闭 Memcached1 服务器的 Memcached 服务,使用命令ip a在 Memcached2 服务器上查看地址信息,验证高可用

高性能内存对象缓存 Memcached_第11张图片

Memcached 与 MySQL 数据同步

采用MySQL Memcached UDF(User Defined Functions)方法

mysql memcached UDF 其实就是通过 libmemcached 来使用 memcache 的一系列函数,通过这些函数,你能对 memcache 进行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我们通过 mysql trigger 来使用这些函数,那么就能通过 mysql 更好的、更自动的管理 memcache !

①libmemcached-0.34与memcached_functions_mysql-1.1配对进行安装

# 源码包
libmemcached-0.34.tar.gz
——————————————————————————————————————————————
[root@localhost ~]# tar xf libmemcached-0.34.tar.gz
[root@localhost ~]# cd libmemcached-0.34/
[root@localhost libmemcached-0.34]# ./configure --prefix=/usr/local/libmemcached --with-memcached
[root@localhost libmemcached-0.34]# make && make install
# 源码包
memcached_functions_mysql-1.1.tar.gz
——————————————————————————————————————————————
[root@localhost ~]# tar xf memcached_functions_mysql-1.1.tar.gz
[root@localhost ~]# cd memcached_functions_mysql-1.1/
[root@localhost memcached_functions_mysql-1.1]# ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached/
[root@localhost memcached_functions_mysql-1.1]# make && make install

②拷贝 lib 文件到 mysql 的 plugin 下面

cp /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/
cp /usr/local/lib/libmemcached_functions_mysql.* /usr/lib64/mysql/plugin/

③往 MySQL 添加 memcache UDF 函数

一共有两种方法:

1、在MySQL里执行 source install_functions.sql
source /home/username/(memcached_functions_mysql-1.1源码路径)/sql/ install_functions.sql
————————————————————————————————————————
mysql> source /root/memcached_functions_mysql-1.1/sql/install_functions.sql
2、在linux主机执行mysql 

查看函数是否添加成功:在 MySQL 中使用select * from mysql.func;查看

高性能内存对象缓存 Memcached_第12张图片

④测试 MySQL 与 memcached 能否建立连接

在建立数据库触发器之前,需要先测试 MySQL 与 memcached 能否建立连接

mysql> select memc_servers_set('192.168.153.200:11211');    // 使用 VIP 地址

mysql> select memc_server_count();

mysql> select memc_set('test','1234567');

mysql> select memc_get('test');

高性能内存对象缓存 Memcached_第13张图片

连接到 memcached 查看数据,因为有主主复制,随意连接一个

[root@localhost ~]# telnet 192.168.153.133 11211
Trying 192.168.153.133...
Connected to 192.168.153.133.
Escape character is '^]'.
get test
VALUE test 0 7
1234567
END

⑤创建数据库触发器

要先创建数据库,在数据库中创建触发器

1)新建一个数据库 test123 以及表 tab1

mysql> create database test123;
Query OK, 1 row affected (0.00 sec)

mysql> use test123;
Database changed
mysql> create table tab1(id int not null, name varchar(32) not null, primary key (id));
Query OK, 0 rows affected (0.04 sec)

2)在 test123 创建触发器

mysql> delimiter $
mysql> create trigger tab1_insert_memc     // 插入数据
    -> before insert on tab1
    -> for each row begin
    -> set @m=memc_set(NEW.id,NEW.name);
    -> end$
Query OK, 0 rows affected (0.01 sec)

mysql> create trigger tab1_update_memc     // 更新数据
    -> before update on tab1
    -> for each row begin
    -> set @m=memc_replace(OLD.id,NEW.name);
    -> end$
Query OK, 0 rows affected (0.00 sec)

mysql> create trigger tab1_delete_memc     // 删除数据
    -> before delete on tab1
    -> for each row begin
    -> set @m=memc_delete(OLD.id);
    -> end$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

3)测试触发器

连接 memcached 服务器进行数据测试

mysql> select memc_servers_set('192.168.153.200:11211');
+-------------------------------------------+
| memc_servers_set('192.168.153.200:11211') |
+-------------------------------------------+
|                                         0 |
+-------------------------------------------+
1 row in set (0.00 sec)

向 tab1 插入数据,并查看结果

mysql> insert into tab1 value('1','1111aaaaff');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into tab1 value('2','lisa');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from tab1;
+----+------------+
| id | name       |
+----+------------+
|  1 | 1111aaaaff |
|  2 | lisa       |
+----+------------+
2 rows in set (0.00 sec)

连接 Memcached 查看数据

[root@localhost ~]# telnet 192.168.153.133 11211
Trying 192.168.153.133...
Connected to 192.168.153.133.
Escape character is '^]'.
get 1
VALUE 1 0 10
1111aaaaff
END
get 2
VALUE 2 0 4
lisa
END

更新 tab1 表的数据

mysql> update tab1 set name='tom' where id=1;
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
|  2 | lisa |
+----+------+
2 rows in set (0.00 sec)

连接 Memcached 查看数据

get 1
VALUE 1 0 3
tom
END
get 2
VALUE 2 0 4
lisa
END

删除 tab1 表中的数据

mysql> delete from tab1 where id = 1;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
|  2 | lisa |
+----+------+
1 row in set (0.00 sec)

连接 Memcached 查看数据

get 1
END
get 2
VALUE 2 0 4
lisa
END

in set (0.00 sec)


连接 Memcached 查看数据

```bash
[root@localhost ~]# telnet 192.168.153.133 11211
Trying 192.168.153.133...
Connected to 192.168.153.133.
Escape character is '^]'.
get 1
VALUE 1 0 10
1111aaaaff
END
get 2
VALUE 2 0 4
lisa
END

更新 tab1 表的数据

mysql> update tab1 set name='tom' where id=1;
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
|  2 | lisa |
+----+------+
2 rows in set (0.00 sec)

连接 Memcached 查看数据

get 1
VALUE 1 0 3
tom
END
get 2
VALUE 2 0 4
lisa
END

删除 tab1 表中的数据

mysql> delete from tab1 where id = 1;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
|  2 | lisa |
+----+------+
1 row in set (0.00 sec)

连接 Memcached 查看数据

get 1
END
get 2
VALUE 2 0 4
lisa
END

你可能感兴趣的:(云计算技术架构,缓存,memcached,数据库)