2020-09-06

Memcache
Memcached是一款开源/ 高性能/分布式内存对象缓存系统,可应用各种需要的缓存场景,其主要目的是通过降低对Database的访问来加速Web应用程序,他是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面的引用结果的直接数据、如字符串、对象等。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件,现在已经成为Mixi、Hatena、Facabook、Vox、Live Journal等众多服务中提高Web应用扩展性的重要因素。
Mencached是一款开发工具,它既不是一个代码加速,也不是数据库中间件,其设计哲学思想主要反映如下方面:

1、简单Key/values存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可,存储项由“键、过期时间、可选的标志及数据”四个部分组成。

2、功能的实现一半依赖于客户端,一半基于服务端,客户端负责发送此存储项至服务器端、从服务端获取数据及无法连接至服务器时采用相应的动作:服务端负责接收、存储数据,并负责数据项的超时过期。

3、各服务器彼此无视:不在服务期间进行数据同步。

4、O/I的执行效率

5、清理超期数据:默认情况下,Memcached是一个LRU(页面置换缓存)缓存,同时,它按照事先预定的时长清理超期数据;但事实上,Memcached不会删除任何已缓存的数据,只是在其过期之后不再为客户所见,而且,Memcached也不会真正的按期限清理缓存,而仅是当Get命令到达时检查其时长。

Memcache提供了数不多的几个命令来完成服务器的交互,这些命令基于Memcached的协议实现。

Mencached功能实现一般依赖于客户端,一般基于服务器

(1)功能实现一般依赖于客户端,一般基于服务器端
客户负责发送存储项至服务器端,从服务器端获取数据及已经连接值指服务器时采用相应的动作:服务端负责接收、存储数据,并且负责数据项的超时过期

(2)内置内存储蓄方式:
为了提高性能,memcached中保存的数据都存在memcached内置内存存储空间中,由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失,另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不适用的缓存,memcached本身就是为缓存而设计的服务器,因此没有过多的考虑数据的永久性问题。

(3)互补通信的分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能,各个memcached不会互相通信以共享信息,那么,怎样进行分布式呢?这完全取决于客户端的实现。

(4)基于libevent库的事件处理
Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述子pipe,传递给worker线程,进行读写IO,网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherecy和锁的问题,比如Memcached最常用的stats命令,实际Memcached所有的操作都要对这个全局变量加锁,进行计数等工作,带来了性能的损耗。

存储类命令:set、add、replace、append、prepend
获取数据类命令:get、delete、incr/decr
统计类命令:stats、statsintems,stats slabs,stats sizes
清理命令:flush_all

安装配置Memcache:
(1)安装并且配置memcached的依赖包
[root@localhost wyy]# tar zxf libevent-2.0.22-stable.tar.gz -C /usr/src/ 解压libevent包
[root@localhost wyy]# cd /usr/src/libevent-2.0.22-stable/ 进入指定解压包目录下
[root@localhost libevent-2.0.22-stable]# ./configure --prefix=/usr/local/libevent 配置模块
[root@localhost libevent-2.0.22-stable]# make && make install 编译安装

(2)安装memcached并且开启
[root@localhost wyy]# tar zxf memcached-1.4.36.tar(1).gz -C /usr/src/ 解压memcached包
[root@localhost wyy]# cd /usr/src/memcached-1.4.36/ 进入指定解压包目录下
[root@localhost memcached-1.4.36]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent --enable-64bit 配置模块
[root@localhost memcached-1.4.36]# make && make install 编译安装
[root@localhost memcached-1.4.36]# ln -s /usr/local/memcached/bin/memcached /usr/bin/ 将启动项链接到启动目录中
[root@localhost memcached-1.4.36]# systemctl stop firewalld 关闭防火墙
[root@localhost memcached-1.4.36]# iptables -F 清空防火墙规则
[root@localhost memcached-1.4.36]# memcached -d -m 1024 -u root -l 192.168.0.10 -p 11211
[root@localhost memcached-1.4.36]# memcached -m 32m -p 11211 -d -u root -P /var/run/mecached.pid -c 256
d:守护进程后台运行
m:最大内存,默认是64M
u:运行memcache的用户,默认是root不能运行memcached启动
L:监听的服务器的IP地址,可以有多个IP地址
p:使用Tcp端口11211
-P:设置pid文件
-w:显示调用信息
-c:运行最大的并发连接数,默认是1024,按照服务器的负载设定

