《深入探究 php-apcu 实现原理》-- 第一回:apcu的简介、优缺点及使用场景

在业务开发的某些场景中使用了apcu进行整体的性能优化,也取得了不错的效果,所以前两年就一直想写写相关的主题

市面上写redis的文章或者书籍铺天盖地,但是去谈apcu的却没有多少,有一些也是科普性的如何安装和使用,所以老赵这里总结一下自己所得,做个分享。

我这篇文章的主要结构大概是这样的:

1.apcu在缓存中地位及使用场景,与redis、mysql或者其他的一些nosql数据库如何搭配使用

2.apcu的源代码在哪里,主要涉及哪些技术点

1.APCU是什么?在什么样的场景使用?

官方对于apc的解释如下,可选的php缓存技术。apc包含两个方面,一方面对于本身代码级别的缓存,另一方面是提供给编码者使用的类似于redis的set、get这样的接口。在php 某个版本之后,apcu所提供的用户缓存部分被保存下来了

The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code

apcu扩展使用的方法是这样的:

<?php
$bar = ‘BAR‘;
apcu_add(‘foo‘, $bar);
var_dump(apcu_fetch(‘foo‘));
echo "\n";
$bar = ‘NEVER GETS SET‘;
apcu_add(‘foo‘, $bar);
var_dump(apcu_fetch(‘foo‘));
echo "\n";
?>

大体上来说,使用的api侧与memcahe、redis或者其他的基于磁盘的nosql使用的方式似乎没什么差别,我画了一个典型的web架构的示意图,来标识出来他们各自之间的区别

一般现在的架构模式下,负载均衡机器、服务集群、redis集群、mysql集群式相互独立运维的,也就是我所画出来的clusterA、clusterB、clusterC、clusterD,按照现在比较流行微服务划分(我对微服务的概念不是很熟),服务间使用网络协议调用

apcu是基于共享内存技术建设的,多个cgi之间访问apcu中的cache可以完全等同于访问自己进程的一块内存一样,不需要发任何的网络请求。

而不管是redis、mysql或者其他的独立服务的cache都需要发网络请求,即使存储和服务部署在同一机器上也仍然需要采用本地sock进行网络请求,何况在虚拟化的趋势下,这些存储服务一定是独立运行的。

按照计算机存储器层次结构的理论,访问内存的速度大概在纳秒级别 ,网络请求的速度在毫秒级别,同机架或者同机房的机器可能在1/10ms左右,还不考虑服务稳定性的情况下。

简单的进行存取测试,速度至少在千倍以上提升,但是apc在实际的使用中还是存在一定的局限性:

  1. 以扩展的方式接入,跟php这门语言有很强的耦合,而redis作为独立服务存在,使用协议接入
  2. apcu受限于单机内存的限制,扩展受阻,而目前的redis集群模式已经可以做到动态扩容,理论上无容量风险
  3. apcu数据存于单机内存,多机器之间的数据无法共享,这是他使用场景有限的最大阻碍

所以,我再使用场景中一般用apcu来缓存数据量小、但是读取量大或者瞬间读取量大的场景。

比如:

1.你是一个开放平台,你需要对客户请求做鉴权,这个token过来的请求可以访问哪些path请求。这个场景下,用户的token及可访问的path信息持久化在mysql中,变更频次小,数据量小,但是可能每秒有10W次请求

这个场景就比较适合apc,相比于直接请求mysql/redis的架构,可以给服务省掉10w - N 次/s的网络消耗,N为容器数目

2.抢购的场景下,假设量比较大,那么可以使用apc来做s级别的缓存元信息,以防止对于存储服务的瞬间链接量过大,导致失败的情况。

几个关键字:数据大小小、读取量大、配置信息、无状态

而有状态的信息你还是选择mysql/redis,所以这么来看,他的场景的确是有限。但是在有限场景也能发挥他的价值,作为php多进程之间通信的一种方式,也顺利帮我优化了几万/s的mysql、redis请求。

