高性能内存对象缓存 Memcached

这篇具有很好参考价值的文章主要介绍了高性能内存对象缓存 Memcached。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高性能内存对象缓存 Memcached

Memcached 概述

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

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

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

  • 提高网站的访问速度

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

缓存memcache,云计算技术架构,缓存,memcached,数据库

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

①数据存储方式: Slab Allocation

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

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

缓存memcache,云计算技术架构,缓存,memcached,数据库

②数据过期方式

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

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

Memcached缓存机制

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

缓存memcache,云计算技术架构,缓存,memcached,数据库

Memcached分布式

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

多个 Memcached 服务器是独立的

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

缓存memcache,云计算技术架构,缓存,memcached,数据库

当数据到达客户端程序库时,客户端的算法就依据路由算法来决定保存的 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配置

缓存memcache,云计算技术架构,缓存,memcached,数据库

我这里的搭建是基于已经源码安装完成 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 文件即可

缓存memcache,云计算技术架构,缓存,memcached,数据库

⑦ 测试 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;     #回显
?> 

缓存memcache,云计算技术架构,缓存,memcached,数据库

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

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

案例环境

缓存memcache,云计算技术架构,缓存,memcached,数据库

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 上插入一条数据,在另一台服务器中可以查看到刚刚插入的数据。反之亦然。

缓存memcache,云计算技术架构,缓存,memcached,数据库

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 地址

缓存memcache,云计算技术架构,缓存,memcached,数据库

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

缓存memcache,云计算技术架构,缓存,memcached,数据库

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 <sql/install_functions.sql
# /usr/local/mysql/bin/mysql < /home/username/(memcached_functions_mysql-1.1源码路径)/sql/ install_functions.sql
————————————————————————————————————————
[root@localhost ~]# mysql -u root -p123456 < /root/memcached_functions_mysql-1.1/sql/install_functions.sql 

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

缓存memcache,云计算技术架构,缓存,memcached,数据库

④测试 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');

缓存memcache,云计算技术架构,缓存,memcached,数据库

连接到 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 查看数据文章来源地址https://www.toymoban.com/news/detail-555679.html

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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 六、企业级架构缓存篇之memcached

    LNMP架构中网站应用访问流程: 浏览器 (app) → web 服务器 → 后端服务 (php) → 数据库 (mysql) 访问流程越多,访问速度越慢,出现问题的几率也越大。 网站访问流程优化思路: ① 采用高性能的负载均衡设备; ② 页面静态化; ③ 引入缓存层,如使用Redis或Memcached,来缓存频繁

    2024年04月10日
    浏览(51)
  • 高性能分布式缓存Redis(三) 扩展应用

    在并发编程中,通过锁,来避免由于竞争而造成的数据不一致问题 问题分析 现象:本地锁在多节点下失效(集群/分布式) 原因:本地锁它只能锁住本地JVM进程中的多个线程,对于多个JVM进程的不同线程间是锁不住的 解决:分布式锁(在分布式环境下提供锁服务,并且达到本地

    2024年02月12日
    浏览(72)
  • 解析内存中的高性能图结构

    在进行各种图处理、图计算、图查询的时候,内存或是硬盘中如何存储图结构是一个影响性能的关键因素。本文主要分析了几种常见的内存图结构,及其时间、空间复杂度,希望对你有所启发。 通常来说,对于图结构的几种常见的基础操作: 插入一个点 插入一个边 删除一个

    2024年02月03日
    浏览(54)
  • “深入理解Redis:高性能缓存和数据存储技术解析“

    标题:深入理解Redis:高性能缓存和数据存储技术解析 摘要:本文将深入探讨Redis作为一种高性能缓存和数据存储技术的原理和用法。我们将从Redis的基本特性入手,介绍其在缓存和数据存储方面的优势,并通过实际示例代码展示如何使用Redis提升应用程序的性能和可靠性。

    2024年02月16日
    浏览(53)
  • “深入理解Redis:高性能缓存与数据存储的秘密“

    标题:深入理解Redis:高性能缓存与数据存储的秘密 在现代应用程序的开发中,缓存和数据存储是非常重要的组成部分。它们不仅可以提高应用程序的性能,还可以减轻数据库和网络的负载。其中,Redis作为一种高性能的内存数据存储系统,因其出色的性能和灵活的特性而备

    2024年02月16日
    浏览(46)
  • “深入解析Redis:高性能缓存与分布式数据存储“

    标题:深入解析Redis:高性能缓存与分布式数据存储 摘要:本文将深入解析Redis,介绍其作为高性能缓存和分布式数据存储的特点和功能,并提供示例代码展示其使用方法。 正文: 一、引言 Redis是一个开源的内存数据结构存储系统,它以其高性能、灵活的数据结构以及丰富的

    2024年02月17日
    浏览(59)
  • 探索Garnet:微软开源的高性能分布式缓存存储系统

    微软研究院近期宣布推出一款名为Garnet的创新开源分布式缓存存储系统,致力于解决现代应用程序在处理大规模数据时对于高吞吐量、低延迟及卓越可扩展性的严苛要求。这款基于C# .NET 8.0构建的新型系统,充分利用了现代硬件能力,为应用程序开发人员提供了加速数据访问

    2024年04月26日
    浏览(55)
  • 《SpringBoot篇》18.SpringBoot整合Memcached缓存超详细教程

    陈老老老板 说明:工作了,学习一些新的技术栈和工作中遇到的问题,边学习边总结,各位一起加油。需要注意的地方都标红了,还有资源的分享. 一起加油。 本文是介绍Memcached与SpringBoot整合 整合之前先大致了解一下Memcached,是一个​ 免费开源的、高性能的、具有分布式内

    2024年02月03日
    浏览(49)
  • 【高性能计算】opencl语法及相关概念(三)事件,内存

    当谈到OpenCL中的事件时,它们代表了执行的各个阶段或操作的状态信息。通过使用事件,您可以跟踪和管理内核执行以及内存操作的进度和顺序。以下是与OpenCL事件相关的关键概念: 创建事件:您可以使用 clCreateUserEvent 或 clCreateUserEventWithProperties 函数手动创建事件,或者使

    2024年02月10日
    浏览(48)
  • c++代码实现一个高性能内存池(超详细版本)

    写在前面 本文的内存池代码是改编自Nginx的内存池源码,思路几乎一样。由于Nginx源码的变量命名我不喜欢,又没有注释,看得我很难受。想自己写一版容易理解的代码。这应该是全网独一份的超详细版本了(笑~). 应用场景 写内存池的原理之前,按照惯例先说内存池的应用

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包