[root@localhost wyy]# yum -y install telnet 使用YUM工具安装telnet

测试连接:
[root@localhost wyy]# telnet 192.168.0.10 11211 连接本地memcache服务器
Trying 192.168.0.10…
Connected to 192.168.0.10.
Escape character is ‘^]’.
set test 0 0 10 //向5test中存入数据,“键” “键值对的整形参数”
Stored //返回set结果
Get test //获取数据
test_values //取得key为test中数据

[root@localhost wyy]# telnet 192.168.0.10 11211 连接本地memcache服务器
Trying 192.168.0.10…
Connected to 192.168.0.10.
Escape character is ‘^]’.
Stats //统计memcache的各种信息
Stats reset //重新统计数据
Stats slabs //显示slabs信息。通告这个命令能获得每个slabs的chunksize长度,从确定数据到保存那个
Slab
Stats items //刷新slab中item数目
set | get,gets //保存或获取数据

STAT pid 61866 //⽬前为⽌启动多少秒
STAT uptime 1128
STAT time 1581300807
STAT version 1.4.36
STAT libevent 2.0.22-stable
STAT pointer_size 64
STAT rusage_user 0.289975
STAT rusage_system 0.522991
STAT curr_connections 5 //当前并发连接数
STAT total_connections 7 //总连接数
STAT connection_structures 6
STAT reserved_fds 20 //get次数
STAT cmd_get 2 //get次数
STAT cmd_set 2 //set次数
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0 //get命中
STAT get_misses 2 //get⾮命中
STAT get_expired 0
STAT get_flushed 0
STAT delete_misses 0

STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 137
STAT bytes_written 124
STAT limit_maxbytes 1073741824 //可以使用的最大内存容量
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0

利⽤memcached-tool管理memcache :
[root@localhost wyy]# cd /usr/src/memcached-1.4.36/scripts/
[root@localhost scripts]# perl memcached-tool
Usage: memcached-tool <host[:port] | /path/to/socket> [mode]

   memcached-tool 10.0.0.5:11211 display    # shows slabs
   memcached-tool 10.0.0.5:11211            # same.  (default is display)
   memcached-tool 10.0.0.5:11211 stats      # shows general stats
   memcached-tool 10.0.0.5:11211 settings   # shows settings stats
   memcached-tool 10.0.0.5:11211 sizes      # shows sizes stats
   memcached-tool 10.0.0.5:11211 dump       # dumps keys and values

WARNING! sizes is a development command.
As of 1.4 it is still the only command which will lock your memcached instance for some time.
If you have many millions of stored items, it can become unresponsive for several minutes.
Run this at your own risk. It is roadmapped to either make this feature optional
or at least speed it up.

