缓存数据库Memcache

萝らか妹 提交于 2020-02-08 05:22:06

为什么用缓存数据库

MySQL:将数据存储在磁盘上,数据写入读取相对较慢

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

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

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

当然,在工作中,都是景MySQL+Memcached/Redis搭配使用

Memcache介绍

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

Mem是内存的意思

cache是缓存的意思

d是daemon的意思

官网地址http://memcache.org/

memcache在企业中的使用场景

优点:

  1. 对用户来讲,访问网站的速度更快了,体验更好了
  2. 对于网站来说,数据库压力降低了。只有当内存没有数据时,才回去请求数据库。第一次写入时也会请求数据库。一般公司没有预热,只有当用户读取过数据库,才回放到Memcache中。
  3. 提升了网站的并发访问,减少服务器的数量

数据库缓存架构图

memcache应用在session会话中

 

cookie和session

他们都是key-value的形式

cookie存放在浏览器上

  F12 ---->Application---->在左边栏可以找到cookies

session放在服务器上

 

Memcache的使用

准备环境

配置了一台centos6的模板机

在多次重启后,web01克隆机终于能连上了网络,并实现了LNMP

 

安装Memcached,同时也要安装nc和telnet用来管理memcache

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

 

[root@cache01 ~]# rpm -ql memcached
/etc/sysconfig/memcached     # 配置文件
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service   # 规则
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz

Memcache的读、取、删除、配置

 看一眼这两个文件的内容

[root@cache01 ~]# cat /etc/sysconfig/memcached 
PORT="11211"     # 默认的端口,工作中请改掉
USER="memcached"   # 默认的用户
MAXCONN="1024"    # 最大连接数
CACHESIZE="64"    # 最大缓存大小
OPTIONS=""
[root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service 
[Unit]   介绍服务的依赖关系
Description=Memcached 
Before=httpd.service    # 要在http服务之前
After=network.target    # 要在network之后

[Service]  写服务
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached      用-号引入了文件中的变量
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS  # 上面的一行,开启memcache的命令,就是描述如何启动

[Install]
WantedBy=multi-user.target

怎么根据文件中的要求来,制作一个启动文件,

有了这个文件,就可以用systemctl 来管理memecache

memcache的其他参数

启动memcache

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

 下图是在Linux命令行中的写法

 nc和telnet的作用差不多,都是测试端口,或者链接端口。telnet是交互式的,nc是非交互式

[root@cache01 ~]# telnet 172.16.1.21 11211
Trying 172.16.1.21...
Connected to 172.16.1.21.
Escape character is '^]'.

 

 必须指定大小

set pizza 0 0 10  # 这里按回车
luffy.haha
STORED
set pizza 0 0 10
luffy


# 长度不够就报错了
CLIENT_ERROR bad data chunk 
ERROR
get pizza 
VALUE pizza 0 10
luffy.haha
END
set pizza 0 0 10
luffy.hehe
STORED
# 会覆盖原来的值
get pizza
VALUE pizza 0 10
luffy.hehe
END

怎么退出telnet的?ctrl+]

^]
telnet> quit
Connection closed.
[root@cache01 ~]# 

在命令行中使用stats,查看mc的状态

[root@cache01 ~]# telnet 172.16.1.21 11211
Trying 172.16.1.21...
Connected to 172.16.1.21.
Escape character is '^]'.
stats
STAT pid 1409
STAT uptime 4801
STAT time 1552674611
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.164849
STAT rusage_system 0.175484
STAT curr_connections 10
STAT total_connections 13
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 2
STAT cmd_set 3
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 2
STAT get_misses 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 187
STAT bytes_written 241
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 81
STAT curr_items 1
STAT total_items 2
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END

无论使用公网10.0.0.21还是内网172.16.1.21.都能访问

这样是不安全的!

通过监听指定网卡(内网),来限制外网的访问

可以加在/etc/sysconfig/memcached 文件中

[root@cache01 ~]# vim /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 172.16.1.21"  # 加在这里
 

或者加在 /usr/lib/systemd/system/memcached.service 中 的[Service] ----->ExecStart 的参数中

添加好了,重启一下,在实际生产中,不要重启!!!重启将丢失所有数据

[root@cache01 ~]# systemctl restart memcached.service 
[root@cache01 ~]# telnet 10.0.0.21 11211
Trying 10.0.0.21...
telnet: connect to address 10.0.0.21: Connection refused

PHP部署Memcache客户端

实际环境中,我们不可能通过命令行用telnet或者printf来写如数据

LNMP环境中,我们需要在PHP中安装memcache客户端