对于现在的web服务端编程而言,单个api请求带来的io转化次数是影响服务性能、稳定性的最大的因素(前提是没有慢sql),我曾经见到一个api平均转化了80次mysql,如果请求突增,加机器都很难解决统一rpc请求的日志,做好access_cps / rpc_cps 指标监控及上线前的准入还是非常重要的,当然两份日志求交也可以天级别分析出哪些api可能需要优化了

2.APCU源码及涉及的技术点?

作者深知我们这些phper扑在了创造互联网价值创造的一线,基础相对薄弱,面对C代码可能一头雾水,特地写了一篇英文的Readme,详细的介绍了实现所用到的技术及原理,多贴心

apcu源码的git地址在: https://github.com/krakjoe/apcu

实现说明文档在源码目录中的 TECHNOTES.txt文件下,当然看懂这系列文章的背后,你是需要补充一下内存方向的一些基本知识的:

  1. php  SAPI是什么?MINIT、RINIT阶段做了什么?及扩展开发需要做的一些事情
  2. 关于进程中内存的布局、共享内存技术、虚拟内存与物理内存、内存管理与分配

介绍先到这里,暂时给自己立个flag,后面的连载节奏是:

  1. php生命周期及扩展相关知识,具体结合apcu在每个阶段做了什么,为后续的技术点展开做好知识预告
  2. 从内存共享,引出mmap、shm等技术点,从而再复习一下进程中内存的布局、虚拟内存与mmap等的关系
  3. 进程间可以共享内存了,如何分配内存? 引 出molloc、free等基于堆的内存分配的实现及与apcu的内存分配器
  4. 内存分配之后,上层的数据结构如何构建能够做到基于key的数据检索?过期键如何实现

原文地址:https://www.cnblogs.com/zhaoyixing/p/12635269.html

时间: 2024-10-30 13:22:40

《深入探究 php-apcu 实现原理》-- 第一回:apcu的简介、优缺点及使用场景的相关文章

【第一章第一回】BootStrap 简介

Twitter Bootstrap 是目前最受欢迎的前端框架,它简洁.直观.移动优先.强悍的前端开发框架,让web开发更迅速.简单.基于HTML.CSS和Javascript. 为什么使用Bootstrap? 移动优先 - Bootstrap 3,框架包含移动优先样式,是贯穿整个库而不是单独的文件. 浏览器支持 - 支持所有流行浏览器 很容易开始 - 任何了解HTML和CSS的人都可以学习Bootstrap.并且Bootstrap官网也有文档. 响应式设计 - Bootstrap的响应式CSS适

【转】由浅入深探究mysql索引结构原理、性能分析与优化

摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与InnoDB索引相比较 第三部分:MYSQL优化 1.表数据类型选择 2.sql语句优化 (1)     最左前缀原则 (1.1)  能正确的利用索引 (1.2)  不能正确的利用索引 (1.3)  如果一个查询where子句中确实不需要password列,那就用“补洞”. (1.4)  like (2)

《C# 爬虫 破境之道》:第一境 爬虫原理 — 第一节:整体思路

在构建本章节内容的时候,笔者也在想一个问题,究竟什么样的采集器框架,才能算得上是一个“全能”的呢?就我自己以往项目经历而言,可以归纳以下几个大的分类: 根据通讯协议:HTTP的.HTTPS的.TCP的.UDP的: 根据数据类型:纯文本的.json的.压缩包的.图片的.视频的: 根据更新周期:不定期更新的.定期更新的.增量更新的: 根据数据来源:单一数据源.多重数据源.多重数据源混合: 根据采集点分布:单机的,集群的: 根据反爬虫策略:控制频率的,使用代理的,使用特定UA的: 根据配置:可配置的,

OSGi原理与最佳实践:第一章 OSGi框架简介(2)

OSGi原理与最佳实践:第一章 OSGi框架简介(2) 由  ValRay 发布 已被浏览4884次 共有3条评论 已被3个人收藏 2013-08-16 21:23 顶(0) 踩(0) osgi原理与最佳实践 1.1.4 开发传统类型的应用 1.1.4.1 B/S 我们首先来看一下,如何基于 OSGi 来开发 B/S 结构的应用.B/S 结构应用程序的开发,可有两个选择:一个是在 OSGi 的框架中嵌入 Http 服务器,另外一个是在 Servlet 容器中嵌入 OSGi 框架.下面分别介绍这两

