1.1 数据库比照
缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存
毛病:断电数据失落(双电),用缓存存储数据的目标只是为了应酬大并发的业务。
数据库: mysql(关系型数据库,可能保证数据一致性,保证数据不失落,当因为性能太多,导致性能不高) ===数据参考
缓存数据库: memcache redis(非关系型数据库,性能极高,但不保障数据完整性) === 业务的数据提供者
memcachedb 会将内存的数据写入到磁盘中
redis 次要工作场合是内存中,然而定期备份内存数据到硬盘
1.1.1 数据库的抉择
数据存储,数据仓库抉择mysql这种磁盘的数据库
高并发,业务大的利用抉择memcache这种内存数据库
1.1.2 数据库分类
关系型数据库 mysql
非关系型数据库(NOSQL) memcached redis MongoDB
1.2 memcached介绍
Memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意思,cache是缓存的意思,d是daemon的意思。
memcache 是项目名称,也是一款软件,其架构是C/S架构。
memcached官网:http://memcached.org/
1.2.1 memcache长处
① 对于用户来讲,用户拜访网站更快了,体验更好了。
②对网站来说,数据库压力升高了。只有当内存没有数据时才会去申请数据库。第一次写入的数据也会申请数据库。个别公司没有预热,只有当用户读取过数据库才会放到Memcached中。
② 晋升了网站的并发拜访,缩小服务器数量。
1.3 Memcached在企业中应用场景
1.3.1 作为数据库的前端缓存利用
当数据库(mysql)接受不了大并发的申请时,能够将数据缓存到内存中(缓存数据库),而后就能够解决
作为数据库的前端缓存最大目标:缩小数据库被大量拜访的压力
1.3.2 作为集群后端的session会话放弃
session存储在文件,数据库,memcache,或内存等的服务端上,
cookie 寄存在客户端浏览器上。
session是一个存在服务器上的相似于一个散列表格的文件。外面存有咱们须要的信息,在咱们须要用的时候能够从外面取出来。
session依赖cookie存在,申请客户端达到服务端后,服务端会随机生成一个字符串,作为该用户的标识,该字符串通过cookie返回给客户端,客户端浏览器会以该字符串为key放到session id外面,随机字符串的key外面能够先没有值。如果用户再次提交,申请信息中的用户名明码等用户信息保留在随机字符串的value中,申请达到服务端,用户名明码正确,随机字符串会被受权,提一个标记给到sessionid中的随机字符串的value中,证实该用户曾经是登录状态,客户端再次带着该随机字符串拜访服务端,服务端会晓得该用户曾经登录不需验证,间接返回申请的信息。
session和cookie区别
1、cookie数据寄存在用户的浏览器上,session数据存储在服务器上
2、cookie在本地的浏览器中,能够被提取剖析,安全性差。为了平安,登录账户等信息能够缓存在session中。
3、session会在肯定工夫内保留在服务器上,访问量增大会给服务器带来压力,能够应用缓存工具,如memcache等
1.3.3 网站开发如何判断用户信息
最开始的技术办法:服务器在你的浏览器中写一个cookies,这个cookies就蕴含了你的用户名及登录信息。因为cookies是存储在本地浏览器中,所以第三方工具很容易盗取cookies信息。
最开始:
cookies cookies名字:内容(用户名,登录信息)
改良后:
本地浏览器寄存:
cookies cookies名字:内容(session id 编号)
服务器寄存:
session session id:内容(用户名,登录信息)
支流应用场景:cookies + session
1.3.4 session共享的不同解决方案
1、session文件提供NFS共享
2、session文件提供rsync scp共享
3、将session的内容寄存在数据库(mysql)中,所有的机器都能够通过ip:port读取
4、将session的内容寄存在缓存数据库中,所有的机器都能够通过ip:port读取
益处:利用断电、重启失落数据的个性。定时清理数据;进步并发
1.3.5 memcache原理长处
启动Memcached吋,依据指定的内存大小参数,会被调配一个内存个间。当咱们读取数据库的各类业务数据后,数据会同吋放入Memcached缓存中,,下一次用户申请同样的数据,程序间接去Memcached取数据返回给用户。
长处:
① 对于用户来讲,用户拜访网站更快了,体验更好了。#
② 对网站来说,数据库压力升高了。只有当内存没有数据时才会去申请数据库。第一次写入的数据 也会申请数据库。个别公司没有预热,只有,用户读取过数据库才会放到Memcached中。
③ 晋升了网站的并发拜访,缩小服务器数最。
原理图
1.4 Memcached分布式缓存集群
memcached天生不反对分布式集群,须要通过程序反对分布式存储
1.4.1 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/23397179http://blog.csdn.net/zhangskd/article/details/50256111
第2章 memcached应用
2.1 装置memcached
2.1.1 环境阐明
[root@cache01 ~]# cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core) [root@cache01 ~]# uname -r3.10.0-693.el7.x86_64[root@cache01 ~]# getenforceDisabled[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 -I10.0.0.21 172.16.1.21
2.1.2 装置memcached
[root@cache01 ~]# yum -y install memcached
2.1.3 查看配置
[root@cache01 ~]# cat /etc/sysconfig/memcached PORT="11211"USER="memcached"MAXCONN="1024"CACHESIZE="64"OPTIONS=""
2.1.4 查看启动脚本
[root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service [Unit]Description=Memcached Before=httpd.serviceAfter=network.target[Service]Type=simpleEnvironmentFile=-/etc/sysconfig/memcachedExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS[Install]WantedBy=multi-user.target
2.1.5 启动服务
[root@cache01 ~]# systemctl start memcached.service
2.2 治理memcached
2.2.1 memcached数据库语法格局
set key 0 0 10<command name> <key> <flags> <exptime> <bytes>\r\n
n 换行且光标移至行首
r 光标移至行首,但不换行
参数 | 阐明 |
---|---|
<flags> | 是在取回内容时,与数据和发送块一起保留服务器上的任意16位无符号整形(用十进制来书写)。客户端能够用它作为“位域”来存储一些特定的信息;它对服务器是不通明的。 |
<exptime> | 是终止工夫。如果为0,该项永不过期(尽管它可能被删除,以便为其余缓存我的项目腾出地位)。如果非0(Unix工夫戳或以后时刻的秒偏移),达到终止工夫后,客户端无奈再取得这项内容 |
<bytes> | 是随后的数据区块的字节长度,不包含用于分页的“rn”。它能够是0(这时前面追随一个空的数据区块)。 |
<data block>rn | <data block> 是大段的8位数据,其长度由后面的命令行中的<bytes>指定。 |
2.2.2 数据库应用
写入读取数据
[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211STORED[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211VALUE key008 0 10oldboy0987END
写入数据长度不合乎,定义过大
[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 11211END
写入数据长度不合乎,定义过小
[root@cache01 ~]# printf "set key010 0 0 9\r\noldboy0987\r\n"|nc 10.0.0.21 11211CLIENT_ERROR bad data chunkERROR[root@cache01 ~]# printf "get key010\r\n"|nc 10.0.0.21 11211END
时效性
[root@cache01 ~]# printf "set key011 0 10 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211STORED[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211VALUE key011 0 10oldboy0987END[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211END
删除数据
[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211DELETED[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211END
2.3 memcache php版本客户端装置应用
命令集
#编译进去php_memtar zxvf memcache-2.2.5.tgzcd memcache-2.2.5/application/php/bin/phpize./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dirmakemake install# 激活php_memcachedsed -i '$a extension=memcache.so' /application/php/lib/php.inipkill php/application/php/sbin/php-fpm -t/application/php/sbin/php-fpm/application/php/bin/php -m|grep memcache
查看以后环境
查看php的模块
View Code 查看php的模块
*执行过程*
编译装置
[root@web06 memcache-2.2.5]# make installInstalling 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 memcachememcache
2.3.1 编写测试文件
[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 11hello,worldEND
2.4 web治理memcached
应用的软件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界面治理全中文,较为简单
2.5 memcached数据缓存
通过程序实现
2.5.1 blog站点实现memcached存储
[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php
2.6 memcached 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://10.0.0.21:11211"' /application/php/lib/php.ini
应用这个性能,须要应用php的session函数
作者:惨绿少年
出处:http://clsn.io欢送关注公众号 【码农开花】一起学习成长
我会始终分享Java干货,也会分享收费的学习材料课程和面试宝典
回复:【计算机】【设计模式】【面试】有惊喜哦