#本地缓存与分布式缓存
#Opcode 优化
##Opcode 原理 —— 回顾
以下哪个不是PHP语言开发Web应用的三个可以重大优化之处?
A、作为解释型语言
B、SAPI 的每次环境重新加载(对比Clamd) C、作为动态语言
D、低效的数据结构
d
##OpCode 带来的好处
1. 记得 SAPI 的优化是只加载一次环境,比如说模块
2. 而 OpCode 带来的好处是脚本只解析一次(模板
编译也是如此)
3. 极大地减少了 IO
4. OpCode 还有一说是 Optimized Opcode
##OpCode 介绍
1 不是 PHP 所独有
2 将人写的代码转换为中间代码
3 Java 也有字节码
4 可以通过反汇编的方式看到
vld 扩展
php -dvld.active=1 -dvld.verbosity=3 -dvld.save_dir='./' - dvld.save_paths=1 -dvld.dump_paths=1 quotes.php
##不加任何 Cache 的测试
在正式开始介绍和演示之前,我们先关掉所有的插件来评测三次
ab ‐c 20 ‐n 1000
http://hjvote.app.ucai.cn/index.php?s=/Admin/index
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
178.63 [#/sec] (mean) 111.965 [ms] (mean)
177.80 [#/sec] (mean) 112.488 [ms] (mean)
174.70 [#/sec] (mean) 114.482 [ms] (mean)
**以下哪个是 PHP 模块安装必须要用到的命令?**
A、phpize
B、php-fpm b
C、./configure --with-php-config=xxx D、make
E、make install
F、make test
##OpCode 产品
A、Zend OpCache
B、APC
C、XCache
D、eAccelerator
**A、Zend OpCache**
Zend 出品? Lead :鸟哥
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
424.31 [#/sec] (mean) 47.135 [ms] (mean)
457.50 [#/sec] (mean) 43.716 [ms] (mean)
446.40 [#/sec] (mean) 44.802 [ms] (mean)
**B、APC**
说两个亮点:
一、项目 Lead Rasmus Lerdorf
二、Facebook 在早期大量地应用 APC
apc.enabled = 1 apc.shm_segments = 1 apc.shm_size = 64m apc.optimization = 1 apc.num_files_hint = 0 apc.ttl = 0
apc.gc_ttl = 3600 apc.cache_by_default = on
表现不错,但不是非常稳定
**C、XCache**
不能同时开启, XCache 和 APC 否则会报错。
Cannot load module 'XCache' because conflicting module 'apc' is already loaded in Unknown on line 0
另外 xcache.size 老启用不成功
**D、eAccelerator**
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
423.97 [#/sec] (mean) 47.173 [ms] (mean)
性能较稳定,差别不大
428.52 [#/sec] (mean) 46.672 [ms] (mean)
465.26 [#/sec] (mean) 42.986 [ms] (mean)
###评测
**A、有无 OpCache 的比较 B、同 HHVM 的比较**
**ab ‐c 20 ‐n 1000**
"http://hjvote.app.ucai.cn/index.php"
Requests per second: Time per request: Requests per second: Time per request: Requests per second: Time per request:
1186.09 [#/sec] (mean) 16.862 [ms] (mean)
1166.30 [#/sec] (mean) 17.148 [ms] (mean)
1032.14 [#/sec] (mean) 19.377 [ms] (mean)
**有关 FastCGI+Nginx 环境以下哪个说法是不正确的?**
A、php-fpm 命令用于启动 FastCGI 进程管理器
B、nginx 的 -t 参数可用于测试配置是否正确
C、nginx 的 -r 参数可用于重新加载 nginx 配置
nginx -s reload
D、nginx 命令、php-fpm 都可以不指定配置文件路径启动
E、nginx 指定 php-fpm 做后端,不可以指定多个端口的后端
可以指定多个端口做分发
F、可以配置多份 php-fpm.conf,启动多份 php-fpm,占多个端口
G、php-fpm.conf 与 php.ini是并列关系,所以php-fpm并不需要 php.ini
答案 CEG
##OpCode 附带的好处
**A、共享内存**
什么是共享内存?
一般情况下,PHP程序退出,所有资源释放干净,无法在进程间 传递数组,于是有了共享内存
**B、本地缓存**
local memcached
基于用户的的会话保持 基于不同的用户大量地取同样的内容
减少对后端的压力
本地缓存适用于web服务器很多 或memecache很多的场景下才能发挥他的作用
#本地缓存介绍与应用
##专门的 ShareMemory
**专门产品:Yac**
只是做 ShareMemory
出品人,Ya系列,鸟哥 一般特点,命令行下不能使用,页面上可以使用,XCache也是如此
##本地缓存实践
A、不用 OpCache
B、启用 OpCache
C、不启用本地缓存
D、加上本地缓存
**有关共享内存下面说法正确的是?**
A、PHP 自带的共享内存,在命令行下也可以使用 B、APC、Yac 等的共享内存,可以当本地缓存使用 C、本地缓存可以跨机器共享
D、重启了 php-fpm , Yac等的共享内存会丢失
答案 abd
## 本地缓存之介绍与实现
1、还记得 OpCache 么?
2、重用 OpCode 缓存扩展,可以提供本地缓存 以 APC 为例
3、使用扩展的本地缓存之注意事项,在命令行下 是不能使用的,为什么?
命令行下没有进程来保存东西
4、也可以是独立的本地缓存
## 怎么在扩展中使用本地缓存
~~~
static void store_value(char *key, zval *argv)
{
zval * function_name;
zval * retval_ptr; MAKE_STD_ZVAL(function_name); MAKE_STD_ZVAL(retval_ptr);
zval *ret;
ret = packstr(argv);
zval *arg; ALLOC_INIT_ZVAL(arg); array_init(arg); add_assoc_zval(arg, key, ret);
ZVAL_STRINGL(function_name,"apc_store",sizeof("apc_store")-1,1); if(call_user_function(CG(function_table),NULL,function_name,retval_ptr,1,&arg TSRMLS_CC) == SUCCESS)
}
{} zval_ptr_dtor(&function_name); zval_ptr_dtor(&retval_ptr);
~~~
## 本地缓存与集中式缓存
**1、本地缓存应用**
A、本地缓存运用的场景
微博粉丝 多少服务器 降到多少的量级
B、本地缓存的优势
减少网络传输
C、本地缓存的局限
5000台的话数据重复 不能跨机器
**2、那什么是集中式缓存**
A、一台机器与多台机器
B、优势在哪里
只要一份数据
C、问题在哪里?
**单点故障** 有一台出问题 其他的都不能用
**有关非集中和集中式缓存下列说法正确的是:**
A、本地缓存属于非集中式缓存
B、本地缓存属于分布式缓存
C、集中式缓存是指存储在一台机器上的缓存
D、集中式缓存是指通过一个统一的接口能存取的 缓存,如果多台机器则是分布式缓存
答案 A D
#多服务器分布式的缓存
什么叫分布式?
通过一个接口对外提供服务
无状态分布式?
有状态分布式?
后台宕机不影响其他的
后台有一台down机 会影响到对外提供服务的接口比如memecache
![](https://box.kancloud.cn/2016-05-11_5732e06e21fd1.png)
** 有关分布式和分布式缓存下列说法正确的是:**
A、所谓分布式系统是一堆机器干一件事情,并且 节点之间通过网络相连,并通过消息通信并协调 行动
B、本地缓存的各服务器之间,并无协同,各台机 器独立地干一件事情,所以不是分布式缓存
C、分布式缓存上面,每台机器存储的是不同的数 据
D、分布式缓存服务器之间需要建立互相联系
答案:ABC
## 分布式缓存的数据存储
产生的背景
有必要讨论吗?不就是 get、set么? 数据如何存取?
我们如何分配数据? 对机器数取模可以不可以? 如果是字符串 key 值呢?
## 取模的情况
1、假设两台机器,现在有两组 key,比如是 5 和 4, 对 2 取模分别为 1、0 均分布于第2台 和第1台机器上(1,0分别对应第2、1台服务 器)。
2、当增加一台机器,到 3 台机器,为了平衡, 对 3 取模,5,4,结果为 2,1,分别对应到了 第3台和第2台机器上(2,1,0分别对应第3、2、 1台服务器)。
这意味着什么?
## 非一致性缓存带来的问题包括以下:
A、新增或者减少设备整个缓存体系混乱 B、在设备发生调整时,造成了对后端的巨大压力 C、重则使整个网站奔溃,轻则导致访问缓慢 D、在每一时刻,缓存键值所处的机器都不确定
## 实验校验一下
1、六个 memcached 节点
两台机器、六个节点
/usr/local/bin/memcached -p 11212 -d -uroot
-m 32
/usr/local/bin/memcached -p 11213 -d -
uroot -m 32
/usr/local/bin/memcached -p 11214 -d -
uroot -m 32
## 实验
1、检测所有服务器的连通性
2、建立 memcached 缓存池,检验是否成功?
3、怎么判定 memcached 缓存池是否是一致性缓存?实测。
4、一致性的特点
单调性是指如果已经有一些内容通过哈希分派到了相应
的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够
保证原有已分配的内容可以被映射到新的缓冲中去,而不会
被映射到旧的缓冲集合中的其他缓冲区。
#缓存数据存储与一致性Hash
## 什么是一致性Hash
1、一致性缓存什么意思?
起码不会随着缓存服务器 IP 地址顺序而发生大的变 化吧!
2、一致性 Hash 算法首先要考虑单调性
不会随着个别服务器的更新或者减少而发生巨大的缓
存迁徙。
3、一致性 Hash 算法其次要考虑平衡性
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中
去,这样可以使得所有的缓冲空间都得到利用。
![](https://box.kancloud.cn/2016-05-11_5732e06e515e0.png)
![](https://box.kancloud.cn/2016-05-11_5732e06e8978c.png)
## 图解一致性 Hash —— PHP 实现
1、flexihash 库
2、测试库的使用
3、了解实现![](https://box.kancloud.cn/2016-05-11_5732e06ebeba3.png)
#缓存总结与缓存使用
##什么是一致性Hash
## 多级缓存体系介绍
1、一再强调,缓存是重中之重,是我们心中的优 化之剑
2、我们现在来总结,缓存都有哪些?
3、设备、访问路径、前端、Web上、数据库、其 他层、分发路径?
4、好处,坏处
## 缓存之再细化
1、进程内缓存
2、页面片断缓存(ESI) 3、模板编译、本地缓存、Opcode Cache
4、集中式缓存
5、中间层缓存
6、数据库缓存
## 以下哪些不是Web 工程师要考虑的部分?
A、前端浏览器缓存
B、Web端文件缓存
C、CDN 文件缓存
D、用户桌面系统的系统缓存
E、DNS 缓存
F、服务器端 tmpfs 缓存
答案 abcef
##缓存汇总与缓存使用
**1、缓存的本质**
A、空间换时间,减少远程存取,减少运算
B、更快速度的设备、更近的距离
C、永远都不是原始数据 所以要做好丢失的风险
D、在用户体验与效率之间的平衡 所有的架构都是平衡的艺术
**以下哪些数据要以保存在缓存里?**
A、频繁更新的玩游戏的经验值等数据 B、抢购商品的商品数目上限 C、社交网络上的用户好友关系 D、用户个人资料信息
E、用户账户的金钱信息,先更新到缓存,再更新 到库中
答案abcd
#Redis和Memcache的区别分析
1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10
5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从
6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)
7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复
8、Redis支持数据的备份,即master-slave模式的数据备份。
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密