当前位置:Gxlcms > 数据库问题 > 搭建Memcache缓存数据库

搭建Memcache缓存数据库

时间:2021-07-01 10:21:17 帮助过:7人阅读

Memcache

为什么用缓存数据库

MySQL:磁盘上的数据库,数据写入读取相对较慢

Memcached:内存中的数据库,数据读写都快,但是数据易丢失

 

数据存储,数据仓库选择MySQL这种磁盘的数据库

高并发,业务大的应用选择Memcached这种内存数据库

 

工作中,MySQL+Memcached搭配使用

Memcached介绍

技术分享图片

Memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意

思,cache是缓存的意思,ddaemon的意思。

http://memcached.org/

 Memcached在企业中使用场景一

技术分享图片

优点:

  对于用户来讲,用户访问网站更快了,体验更好了。


  对网站来说,数据库压力降低了。只有当内存没有数据时才会去请求数据库。第一次写入的数据也会请求数据库。一般公司没有预热,只有当用户读取过数据库才会放到Memcached中。


  提升了网站的并发访问,减少服务器数量。


作为数据库的前段缓存应用,减少数据库被大量访问的压力。


Memcached在企业中使用场景二

作为集群后端的session会话保持

技术分享图片

CookiesSession

网站程序判断用户登陆信息,最开始的技术方法:服务器在你的浏览器中写一个cookies,这个cookies

就包含了你的用户名及登录信息。因为cookies是存储在本地浏览器中,所以第三方工具很容易盗取 cookies中的隐私信息。

技术分享图片

最开始:

cookies cookies名字:内容(用户名,登录信息)            

 

改进:

本地浏览器:

cookies cookies名字:内容(session id 编号)

                         

服务器:                   

session session id:内容(用户名,登录信息)

主流使用场景:cookies + session     

Memcached分布式缓存集群

Memcached天生不支持分布式集群,只能通过程序支持分布式存储

Memcached分布式缓存集群的特点:

所有MC服务器内存的内容都是不一样的。这些服务器内容加起来接近数据

库的容量。比如1T的数据库,一台缓存数据库的内存没有那么大,因此分

10台缓存服务器。

普通哈希算法

技术分享图片


通过在客户端(Web)程序或者MC的负载均衡器上用HASH算法,让同一内容都分配到一个MC服务器。

 

普通的HASH算法对于节点宕机会带来大量的数据流动(失效)可能会引起雪崩效应

一致性哈希算法

技术分享图片

1.首先求出memcached服务器(节点)的哈希值,并将其配置到0232的圆(continuum)上。

 

2.然后采用同样的方法求出存储数据的键的哈希值,并映射 到相同的圆上。

 

3.然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。

 服务端部署

环境装备

CentOS7模板机全新克隆一台新主机

IP规划为10.0.0.21/172.16.1.21,主机名为cache01

其次,准备一台能够打开wordpressweb01机器(CentOS6),仿真企业真

实环境,多系统混合使用

安装memcached

[root@cache01 ~]# yum -y install memcached

查看配置文件

[root@cache01 ~]# cat /etc/sysconfig/memcached

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS=""

启动memcached

[root@cache01 ~]# systemctl  start memcached.service

[root@cache01 ~]# systemctl  status memcached.service

[root@cache01 ~]# netstat -tunlp|grep memcached

tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      1491/memcached     

tcp6       0      0 :::11211                :::*                    LISTEN      1491/memcached     

udp        0      0 0.0.0.0:11211           0.0.0.0:*                           1491/memcached      

udp6       0      0 :::11211                :::*                                1491/memcached

练习memcached命令语法

增删改查

[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"  

set key008 0 0 10

oldboy0987

[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211   保存

STORED

[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211   查看

VALUE key008 0 10

oldboy0987

END

[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211  删除

DELETED

终止时间设置

[root@cache01 ~]#  printf "set key008 0 6 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211  增加6秒终止时间

STORED

[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211

VALUE key008 0 10

oldboy0987

END

[root@cache01 ~]#  printf "get key008\r\n"|nc 10.0.0.21 11211

END

 语法说明

set          key    0       0      10   \r\n oldboy0987 \r\n

<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n

<flags>

是在取回内容时,与数据和发送块一同保存服务器上的任意16位无符号整形(用十进制来书写)。客户端可以用它作为“位域”来存储一些特定的信息;它对服务器是不透明的。

<exptime>

是终止时间。如果为0,该项永不过期(虽然它可能被删除,以便为其他缓存项目腾出位置)。如果非0 (Unix时间戳或当前时刻的秒偏移),到达终止时间后,客户端无法再获得这项内容。

<bytes>

是随后的数据区块的字节长度,不包括用于分页的“\r\n”。它可以是0(这时后面跟随一个空的数据区块)。

<data   block>

是大段的8位数据,其长度由前面的命令行中的<bytes>指定。

\n 换行且光标移至行首

\r 光标移至行首,但不换行

客户端部署

安装包:https://pan.baidu.com/s/1qZPLmkk


[root@web tools]# tar zxf memcache-2.2.5.tgz

[root@web tools]# cd memcache-2.2.5

 

重新编译php添加memcache模块

[root@web memcache-2.2.5]# /application/php/bin/phpize

[root@web memcache-2.2.5]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir

[root@web memcache-2.2.5]# make && make install

[root@web memcache-2.2.5]# ls  /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/

memcache.so

 

[root@web memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini

[root@web memcache-2.2.5]# pkill php

[root@web memcache-2.2.5]# /application/php/sbin/php-fpm -t

[11-Jan-2018 07:44:56] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful

 

[root@web memcache-2.2.5]# /application/php/sbin/php-fpm

[root@web memcache-2.2.5]# /application/php/bin/php -m|grep memcache

memcache

php代码测试

[root@web memcache-2.2.5]# cat >> /application/nginx/html/blog/mc.php<<'EOF'

> <?php

> $memcache = new Memcache;

> $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");

> $memcache->set('key20180111', 'hello,world');

> $get_value = $memcache->get('key20180111');

> echo $get_value;

> ?>

> EOF

[root@web memcache-2.2.5]# cat /application/nginx/html/blog/mc.php

<?php

$memcache = new Memcache;

$memcache->connect('10.0.0.21', 11211) or die ("Could not connect");

$memcache->set('key20180111', 'hello,world');

$get_value = $memcache->get('key20180111');

echo $get_value;

?>

技术分享图片

服务端查看

[root@cache01 ~]# printf "get key20180111\r\n"|nc 10.0.0.21 11211

VALUE key20180111 0 11

hello,world

END

 Web界面管理memcached

技术分享图片有敏感信息发不了,哈哈哈

[root@web tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

 Memcache数据缓存

使用memcached缓存wordpress博文数据

 

[root@web tools]# cd /application/nginx/html/blog/wp-content/

脚本:https://pan.baidu.com/s/1o9bKt2U

[root@web wp-content]# rz -E

rz waiting to receive.

[root@web wp-content]# sed -i 's#127.0.0.1#10.0.0.21#' object-cache.php

写一篇博文

技术分享图片

技术分享图片

Memcached Session共享

方法1:通过程序实现,web01只需要往memcahcesessionweb02memcahcesession

当作普通数据读写(更具有通用性)

 

方法2:通过php的配置文件,php默认将session存储在文件中,修改为存储在memcached

sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a

session.save_path = "tcp://10.0.0.21:11211"' /application/php/lib/php.ini

使用这个功能,需要使用phpsession函数


搭建Memcache缓存数据库

标签:bin   htm   world   order   tcp   容量   cached   通过   方法   

人气教程排行