高性能内存对象缓存 Memcached

news2024/11/14 15:00:19

高性能内存对象缓存 Memcached

Memcached 概述

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

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

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

  • 提高网站的访问速度

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

在这里插入图片描述

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

①数据存储方式: Slab Allocation

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

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

在这里插入图片描述

②数据过期方式

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

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

Memcached缓存机制

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

在这里插入图片描述

Memcached分布式

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

多个 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配置

在这里插入图片描述

我这里的搭建是基于已经源码安装完成 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 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;     #回显
?> 

在这里插入图片描述

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

Memcached 主主复制是指在任意一台 Memcached 服务器修改数据都会被同步到另外一台,但是 Memcached API客户端是无法判断连接到哪一台 Memcached 服务器的,所以需要设置 VIP 地址,提供给 Memcached API客户端进行连接。可以使用keepalived 产生的 VIP 地址连接主 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 上插入一条数据,在另一台服务器中可以查看到刚刚插入的数据。反之亦然。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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;查看

在这里插入图片描述

④测试 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 查看数据,因为有主主复制,随意连接一个

[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验三(OSPF)7 8

解题思路&#xff1a; 先配置好路由的环回及规划好IP地址&#xff0c;确保正确&#xff1b; &#xff08;由于r8模拟为运营商&#xff0c;因此r1,r2,r3各写一条缺省指向r8 并测试&#xff09; hub-spoke网络结构&#xff0c;需要在r1-r2-r3建立隧道0配置MGRE-多点通用路由协…

FreeRTOS ~(七)互斥量 ~ (3/3)互斥量的缺陷和递归锁

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;2/3&#xff09;互斥的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;2/5&#xff09;队列解决互斥缺陷 FreeRTOS ~&#xff08;六&#xff09;信号量 ~ &#xff08;2/…

超详细 | 遗传-粒子群自适应优化算法及其实现(Matlab)

作者在前面的文章中介绍了两种经典的优化算法——遗传算法(GA)和粒子群算法(PSO)&#xff0c;这些智能优化算法解决问题的方式和角度各不相同&#xff0c;都有各自的适用域和局限性&#xff0c;对智能优化算法自身做的改进在算法性能方面得到了一定程度的提升&#xff0c;但算法…

前端如何实现面向对象

交流所记&#xff1a; 面向对象的三要素&#xff1a; 封装&#xff1a;把客观事物封装成抽象的类&#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象操作&#xff0c;对不可信的类或者对象隐藏信息继承&#xff1a;它可以使用现有类的所有功能&#xff0c;并在无…

链上衍生品协议 ProsperEx:探索 RWA 叙事,打造 DeFi 变异黑马

“ProsperEx 本身背靠着具备潜力的链上衍生品赛道&#xff0c;同时也是 RWA 领域早期的布局者之一&#xff0c;其有望成为 Web2 世界与 Web3 世界的早期连接点&#xff0c;并具备广泛且规模性捕获用户的能力。” 从2020年DeFi之夏链上世界迎来了爆发后&#xff0c;链上衍生品赛…

SQL21 浙江大学用户题目回答情况

解法一:left JOIN select t1.device_id,question_id,result from question_practice_detail t1 left JOIN user_profile t2 on t1.device_id t2.device_id where university 浙江大学解法二:子查询 select device_id, question_id, result from question_practice_detail …

Android 性能优化系列:启动优化进阶

文章目录 启动速度优化的本质因素CPU 层面进行速度优化减少程序的指令数降低时钟周期时间降低每条指令的平均时间周期 缓存层面进行速度优化缓存的读写速度缓存的命中率 任务调度层面进行速度优化通过实时进程和普通进程了解任务调度机制原理进程生命周期 CPU 优化合理使用线程…

day67_mybatisplus

今日内容 零、 复习昨日 零、 复习昨日 一、MybatisPlus快速入门 [MyBatis-Plus](简介 | MyBatis-Plus (baomidou.com))&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官方…

InnoDB: Waiting for page_cleaner to finish flushing of buffer pool 解决方案

这个是因为linux系统时间&#xff0c;Mysql数据库时间&#xff0c;Mysql日志时间出现不一致导致的。 1、date -R 查询linux系统时间 中国标准时区东八区时区 2、mysql数据库的时间 3、在mysql的配置文件里面&#xff0c;定义好时间&#xff0c;时区一致。 问题解决。

前端Vue自定义商品评价页面单选多选标签tags组件单选多选按钮选择器picker组件

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

群晖折腾记5—docker安装emby开启核显

硬解的前提条件 Emby为正版 带核显的白裙或者已经被正确驱动的黑裙 开心版本不在讨论范围之内 需要的目录有/config /mnt/share1 /mnt/share2&#xff0c;自己创建对应的目录即可 打开ssh sudo -i输入下面命令首先判断群晖是否有核显驱动&#xff0c;白裙使用有带核显cpu的可…

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题

由于一段时间没有使用Selenium&#xff0c;当再次使用时发现之前写的Selenium元素定位的代码运行之后会报错&#xff0c;发现是Selenium更新到新版本&#xff08;4.x版本&#xff09;后&#xff0c;以前的一些常用的代码的语法发生了改变&#xff0c;当然如果没有更新过或是下载…

VS2022 Fortran调用lapack 64位库

首先&#xff0c;可以在官网下载以下lib 下载64位的&#xff0c;然后就是添加文件所在的文件夹&#xff0c;以及添加lib&#xff0c;就可以直接使用lapack中的函数&#xff0c;但是现在Oneapi中集成了lapack库&#xff0c;所以可以直接调用&#xff0c;如下所示。 1. 首先&…

MongoDB 事务与数据落盘

文章目录 概要一、持久性1.1、journal log刷盘机制1.2、数据刷盘机制1.3、复制集下的写安全机制 二、隔离性总结 概要 MongoDB并不像MySQL一样天然支持多文档事务&#xff0c;其演变过程如下&#xff1a; MongoDB4.0之前只支持单文档事务&#xff0c;在单个文档上支持ACID原子…

S32K14x FlexCAN入门

每个系列S32K14x支持的邮箱个数。 基本每个系列的FlexCAN0可以支持32个报文缓存和支持CANFD。 中断源 mail 最多有32个mail • 灵活的消息缓冲区 (MB)&#xff0c;总共 32 个消息缓冲区&#xff0c;数据长度为 8 字节 每个&#xff0c;可配置为 Rx 或 Tx 过滤掩码功能 强…

MyBatis中的缓存介绍与示例

目录 什么是缓存&#xff1f; 一级缓存 实例效果 二次缓存 示例效果 什么是缓存&#xff1f; 在用户访问相同数据时&#xff0c;需要对数据库多次访问&#xff0c;导致产生大量IO、读写硬盘的操作&#xff0c;效率低下&#xff0c;有了缓存首次访问时&#xff0c;查询到数…

【AI 绘图】Stable Diffusion WebUI 本地安装教程(Windows,兼容 NVIDIA、AMD 显卡)

文章目录 硬性要求Stable Diffusion 简介Stable Diffusion WebUI 简介1. 安装 Python 3.10.6&#xff08;较新版本的 Python 不支持 torch&#xff09;2. 安装 Git3. 下载 stable-diffusion-webui 存储库&#xff08;此步二选一&#xff09;3.1 NVIDIA GPU3.2 AMD GPU 4. webui…

Unity 3D 刚体初步

Unity 3D 中的 Rigidbody &#xff0c;刚体&#xff0c;是用来模拟物理特性&#xff0c;模拟推力与扭力&#xff0c;实现现实世界中的物理学现象。 把在外力作用下&#xff0c;物体的形状和大小保持不变&#xff0c;而且内部各部分相对位置保持恒定&#xff08;没有形变&#…

2.zabbxi操作和设置

文章目录 zabbxi操作和设置添加zabbix-agent客户端web端添加客户端 自定义监控模板&#xff08;面试&#xff09;监控模板下载地址案例1案例2 设置邮件报警自动注册和自动发现自动发现&#xff08;对于agent是被动模式&#xff09;自动注册&#xff08;对于agent是主动模式&…