为什么用缓存数据库

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

详细了解cookie和session请看

他们都是key-value的形式

cookie存放在浏览器上

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

session放在服务器上

Memcache的使用

准备环境

配置了一台centos6的模板机

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

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

  1. [root@cache01 ~]# yum install memcached nc telnet -y
  1. [root@cache01 ~]# rpm -ql memcached
  2. /etc/sysconfig/memcached # 配置文件
  3. /usr/bin/memcached
  4. /usr/bin/memcached-tool
  5. /usr/lib/systemd/system/memcached.service # 规则
  6. /usr/share/doc/memcached-1.4.15
  7. /usr/share/doc/memcached-1.4.15/AUTHORS
  8. /usr/share/doc/memcached-1.4.15/CONTRIBUTORS
  9. /usr/share/doc/memcached-1.4.15/COPYING
  10. /usr/share/doc/memcached-1.4.15/ChangeLog
  11. /usr/share/doc/memcached-1.4.15/NEWS
  12. /usr/share/doc/memcached-1.4.15/README.md
  13. /usr/share/doc/memcached-1.4.15/protocol.txt
  14. /usr/share/doc/memcached-1.4.15/readme.txt
  15. /usr/share/doc/memcached-1.4.15/threads.txt
  16. /usr/share/man/man1/memcached-tool.1.gz
  17. /usr/share/man/man1/memcached.1.gz

Memcache的读、取、删除、配置

看一眼这两个文件的内容

  1. [root@cache01 ~]# cat /etc/sysconfig/memcached
  2. PORT="" # 默认的端口,工作中请改掉
  3. USER="memcached" # 默认的用户
  4. MAXCONN="" # 最大连接数
  5. CACHESIZE="" # 最大缓存大小
  6. OPTIONS=""
  7. [root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service
  8. [Unit] 介绍服务的依赖关系
  9. Description=Memcached
  10. Before=httpd.service # 要在http服务之前
  11. After=network.target # 要在network之后
  12.  
  13. [Service] 写服务
  14. Type=simple
  15. EnvironmentFile=-/etc/sysconfig/memcached 用-号引入了文件中的变量
  16. ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
    # 上面的一行,开启memcache的命令,就是描述如何启动
  17.  
  18. [Install]
  19. WantedBy=multi-user.target

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

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

memcache的其他参数

启动memcache

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

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

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

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

必须指定大小

  1. set pizza 0 0 10 # 这里按回车
  2. luffy.haha
  3. STORED
  4. set pizza 0 0 10
  5. luffy
  6.  
  7. # 长度不够就报错了
  8. CLIENT_ERROR bad data chunk
  9. ERROR
  10. get pizza
  11. VALUE pizza 0 10
  12. luffy.haha
  13. END
  14. set pizza 0 0 10
  15. luffy.hehe
  16. STORED
  17. # 会覆盖原来的值
  18. get pizza
  19. VALUE pizza 0 10
  20. luffy.hehe
  21. END

怎么退出telnet的?ctrl+]

  1. ^]
  2. telnet> quit
  3. Connection closed.
  4. [root@cache01 ~]#

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

  1. [root@cache01 ~]# telnet 172.16.1.21 11211
  2. Trying 172.16.1.21...
  3. Connected to 172.16.1.21.
  4. Escape character is '^]'.
  5. stats
  6. STAT pid 1409
  7. STAT uptime 4801
  8. STAT time 1552674611
  9. STAT version 1.4.15
  10. STAT libevent 2.0.21-stable
  11. STAT pointer_size 64
  12. STAT rusage_user 0.164849
  13. STAT rusage_system 0.175484
  14. STAT curr_connections 10
  15. STAT total_connections 13
  16. STAT connection_structures 11
  17. STAT reserved_fds 20
  18. STAT cmd_get 2
  19. STAT cmd_set 3
  20. STAT cmd_flush 0
  21. STAT cmd_touch 0
  22. STAT get_hits 2
  23. STAT get_misses 0
  24. STAT delete_misses 0
  25. STAT delete_hits 0
  26. STAT incr_misses 0
  27. STAT incr_hits 0
  28. STAT decr_misses 0
  29. STAT decr_hits 0
  30. STAT cas_misses 0
  31. STAT cas_hits 0
  32. STAT cas_badval 0
  33. STAT touch_hits 0
  34. STAT touch_misses 0
  35. STAT auth_cmds 0
  36. STAT auth_errors 0
  37. STAT bytes_read 187
  38. STAT bytes_written 241
  39. STAT limit_maxbytes 67108864
  40. STAT accepting_conns 1
  41. STAT listen_disabled_num 0
  42. STAT threads 4
  43. STAT conn_yields 0
  44. STAT hash_power_level 16
  45. STAT hash_bytes 524288
  46. STAT hash_is_expanding 0
  47. STAT bytes 81
  48. STAT curr_items 1
  49. STAT total_items 2
  50. STAT expired_unfetched 0
  51. STAT evicted_unfetched 0
  52. STAT evictions 0
  53. STAT reclaimed 0
  54. END

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

