本节内容主要关于mencache的工作原理,memcache的应用场景及其应用实例配置,memcache安装部署。
分布式: 实例和缓存在逻辑上是分离的
普通缓存 | Memcached缓存 | |
特 性 |
缓存与特定的应用实例绑定,每个应用实例只能访问特定的缓存 | 实例独立于各个应用服务器实例运行,每应用实例可以访问任意缓存 |
特 点 |
整个应用所能访问的缓存容量变小;缓存中存在数据冗余;缓存系统整体效率降低。 | 整个应用所能访问的缓存容量变大;缓存中无数据冗余;缓存系统整体效率较高。 |
数据的存储与获取: 键值的哈希运算获得一个哈希值,通过配置文件的设置将键值对应的数据保存到相应服务器上;
通过键值的哈希运算值去找相应服务器获取数据。
在Memcached中,每条记录都由四部分组成:记录的键,有效期,一系列可选的标记以及表示记录内容的数据。由于记录内容的数据中并不包含任何数据结构,因此我们在Memcached中所记录的数据需要是经过序列化之后的表示。
(1) 为了解决数据频繁读写而导致的内存碎片化问题,引入了slab的概念。
(2) 存储过程,通过数据的大小来找slab,对应的slab类型中有空闲块则存储,没有创建一个新的slab。
(3) 这样的存储方式弊端是浪费资源,因此需要根据实际业务优化,设定初始数据的块大小和递增倍数。
(4) 内存的清理机制,"延迟过期",在没有内存空间的情况下存储数据,
检查有没有过期数据,有覆盖过期数据,没有启动LRU算法,清理最近一次调运时间最长的数据。
(5) 高可用的实现----》一致性hash
1.安装libevent(依赖)
wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gz
tar zxvf libevent-1.4.14b-stable.tar.gz
yum install make gcc gcc-c++
cd libevent-1.4.14b-stable
./configure --prefix=/usr/local/libevent/
make
make install
2.安装memcache
wget https://memcached.org/files/memcached-1.5.16.tar.gz
tar -zxvf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
make
make install
启动:
[root@localhost init.d]# /usr/local/memcached/bin/memcached -d -l 127.0.0.1 -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached.pid
[root@localhost init.d]# ps -ef |grep memcached
root 16227 1 0 00:56 ? 00:00:00
/usr/local/memcached/bin/memcached -d -l 127.0.0.1 -p 11211 -u root -m 64 -c
1024 -P /var/run/memcached.pid
root 16238 1201 0 00:57 pts/0 00:00:00 grep --color=auto memcached
链接测试:
[root@localhost init.d]# telnet 127.0.0.1 11211
查看当前memcache的状态:stats
退出:quit
安装MySQL:https://blog.csdn.net/xiangmomo1/article/details/107307192
在使用 memcached做法:
(当MySQL数据变化后,memcache缓存机制也会出发,在缓存一份新的数据;第一次访问,访问数据库,访问数据库时缓存机制会缓存一份数据,下次直接缓存memcache,当memcache的数据过期后,继续缓存MySQL。)
192.168.253.150 : memcache
192.168.253.149: web
192.168.253.135 : mysql
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org
hwclock --systohc
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
rpm -e mariadb-libs postfix #卸载自带的数据库mariadb
wget https://downloads.mysql.com/archives/get/file/mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm #下载MySQLyum localinstall mysql-community-client-8.0.16-2.el7.x86_64.rpm mysql-community-server-8.0.16-2.el7.x86_64.rpm mysql-community-libs-8.0.16-2.el7.x86_64.rpm mysql-community-common-8.0.16-2.el7.x86_64.rpm mysql-community-libs-compat-8.0.16-2.el7.x86_64.rpm #注意这是一条命令
yum install httpd php php-gd php-mysql php-memcache
systemctl restart httpd
systemctl enable httpd
mysql> create user 'memcache'@'%' identified by 'Axiang@123';
mysql> alter user 'memcache'@'%' IDENTIFIED WITH mysql_native_password BY
'Axiang@123';
mysql> flush privileges;
1.测试http功能:
[root@localhost ~]# vim /var/www/html/index.html
[root@localhost ~]# cat /var/www/html/index.html
this is a test form 149..
2.测试PHP链接功能
vim /var/www/html/index.php
cat /var/www/html/index.php
phpinfo();
?>
3.测试mysql(web机器上)
vim /var/www/html/mysql.php
$link=mysql_connect('192.168.253.135','superadmin','Axiang@123');
if($link) echo "
1.测试web和memcache的连通性:
未改连通性之前:在web服务器上 telnet 192.168.253.150:11211 连接不上
修改客户端监听所有地址(在memcache执行下面这一条命令) ——》在web服务器上就可以连接上
[root@localhost ~]# /usr/local/memcached/bin/memcached -d -l 0.0.0.0 -p 11211 -u
root -m 64 -c 1024 -P /var/run/memcached.pid
在web服务器上测试
代码测试
vim /var/www/html/mencaceh.php
$memcache = new Memcache;
$memcache->connect('192.168.253.150', 11211) or die ("Could not connect");
$version = $memcache->getVersion();echo "Server's version: ".$version."
";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at
the server");
echo "Store data in the cache (data will expire in 10 seconds)
";
$get_result = $memcache->get('key');
echo "Data from the cache:
";
var_dump($get_result);
?>
配置session(web服务器)
vim /etc/php.ini
session.save_handler = memcache
session.save_path = "tcp://192.168.42.145:11211?
persistent=1&weight=1&timeout=1&retry_interval=15"
测试memcache的可用性(web服务器)
vim /var/www/htmlmemcached1.php
session_start();
if (!isset($_SESSION['session_time']))
{
$_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."
";
echo "now_time:".time()."
";
echo "session_id:".session_id()."
";
?>
在数据库节点上创建测试数据库
create database testab1;
use testab1;
create table test1(id int not null auto_increment,name varchar(20) default
null,primary key(id)) engine=innodb auto_increment=1 default charset=utf8;
insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');
select * from test1;
mysql> grant select on testab1.* to memcache@'%';
Query OK, 0 rows affected (0.00 sec)
测试memcache是否缓存数据库成功
vim /var/www/html/memcached2.php
$memcachehost = '192.168.253.150;
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from test1 limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
$conn=mysql_connect("192.168.253.135","memcache","Axiang@123");
mysql_select_db(testab1);
$result=mysql_query($query);
while ($row=mysql_fetch_assoc($result))
{
$arr[]=$row;
}
$f = 'mysql';
$memcache->add($key,serialize($arr),0,30);
$data = $arr ;
}
else{
$f = 'memcache';
$data_mem=$memcache->get($key);
$data = unserialize($data_mem);
}
echo $f;
echo "
";
echo "$key";
echo "
";
//print_r($data);
foreach($data as $a)
{
echo "number is $a[id]";
echo "
";
echo "name is $a[name]";
echo "
";
}
?>
如果出现mysql表示memcached中没有内容,需要memcached从数据库中取得:(第一次在数据库上找数据,第二次在memcache,默认memcache的缓存时间为一分钟。一分钟后又在MySQL中找数据。)
刷新页面,如果有memcache标志表示这次的数据是从memcached中取得的。