[root@localhost scripts]# vim memcache 编写Memcache脚本
#!/usr/bin/perl
use Cache::Memcached
my $key = “test”;
my $value = “HellWorld”;
my $expores = 120;
my $memcached =Cache:Memcached->new({server => [“192.168.0.10:11211”],
compress_threshold => 100}];
m e m c a c h e d − > a d d ( memcached->add( memcached>add(key, v a l u e , value, value,expires);
my $memcached =Cache:Memcached->new({server => [“92.168.0.10:11211”],
compress_threshold => 100}];
m e m c a c h e d − > a d d ( memcached->add( memcached>add(key, v a l u e , value, value,expires);
my $return = m e m c a c h e d − > g e t ( memcached->get ( memcached>get(key);
print “$return\n”;

my $add = $memcached->add(‘han’,‘han’,‘1000’); //仅当存储空间不存在key相同的数据才保存,replace仅当存储空间存在相同数据才保存数据,set不论什么情况偶读写入保存
my $return2 = $memcached->get(‘han’); //获取数据
my $return2 = $memcached->get_multi(‘v1’,‘v2’); //获取多条数据
print “return2\n”
my $return3 = m e m c a c h e d − > i n c r ( memcached->incr( memcached>incr(key);
m e m c a c h e d − > a d d ( ′ memcached->add(' memcached>add(key’,0) unless defined $return; //把某个键值作为计数器
[root@localhost scripts]# chmod +x memcache 给我们的脚本添加权限

[root@localhost wyy]# netstat -anpt | grep 11211 查看Memcached进程
tcp 0 0 192.168.0.10:11211 0.0.0.0:* LISTEN 61866/memcached
tcp6 0 0 :::11211 ::😗 LISTEN 61901/memcached
[root@localhost wyy]# perl memcached-tool 192.168.0.10:11211

Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

1 96B 0s 1 0 yes 0 0 0

利用memcache-tool管理memcache:
[root@localhost scripts]# perl memcached-tool 192.168.0.10:11211

Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

1 96B 0s 1 0 yes 0 0 0
[root@localhost scripts]# perl memcached-tool 192.168.0.10:11211 display

Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

1 96B 0s 1 0 yes 0 0 0
[root@localhost scripts]#

通过UNFs实现Memcache与mysql自动更新
[root@localhost wyy]# tar zxf libevent-2.0.22-stable.tar.gz
[root@localhost wyy]# cd libevent-2.0.22-stable/
[root@localhost libevent-2.0.22-stable]# ./configure
[root@localhost libevent-2.0.22-stable]# make && make install
[root@localhost wyy]# tar zxf libmemcached-0.34.tar.gz
[root@localhost wyy]# cd libmemcached-0.34/
[root@localhost libmemcached-0.34]# ./configure --prefix=/usr/local/libmemcache34
[root@localhost libmemcached-0.34]# make && make install
[root@localhost libmemcached-0.34]# echo “/usr/local/lib” >> /etc/ld.so.conf
[root@localhost libmemcached-0.34]# ldconfig
[root@localhost libmemcached-0.34]# cd /home/wyy/
[root@localhost wyy]# tar zxf memcached_functions_mysql-1.1.tar.gz
[root@localhost wyy]# 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/libmemcache34 && make && make install
[root@localhost memcached_functions_mysql-1.1]# cp /usr/local/lib/libmemcached_function* /usr/local/mysql/lib/plugin/
初始化所有msyql提供的用户自定义函数:
[root@localhost memcached_functions_mysql-1.1]# . /etc/profile
[root@localhost memcached_functions_mysql-1.1]# service mysqld start
Starting MySQL SUCCESS!
[root@localhost memcached_functions_mysql-1.1]# mysql -u root -p < sql/install_functions.sql
Enter password:
[root@localhost memcached_functions_mysql-1.1]# mysql -u root
[root@localhost memcached_functions_mysql-1.1]# telnet 192.168.0.10 11900
[root@localhost memcached_functions_mysql-1.1]# memcached -d -m 1024 -u root 192.168.0.10 -p 11900
[root@localhost memcached_functions_mysql-1.1]# netstat -anpt | grep 11900
tcp 0 0 0.0.0.0:11900 0.0.0.0:* LISTEN 116591/memcached
tcp6 0 0 :::11900 ::😗 LISTEN 116591/memcached
[root@localhost memcached_functions_mysql-1.1]# mysql -u root
检查安装是否成功

mysql> select name,dl from mysql.func; 查看导⼊结果:

二. 测试用例设计情况:
(1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。
sql语句如下:
创建一个库:
mysql> create database tests;
Query OK, 1 row affected (0.01 sec)
mysql> use tests;
Database changed
mysql> drop table if exists urls;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE urls (
-> id int(10) NOT NULL,
-> url varchar(255) NOT NULL DEFAULT ‘’,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.07 sec)
mysql> drop table if exists results;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE results (
-> id int(10) NOT NULL,
-> result varchar(255) NOT NULL DEFAULT ‘error’,
-> time timestamp NULL DEFAULT CURRENT_TIMESTAMP,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.01 sec)

创建三个触发器:
当向urls表中插入数据时,对memcache执行set操作,trigger如下:
mysql> DROP TRIGGER IF EXISTS url_mem_insert;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> DELIMITER //
mysql> CREATE TRIGGER url_mem_insert
-> BEFORE INSERT ON urls
-> FOR EACH ROW BEGIN
-> set @num = memc_set(NEW.id, NEW.url);
-> if @num <> 0 then
-> insert into results(id) values(NEW.id);
-> end if;
-> END //
mysql> DELIMITER ;

当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下:
mysql> DELIMITER //
mysql> DROP TRIGGER IF EXISTS url_mem_update;
-> CREATE TRIGGER url_mem_update
-> BEFORE UPDATE ON urls
-> FOR EACH ROW BEGIN
-> set @num = memc_replace(OLD.id,NEW.url);
-> if @num <> 0 then
-> insert into results(id) values(OLD.id);
-> end if;
-> END //
Query OK, 0 rows affected, 1 warning (0.00 sec)

当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
mysql> DROP TRIGGER IF EXISTS url_mem_delete//
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TRIGGER url_mem_delete
-> BEFORE DELETE ON urls
-> FOR EACH ROW BEGIN
-> set @num = memc_delete(OLD.ID);
-> if @num <> 0 then
-> insert into results(id) values(OLD.id);
-> end if;
-> END //
mysql> DELIMITER ;

设置memcache相关的参数:
设置同时UDF操作的memcaced的机器IP和端口:
mysql> SELECT memc_servers_set(‘192.168.0.10:11900’);
±--------------------------------------+
| memc_servers_set(‘192.168.0.10:11900’) |
±--------------------------------------+
| 0 |
±--------------------------------------+

mysql> select memc_server_count();
±--------------------+
| memc_server_count() |
±--------------------+
| 1 |
±--------------------+
1 row in set (0.00 sec)

在mysql命令行列出可以修改memcached参数的行为:
*************************** 1. row ***************************
memc_list_behaviors():
MEMCACHED SERVER BEHAVIORS
MEMCACHED_BEHAVIOR_SUPPORT_CAS
MEMCACHED_BEHAVIOR_NO_BLOCK
MEMCACHED_BEHAVIOR_TCP_NODELAY
MEMCACHED_BEHAVIOR_HASH
MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
MEMCACHED_BEHAVIOR_KETAMA
MEMCACHED_BEHAVIOR_POLL_TIMEOUT
MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
MEMCACHED_BEHAVIOR_DISTRIBUTION
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
MEMCACHED_BEHAVIOR_USER_DATA
MEMCACHED_BEHAVIOR_SORT_HOSTS
MEMCACHED_BEHAVIOR_VERIFY_KEY
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
MEMCACHED_BEHAVIOR_KETAMA_HASH
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
MEMCACHED_BEHAVIOR_SND_TIMEOUT
MEMCACHED_BEHAVIOR_RCV_TIMEOUT
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
1 row in set (0.00 sec)

设置MEMCACHE_BEHAVIOR_NO_BLOCK为打开状态,这样memcahce出现问题(不能连接时),
数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout
才可以插入到表中。
mysql> select memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_NO_BLOCK’,‘1’);
±-------------------------------------------------------------+
| memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_NO_BLOCK’,‘1’) |
±-------------------------------------------------------------+
| 0 |
±-------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_TCP_NODELAY’,‘1’);
±----------------------------------------------------------------+
| memc_servers_behavior_set(‘MEMCACHED_BEHAVIOR_TCP_NODELAY’,‘1’) |
±----------------------------------------------------------------+
| 0 |
±----------------------------------------------------------------+
1 row in set (0.00 sec)

三、对memcache_functions_mysql的简单功能进行测试
1、向表urls更新入数据,然后检查看memcache是否对数据执行set进数据;
mysql> insert into urls (id,url) values (1, ‘http://www.test.com’);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select memc_get(‘1’);
±-----------------------+
| memc_get(‘1’) |
±-----------------------+
| http://www.test.com |
±-----------------------+
1 row in set (0.00 sec)

[root@localhost memcached_functions_mysql-1.1]# telnet 192.168.0.10 11900
Trying 192.168.0.10…
Connected to 192.168.0.10 (192.168.0.10).
Escape character is ‘^]’.
get 1
VALUE 1 0 22
http://www.test.com
END

2.更新表urls里面的数据,然后查询memcached里面是否也更新:
mysql> update test.urls set url=‘http://blog.sina.com.cn’ where id=1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select memc_replace(‘1’,‘http://blog.sina.com.cn’);
±--------------------------------------------+
| memc_replace(‘1’,‘http://blog.sina.com.cn’) |
±--------------------------------------------+
| 0 |
±--------------------------------------------+
1 row in set (0.00 sec)
mysql> select memc_get(‘1’);
±------------------------+
| memc_get(‘1’) |
±------------------------+
| http://blog.sina.com.cn |
±------------------------+
1 row in set (0.00 sec)

mysql> telnet 192.168.0.10 11900
Trying 192.168.0.10…
Connected to 192.168.0.10 (192.168.0.10).
Escape character is ‘^]’.
get 1
VALUE 1 0 23
http://blog.sina.com.cn
END

3.删除表urls里面的数据,然后查memcached是否也删除:
mysql> delete from test.urls where id=1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select memc_get(‘1’);
±--------------+
| memc_get(‘1’) |
±--------------+
| NULL |
±--------------+
1 row in set (0.00 sec)
什么都查不到
成功了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值