企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#本地缓存与分布式缓存 #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模式的数据备份。