这样是不安全的!

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

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

  1. [root@cache01 ~]# vim /etc/sysconfig/memcached
  2. PORT=""
  3. USER="memcached"
  4. MAXCONN=""
  5. CACHESIZE=""
  6. OPTIONS="-l 172.16.1.21" # 加在这里

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

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

  1. [root@cache01 ~]# systemctl restart memcached.service
  2. [root@cache01 ~]# telnet 10.0.0.21 11211
  3. Trying 10.0.0.21...
  4. 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

  1. [root@web01 tools]# tar xf memcache-2.2.5.tgz
  2. [root@web01 tools]# cd memcache-2.2.5
  3. # memcache是作为php里面的一个功能,一个插件。和便以一个新的功能不一样
  4. #要先执行下面的命令先处理一下
  5. [root@web01 memcache-2.2.5]# /application/php/bin/phpize
  6. Configuring for:
  7. PHP Api Version: 20121113
  8. Zend Module Api No: 20121212
  9. Zend Extension Api No: 220121212
  10. [root@web01 memcache-2.2.5]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
  11. [root@web01 memcache-2.2.5]# make && make install
  12. # 安装完成后,在最后有一个提示
  13. Installing shared extensions: /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
  14. [root@web01 memcache-2.2.5]# ll /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
  15. total 252
  16. -rwxr-xr-x 1 root root 258008 Mar 15 19:10 memcache.so
  17. # 看到在目录下有一个文件,相当于生成了一个执行文件,只能在php中使用
  18. ## 增加下面的复制文件的操作
    cp /application/php/lib/php.ini-production /application/php/lib/php.ini
  19. # 作如下修改
  20. [root@web01 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini
  21. # 需要重启PHP
  22. pkill php # killall php-fpm
  23.  
  24. [root@web01 memcache-2.2.5]# ps -ef |grep php
  25. root 2589 1226 21 19:25 pts/0 00:00:00 grep php
  26. # 检查php
  27. [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm -t
  28. [15-Mar-2019 19:25:52] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful
  29. # 启动
  30. [root@web01 memcache-2.2.5]# /application/php/sbin/php-fpm
  31. # 查看有没有命令
  32. [root@web01 memcache-2.2.5]# /application/php/bin/php -m |grep memcache
    memcache

PHP代码测试

  1. cat >/application/nginx/html/blog/mc.php<<'EOF'
  2. <?php
  3. $memcache = new Memcache;
  4. $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");
  5. $memcache->set('key_oldboy', 'hello,oldgirl');
  6. $get_value = $memcache->get('key_oldboy');
  7. echo $get_value;
  8. ?>
  9. 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服务器上查看

  1. [root@cache01 tools]# telnet 172.16.1.21 11211
  2. Trying 172.16.1.21...
  3. Connected to 172.16.1.21.
  4. Escape character is '^]'.
  5. get key_oldboy
  6. VALUE key_oldboy 0 13
  7. hello,oldgirl
  8. END
  9.  
  10. [root@cache01 tools]# printf "get key_oldboy\r\n"|nc 172.16.1.21 11211
    VALUE key_oldboy 0 13
    hello,oldgirl
    END
    [root@cache01 tools]#
  11.  

WEB管理memcache

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

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

在nginx中设置只让内网访问

Memcache 监控

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

  1. printf "stats\r\n"|nc 172.16.1.21 11211
  2. ①监听port或进程
  3. ②可以模拟用户先setget,比对get内容是不是set的。crond nagios zabbix
  4. ③监控命中百分比
  5. 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}'
  6. ④监控响应时间及需要的状态?

Memcache缓存案例--缓存wordpress

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

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

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

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

zip的压缩包用unzip解压

修改IP

OK!

Memcache Session 共享

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

  1. 方法1:通过程序实现,web01只需要往memcahcesession
        web02memcahcesession,当作普通数据读写(更具有通用性)
  2.  
  3. 方法2:通过php的配置文件,php默认将session存储在文件中,修改为存储在memcached
  4.  
  5. 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
  6.  
  7. 使用这个功能,需要使用phpsession函数

写一个phpinfo来查看phpinfo

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

浏览器访问 10.0.0.7/php_info.php

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

缓存数据库Memcache的更多相关文章

  1. 缓存数据库memcache、redis原理对比

    一.问题:     数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案:      1.通过高速服务器Cache缓存数据库数据      2.内存数据库     (这里 ...

  2. java开发之阿里云对象存储OSS和云数据库Memcache的使用

    web开发中标配:aliyun ECS(阿里云服务器),aliyun RDS(阿里云数据库),aliyun OSS(阿里云对象存储),aliyun Memcache(阿里云缓存数据库). 今天就介绍下 ...

  3. memcached 缓存数据库应用实践

    1.1 数据库对比 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存   缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务. 数据库: mysql(关系型数据 ...

  4. 企业级memcached缓存数据库结合php使用与web管理memcached

    环境 [root@cache01 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@cache01 ~]# uname -a ...

  5. Django缓存机制以及使用redis缓存数据库

    目录 Django 配置缓存机制 缓存系统工作原理 Django settings 中 默认cache 缓存配置 利用文件系统来缓存 使用Memcache来缓存: 使用Local-memory来缓存: ...

  6. 分布式缓存系统——memcache

    一.简介 memcache是一个自由开源的.高性能的.分布式内存对象缓存系统.它是一种基于内存的key-value存储,用来存储小块的任意数据(字符串.对象).这些数据可以是数据库调用.API调用等. ...

  7. TCSQL实时列表缓存数据库帮助文档

    [文章作者:张宴 本文版本:v1.1 最后修改:2010.09.03 转载请注明原文链接:http://blog.zyan.cc/tcsql/] 曾经有人提出,一般数据库缓存分为四种.第一种:单个对象 ...

  8. 快速搭建Redis缓存数据库

    之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...

  9. 通过缓存数据库结果提高PHP性能(转)

    众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载.如果要处理的数据基本上是静态的,则该技术将非常有效.这是因为对远程数据库的许多数据请求最终可以从本地缓存得 ...

随机推荐

  1. 如何调用common.js

    第一步 页面需要引用此js 第二步 var loginJs = { //登录 goLogin: function () { var _userinfo = { name: "夏小沫" ...

  2. [PHP] 多进程通信-消息队列使用

    向消息队列发送数据和获取数据的测试 <?php $key=ftok(__FILE__,'a'); //获取消息队列 $queue=msg_get_queue($key,0666); //发送消息 ...

  3. 【Java每日一题】20170309

    20170308问题解析请点击今日问题下方的“[Java每日一题]20170309”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  4. Docker 系列七(Dubbo 微服务部署实践).

    一.前言 之前我们公司部署服务,就是大家都懂的那一套(安装JDK.Tomcat —> 编译好文件或者打war包上传 —> 启动Tomcat),这种部署方式一直持续了很久,带来的问题也很多: ...

  5. ES6核心特性

    摘要:聊JS离不开ES6啊! 原文:ES6核心特性 作者:ljianshu 前言 ES6 虽提供了许多新特性,但我们实际工作中用到频率较高并不多,根据二八法则,我们应该用百分之八十的精力和时间,好好专 ...

  6. 几点建议帮你写出简洁的JS代码

    译者按: 规范的代码可以有效避免代码bug,fundebug才会报警少一点! 原文: Tips for Writing Cleaner Code 译者: Fundebug 为了保证可读性,本文采用意译 ...

  7. phpstudy 产生You don't have permission to access / on this server.解决

    phpstudy配置好访问目录时候有时候会产生You don't have permission to access / on this server. 解决办法: 修改服务器httpd.conf配置 ...

  8. phpstorm连接服务器,实时编辑上传文件到服务器

    教程一:我的老版本,并且是汉化的,找到该位置 打开后:点击Configuration进行配置! 输入服务器的ip.端口.用户名.密码即可 打开编辑: 教程二:下面更新了一个新版本的(2018.2): ...

  9. 为什么用bower 安装bootstrap而不用npm来安装?

    NPM(node package manager),通常称为node包管理器.顾名思义,它的主要功能就是管理node包,包括:安装.卸载.更新.查看.搜索.发布等. npm的背后,是基于couchdb ...

  10. @meda媒体查询

    定义和使用 使用 @media 查询,你可以针对不同的媒体类型定义不同的样式. @media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的. ...