OSGi原理与最佳实践:第一章 OSGi框架简介(5)Spring-DM

OSGi原理与最佳实践:第一章 OSGi框架简介(5)Spring-DM 由  ValRay 发布 已被浏览8409次 共有3条评论 已被2个人收藏 2013-08-16 21:29 顶(1) 踩(0) osgi原理与最佳实践 1.3 Spring-DM 1.3.1 简介 Spring-DM 指的是 Spring Dynamic Modules.Spring-DM 的主要目的是能够方便地将 Spring 框架 和OSGi框架结合在一起,使得使用Spring的应用程序可以方便简单地部署在OSGi环

程序演义第一回哥伦布水杯戏权贵

2.1第一回 哥伦布水杯戏权贵,阿兰煮酒论编程 第一回介绍的故事是关于航海家哥伦布的,本质上只说了一件事:什么是程序? 程序是怎么回事,和哥伦布又有什么关系呢?说简单很简单,用两个杯子比划一下就有了.故事还要从很久以前说起,1492年10月12日,哥伦布(Christopher Columbus)发现了新大陆--美洲大陆,他是发现美洲的第一人:同样的,在电脑世界中也有许多第一,那问一个最简单的问题:第一个程序是谁发明的呢?对于这个问题,现在很难考证.但经阿兰论证,程序和哥伦布有一定的关系,不信,

Functional Programming Principles in ScalaScala函式编程原理 第一章笔记

所有non-trival编程语言都提供了 基本表达式(expression)去表示最简单的表达式 组合表达式的方法 抽象表达式的方法,也就是为表达式引入一个名字去引用它 substitional model 替代模型 sumOfSquares(3,2+2) sumOfSquares(3,4) square(3)+square(4) 9+square(4) 9+16 25 这种模型的核心概念是所有的表达式都规约成值,替代模型在lamada表达式中被形式化,构成了函数式编程的基石 substitio

[你必须知道的.NET]第一回:恩怨情仇:is和as

本文将介绍以下内 容: • 类型转换 • is/as操作符小议 1. 引言 类型安全是.NET设计之初重点考虑 的内容之一,对于程序设计者来说,完全把握系统数据的类型安全,经常是力不从心的问题.现在,这一切已经在微软大牛们的设计框架中为你解决了.在.NET 中,一切类型都必须集成自 System.Object类型,因此我们可以很容易的获得对象的准确类型,方法是:GetType()方法.那么.NET中的类型转换,应该考虑的地方 有那些呢? 2. 概 念引入 类型转换包括显示 转换和隐式转换,在.N

编译原理第一章学习(习题解答)

编译原理 第一章 引论 1.1 练习 1.编译器和解释器之间的区别是什么? 首先,编译器是一个软件系统或者说是一个程序,解释器是语言处理器.其次,编译器是把程序翻译成能被计算机执行的形式并报告翻译过程中发现的源程序的错误,解释器是直接利用用户提供的输入执行源程序中指定的操作. 2.编译器相对于解释器的优点是什么?解释器相对于编译器的优点是什么? 在把用户输入映射成为输出的过程中,由一个编译器产生的机器语言目标程序通常比一个解释器快很多.然而,解释器的错误诊断效果比编译器更好,因为它是逐句翻译源程

Volley使用指南第一回(来自developer.android)

最近闲来想看看android网络方面的东西.google在2013年发布了一个叫做Volley的网络请求框架,我看了一下官网,居然在training里面就有教程.首先,英文的东西看着 还是挺不爽的,特此翻译一下,正好自己也学习一下, 可能最后有时间也会去研究一下它的源码是怎么写的.下面开始: 第一回:发送一个简单的请求 当你用Volley的时候,你的流程分为几步: 1.你会创建一个RequestQueue并且传给它一个Request对象. 2.之后这个RequestQueue就会组织一些工作线程