缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存php
缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务。html
数据库: mysql(关系型数据库,可以保证数据一致性,保证数据不丢失,当由于功能太多,致使性能不高) ===数据参考前端
缓存数据库: memcache redis(非关系型数据库,性能极高,但不保证数据完整性) === 业务的数据提供者mysql
memcachedb 会将内存的数据写入到磁盘中nginx
redis 主要工做场所是内存中,可是按期备分内存数据到硬盘web
数据存储,数据仓库选择mysql这种磁盘的数据库redis
高并发,业务大的应用选择memcache这种内存数据库算法
关系型数据库 mysqlsql
非关系型数据库(NOSQL) memcached redis MongoDB数据库
Memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意思,cache是缓存的意思,d是daemon的意思。
memcache 是项目名称,也是一款软件,其架构是C/S架构。
memcached官网:http://memcached.org/
① 对于用户来说,用户访问网站更快了,体验更好了。
②对网站来讲,数据库压力下降了。只有当内存没有数据时才会去请求数据库。第一次写入的数据也会请求数据库。通常公司没有预热,只有当用户读取过数据库才会放到Memcached中。
② 提高了网站的并发访问,减小服务器数量。
当数据库(mysql)承受不了大并发的请求时,能够将数据缓存到内存中(缓存数据库),而后就能够解决
做为数据库的前端缓存最大目的:减小数据库被大量访问的压力
session存储在文件,数据库,memcache,或内存等的服务端上,
cookie 存放在客户端浏览器上。
session是一个存在服务器上的相似于一个散列表格的文件。里面存有咱们须要的信息,在咱们须要用的时候能够从里面取出来。
session依赖cookie存在,请求客户端到达服务端后,服务端会随机生成一个字符串,做为该用户的标识,该字符串经过cookie返回给客户端,客户端浏览器会以该字符串为key放到session id里面,随机字符串的key里面能够先没有值。若是用户再次提交,请求信息中的用户名密码等用户信息保存在随机字符串的value中,请求到达服务端,用户名密码正确,随机字符串会被受权,提一个标记给到sessionid中的随机字符串的value中,证实该用户已是登陆状态,客户端再次带着该随机字符串访问服务端,服务端会知道该用户已经登陆不需验证,直接返回请求的信息。
session和cookie区别
一、cookie数据存放在用户的浏览器上,session数据存储在服务器上
二、cookie在本地的浏览器中,能够被提取分析,安全性差。为了安全,登陆帐户等信息能够缓存在session中。
三、session会在必定时间内保存在服务器上,访问量增大会给服务器带来压力,可使用缓存工具,如memcache等
最开始的技术方法:服务器在你的浏览器中写一个cookies,这个cookies就包含了你的用户名及登陆信息。由于cookies是存储在本地浏览器中,因此第三方工具很容易盗取cookies信息。
最开始:
cookies cookies名字:内容(用户名,登陆信息)
改进后:
本地浏览器存放:
cookies cookies名字:内容(session id 编号)
服务器存放:
session session id:内容(用户名,登陆信息)
主流使用场景:cookies + session
一、session文件提供NFS共享
二、session文件提供rsync scp共享
三、将session的内容存放在数据库(mysql)中,全部的机器均可以经过ip:port读取
四、将session的内容存放在缓存数据库中,全部的机器均可以经过ip:port读取
好处:利用断电、重启丢失数据的特性。定时清理数据;提升并发
启动Memcached吋,根据指定的内存大小参数,会被分配一个内存个间。当咱们读取数据库的各种业务数据后,数据会同吋放入Memcached缓存中,,下一次用户请求一样的数据,程序直接去Memcached取数据返回给用户。
优势:
① 对于用户来说,用户访问网站更快了,体验更好了。#
② 对网站来讲,数据库压力下降了。只有当内存没有数据时才会去请求数据库。第一次写入的数据 也会请求数据库。通常公司没有预热,只有,用户读取过数据库才会放到Memcached中。
③ 提高了网站的并发访问,减小服务器数最。
原理图
memcached天生不支持分布式集群,须要经过程序支持分布式存储
1. 全部MC服务器内存的内容都是不同的。这些服务器内容加起来接近数据库的容量。好比1T的数据库,一台缓存数据库的内存没有那么大,所以分红10台缓存服务器。
2. 经过在客户端(Web)程序或者MC的负载均衡器上用HASH算法,让同一内容都分配到一个MC服务器。
3. 普通的HASH算法对于节点宕机会带来大量的数据流动(失效),可能会引发雪崩效应。
4. 一致性HASH可让节点宕机对节点的数据流动(失效)降到最低。
普通的hash算法
首先将key处理为一个32位字符串,取前8位,在通过hash计算处理成整数并返回,而后映射到其中一台服务器这样获得其中一台服务器的配置,利用这个配置完成分布式部署。在服务器数量不发生变化的状况下,普通hash分布能够很好的运做,当服务器的数量发生变化,问题就来了。试想,增长一台服务器,同一个key通过hash以后,与服务器取模的结果和没增长以前的结果确定不同,这就致使了,以前保存的数据丢失。
一致性hash算法
一致性哈希算法
优势:在分布式的cache缓存中,其中一台宕机,迁移key效率最高
将服务器列表进行排序,根据mHash($key) 匹配相邻服务器
一致性hash算法 将数据流动降到最低
参考资料
http://blog.csdn.net/cywosp/article/details/23397179 http://blog.csdn.net/zhangskd/article/details/50256111
[root@cache01 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@cache01 ~]# uname -r 3.10.0-693.el7.x86_64 [root@cache01 ~]# getenforce Disabled [root@cache01 ~]# 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) Docs: man:firewalld(1) [root@cache01 ~]# hostname -I 10.0.0.21 172.16.1.21
[root@cache01 ~]# yum -y install memcached
[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 After=network.target [Service] Type=simple EnvironmentFile=-/etc/sysconfig/memcached ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS [Install] WantedBy=multi-user.target
[root@cache01 ~]# systemctl start memcached.service
set key 0 0 10 <command name> <key> <flags> <exptime> <bytes>\r\n
\n 换行且光标移至行首
\r 光标移至行首,但不换行
参数 |
说明 |
<flags> |
是在取回内容时,与数据和发送块一同保存服务器上的任意16位无符号整形(用十进制来书写)。客户端能够用它做为“位域”来存储一些特定的信息;它对服务器是不透明的。 |
<exptime> |
是终止时间。若是为0,该项永不过时(虽然它可能被删除,以便为其余缓存项目腾出位置)。若是非0(Unix时间戳或当前时刻的秒偏移),到达终止时间后,客户端没法再得到这项内容 |
<bytes> |
是随后的数据区块的字节长度,不包括用于分页的“\r\n”。它能够是0(这时后面跟随一个空的数据区块)。 |
<data block>\r\n |
<data block> 是大段的8位数据,其长度由前面的命令行中的<bytes>指定。 |
写入读取数据
[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 "set key009 0 0 11\r\noldboy0987\r\n"|nc 10.0.0.21 11211 [root@cache01 ~]# printf "get key009\r\n"|nc 10.0.0.21 11211 END
写入数据长度不符合,定义太小
[root@cache01 ~]# printf "set key010 0 0 9\r\noldboy0987\r\n"|nc 10.0.0.21 11211 CLIENT_ERROR bad data chunk ERROR [root@cache01 ~]# printf "get key010\r\n"|nc 10.0.0.21 11211 END
时效性
[root@cache01 ~]# printf "set key011 0 10 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211 STORED [root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211 VALUE key011 0 10 oldboy0987 END [root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211 END
删除数据
[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211 DELETED [root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211 END
命令集
#编译进去php_mem 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 # 激活php_memcached sed -i '$a extension=memcache.so' /application/php/lib/php.ini pkill php /application/php/sbin/php-fpm -t /application/php/sbin/php-fpm /application/php/bin/php -m|grep memcache
检查当前环境
查看php的模块
1 查看php的模块 2 [root@web06 ~]# /application/php/bin/php -m 3 [PHP Modules] 4 bcmath 5 Core 6 ctype 7 curl 8 date 9 dom 10 ereg 11 fileinfo 12 filter 13 ftp 14 gd 15 hash 16 iconv 17 json 18 libxml 19 mbstring 20 mcrypt 21 mhash 22 mysql 23 mysqlnd 24 openssl 25 pcntl 26 pcre 27 PDO 28 pdo_mysql 29 pdo_sqlite 30 Phar 31 posix 32 Reflection 33 session 34 shmop 35 SimpleXML 36 soap 37 sockets 38 SPL 39 sqlite3 40 standard 41 sysvsem 42 tokenizer 43 xml 44 xmlreader 45 xmlrpc 46 xmlwriter 47 xsl 48 zlib 49 50 [Zend Modules]
执行过程
编译安装
[root@web06 memcache-2.2.5]# make install Installing shared extensions: /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/ [root@web06 memcache-2.2.5]# ls /application/php/lib/php/extensions/no-debug-non-zts-20121212/ memcache.so [root@web06 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini [root@web06 memcache-2.2.5]# pkill php [root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm -t [17-Nov-2017 11:39:13] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful [root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm [root@web06 memcache-2.2.5]# /application/php/bin/php -m|grep memcache memcache
[root@web01 blog]# 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('key20171117', 'hello,world'); $get_value = $memcache->get('key20171117'); echo $get_value; ?>
浏览器访问
数据库读取测试
[root@cache01 ~]# printf "get key20171117 \r\n"|nc 10.0.0.21 11211 VALUE key20171117 0 11 hello,world END
使用的软件memadmin
官网:http://www.junopen.com/memadmin/
将程序包放如站点目录,浏览器进行访问便可
[root@web06 tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/
默认用户名密码为admin
添加一个新的memcached服务器
web界面管理全中文,较为简单
经过程序实现
[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php
方法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://10.0.0.21:11211"' /application/php/lib/php.ini
使用这个功能,须要使用php的session函数
本文出自“惨绿少年”,欢迎转载,转载请注明出处!http://blog.znix.top