缓存数据库Memcache

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存数据库Memcache相关的知识,希望对你有一定的参考价值。

第1章 缓存数据库Memcache

1.1 为什么用缓存数据库

技术分享图片 

1.2 Memcached介绍

技术分享图片 

1.3 Memcached在企业中使用场景

1.3.1 应用场景一

技术分享图片

1.3.2 应用场景二

技术分享图片 

1.4 CookiesSession

技术分享图片 

1.5 Memcached分布式缓存集群

技术分享图片

1.5.1 普通哈希算法

技术分享图片

1.5.2 一致性哈希算法

技术分享图片

第2章 安装Memcached

2.1 服务端配置(Memcached

服务端环境

[[email protected]~]# cat /etc/redhat-release

CentOS Linux release 7.2.1511 (Core)

[[email protected]~]# uname -r

3.10.0-327.el7.x86_64

[[email protected]~]# getenforce

Disabled

[[email protected]~]# systemctl status firewalld.service

firewalld.service - firewalld - dynamic firewall daemon

   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)

   Active: inactive (dead)

[[email protected]~]# hostname -I

10.0.0.21 172.16.1.21

 

Memcache用到了libevent这个库用于Socket的处理

yum install libevent libevent-devel nc -y

 

查看配置文件

cat /etc/sysconfig/memcached

 

[[email protected] ~]# cat /etc/sysconfig/memcached

PORT="11211"

USER="memcached"                        

MAXCONN="1024"                        默认最大并发1024

CACHESIZE="64"                         内存用于以MB为单位的项目(默认为64 MB)

OPTIONS=""

查看启动文件

cat /usr/lib/systemd/system/memcached.service

 

启动服务

systemctl start memcached.service

 

[[email protected] ~]# ss -lntup |grep 11211

udp    UNCONN     0      0         *:11211                 *:*                   users:(("memcached",pid=15119,fd=28))

udp    UNCONN     0      0        :::11211                :::*                   users:(("memcached",pid=15119,fd=29))

tcp    LISTEN     0      128       *:11211                 *:*                   users:(("memcached",pid=15119,fd=26))

tcp    LISTEN     0      128      :::11211                :::*                   users:(("memcached",pid=15119,fd=27))

 

注:memcached可以同时启动多个实例,端口不一致即可。

memcached -m 16m -p 11212 -d -u root -c 8192

参数说明:

- m           max内存用于以MB为单位的项目(默认为64 MB)

- p            监听TCP端口号(默认:11211)

- d            作为守护进程运行

- u            假设<用户名>的身份(只有在作为根运行时)

- c            最大并发连接(默认:1024)

2.2 Memcached使用

memcached存储方式:

key   <->   value

   name  <->   wuhaung

写入数据

printf "set key008 0 0 10\r\nwuhuang987\r\n"|nc 10.0.0.21 11211

[[email protected] ~]# printf "set key008 0 5 10\r\nwuhuang987\r\n"|nc 10.0.0.21 11211

STORED

读取数据

printf "get key008\r\n"|nc 10.0.0.21 11211

[[email protected] ~]# printf "get key008\r\n"|nc 10.0.0.21 11211

VALUE key008 0 10

wuhuang987

END

删除数据

printf "delete key008\r\n"|nc 10.0.0.21 11211

 

技术分享图片 