下载地址 http://pecl.php.net/package/memcache

这个网站http://pecl.php.net可以下载很多软件

下载完成后,上传到服务器/server/tools/

拖拽进去依赖的软件是lrzsz

[root@web01 tools]# tar xf memcache-2.2.5.tgz 
[root@web01 tools]# cd memcache-2.2.5
# memcache是作为php里面的一个功能,一个插件。和便以一个新的功能不一样
#要先执行下面的命令先处理一下
[root@web01 memcache-2.2.5]# /application/php/bin/phpize  
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@web01 memcache-2.2.5]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config  --with-zlib-dir
[root@web01 memcache-2.2.5]# make && make install
# 安装完成后,在最后有一个提示
Installing shared extensions:     /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
[root@web01 memcache-2.2.5]# ll /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
total 252
-rwxr-xr-x 1 root root 258008 Mar 15 19:10 memcache.so
# 看到在目录下有一个文件,相当于生成了一个执行文件,只能在php中使用
## 增加下面的复制文件的操作cp /application/php/lib/php.ini-production /application/php/lib/php.ini
# 作如下修改
[root@web01 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini
# 需要重启PHP
pkill php   # killall php-fpm

[root@web01 memcache-2.2.5]# ps -ef |grep php
root       2589   1226 21 19:25 pts/0    00:00:00 grep php
# 检查php
[root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm -t
[15-Mar-2019 19:25:52] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful
# 启动
[root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm
# 查看有没有命令
[root@web01 memcache-2.2.5]# /application/php/bin/php -m |grep memcachememcache

PHP代码测试

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('key_oldboy', 'hello,oldgirl');
    $get_value = $memcache->get('key_oldboy');
    echo $get_value;
?>
EOF

EOF外边加引号,表示忽略内容中的特殊符号,不解析

在php中,添加的key的时候,不用指定长度,程序自己处理了

在我们的浏览器中输入 10.0.0.7/mc.php

可以看到 Could not connect

因为mc服务器关闭了外网的网卡,只监听内网472.16.1.21

所以,将mc.php中的10.0.0.21 换成172.16.1.21

可以看到 hello,oldgirl

然后在cache服务器上查看

[root@cache01 tools]# telnet 172.16.1.21 11211
Trying 172.16.1.21...
Connected to 172.16.1.21.
Escape character is '^]'.
get key_oldboy
VALUE key_oldboy 0 13
hello,oldgirl
END[root@cache01 tools]# printf "get key_oldboy\r\n"|nc 172.16.1.21 11211VALUE key_oldboy 0 13hello,oldgirlEND[root@cache01 tools]# 

WEB管理memcache

官网:http://www.junopen.com/memadmin/ 
tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/
浏览器访问http://主机名或者IP/memadmin

软件中文件的权限很高,都改成644的

在nginx中设置只让内网访问

Memcache 监控

除了用web管理监控memcache,还可以这样

printf "stats\r\n"|nc 172.16.1.21 11211
①监听port或进程
②可以模拟用户先set后get,比对get内容是不是set的。crond nagios zabbix
③监控命中百分比
printf 'stats\r\n'|nc 172.16.1.21 11211 |awk -vRS="\r\n" '/cmd_get/{get=$NF}/get_hits/{hits=$NF}END{print hits/get}'
④监控响应时间及需要的状态?

Memcache缓存案例--缓存wordpress

我们需要安装插件,正常,这种插件是需要 开发人员来写的

这有wordpress做好的插件,把文件安装到wp-content目录下

wordpress缓存数据缓存到memcached中:https://cn.wordpress.org/plugins/memcached/
wordpress缓存数据缓存到redis中:https://cn.wordpress.org/plugins/redis-cache/
wordpress会自动检查wp-content下面是否有object-cache.php
使用memcached缓存wordpress博文数据
修改:array('127.0.0.1:11211','');为memcached服务器ip地址

 

下载插件,解压出object-cache.php 放在 /application/nginx/html/blog/wp-content 下

zip的压缩包用unzip解压

修改IP

OK!

Memcache Session 共享

一般通过程序代码实现效率更高

方法1:通过程序实现,web01只需要往memcahce写session,    web02从memcahce读session,当作普通数据读写(更具有通用性)

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

sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a session.save_path = "tcp://172.16.1.21:11211"' /application/php/lib/php.ini

使用这个功能,需要使用php的session函数

写一个phpinfo来查看phpinfo

[root@web01 blog]# vim php_info.php
<?php
phpinfo()
?>

浏览器访问 10.0.0.7/php_info.php

在页面中可以找到session相关的函数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!