2.3 客户端部署(web服务器Memcache

web01wordpress准备好(可以访问),接下来在这台机器安装memcache客户端。

安装php memcache 扩展插件

cd /server/tools

wget http://pecl.php.net/get/memcache-2.2.5.tgz

tar zxvf memcache-2.2.5.tgz

cd memcache-2.2.5

/application/php/bin/phpize

./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir

make && make install

 

查看是否安装成功

[[email protected] memcache-2.2.5]# ls /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/

memcache.so                                <--- memcache.so表示插件安装成功

 

配置memcache客户端使其生效

sed -i '$a extension=memcache.so' /application/php/lib/php.ini

 

检测语法,重启php服务

pkill php

/application/php/sbin/php-fpm -t

/application/php/sbin/php-fpm

/application/php/bin/php -m|grep memcache          

参数说明:-m查看PHP支持哪些模块

 

编写测试Memcache文件(PHP代码测试)

[[email protected] blog]# 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('key20180314', 'hello,world');

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

echo $get_value;

?>

EOF

服务端验证成功

[[email protected] ~]# printf "get key20180314\r\n"|nc 10.0.0.21 11211

VALUE key20180314 0 11

hello,world

END

2.4 web管理Memcached

2.4.1 配置web管理Memcached

下载pip网站程序

tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/

浏览器访问http://blog.etiantian.org/memadmin

 

技术分享图片 

技术分享图片 

技术分享图片技术分享图片 

2.4.2 使用Memcache缓存WordPress博文数据

WordPress会自动检查在wp-content目录下是否有object-cache.php文件,如果有,直接调用它作为WordPress对象缓存机制。

注意:object-cache.php此类文件是由开发完成,并非运维的工作,其他的网站做缓存也是由开发写程序。

2.4.3 Memcached Session共享

方法1

通过程序实现,web01只需要往memcahcesessionweb02memcahcesession,当作普通数据读写(更具有通用性)

方法2

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

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

修改php配置(设置session共享)

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

 

原配置:

1 session.save_handler = files

2 session.save_path = "/tmp"

 

修改为:

[[email protected] ~]# vim /application/php/lib/php.ini

1 session.save_handler = memcache

2 session.save_path = "tcp://10.0.0.21:11211"

 

修改完成之后要重启php服务

pkill php

/application/php/sbin/php-fpm -t

/application/php/sbin/php-fpm

2.5 Memcached在集群中session共享存储的优缺点

2.5.1 优点

1)读写速度上会比普通文件files速度快很多。

2)可以解决多个服务器共用session的难题。

2.5.2 缺点

1session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是问题。

2)一般是单台,如果部署多台,多台之间数据无法同步。通过hash算法分配依然有session丢失的问题。

2.5.3 替代方案

1)可以用其他的持久化系统存储session,例如redisttserver来替代memcached.

2)高性能并发场景,cookies效率比session要好很多,因此,大网站都会用cookies解决会话共享的问题.

3)一些不好的方法:lvs-p,nginx  ip_hash,不推荐使用.

2.6 DedeCMS使用memcache问题

2.6.1 问题

配置session共享后访问不了DedeCMS后台。

原因:bbsblogsession是存在数据库的表中,而DedeCMSsession是存在一个目录下的文件中。

2.6.2 解决方法

运维的工作:准备环境

PHP默认把session存放在数据库(或缓存中),而不是存放在文件中

 

开发的工作:用环境

修改文件一:

[[email protected] include]# pwd

/application/nginx/html/www/include

[[email protected] include]# vim common.inc.php

135 //Session保存路径

136 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10);

137 //$sessSavePath = DEDEDATA."/sessions_{$enkey}";

138 $sessSavePath = "tcp://10.0.0.21:11211";

139 if ( !is_dir($sessSavePath) ) mkdir($sessSavePath);

 

修改文件二:

[[email protected] include]# vim vdimgck.php

24 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10);

25 //$sessSavePath = DEDEDATA."/sessions_{$enkey}";

26 $sessSavePath = "tcp://10.0.0.21:11211";

27 if ( !is_dir($sessSavePath) ) mkdir($sessSavePath);


DedeCMS直接使用memcache的共享,解决问题(即使用memcecha缓存DedeCMS的数据)

 


以上是关于缓存数据库Memcache的主要内容,如果未能解决你的问题,请参考以下文章

走进缓存的世界 - Memcache

memcache雪崩

memcache缓存服务器概念篇

Django--缓存设置

缓存数据库Memcache

Memcache缓存服务器(Nginx+php+Memcache+MySQL)