Rumah > pembangunan bahagian belakang > tutorial php > Penjelasan sistematik teknologi caching PHP

Penjelasan sistematik teknologi caching PHP

Lepaskan: 2023-04-11 09:32:01
ke hadapan
4252 orang telah melayarinya

Artikel ini membawakan anda pengetahuan yang berkaitan tentang PHP, yang terutamanya memperkenalkan kandungan teknologi caching yang berkaitan telah menjadi bahagian penting dalam projek dan merupakan cara terbaik untuk meningkatkan prestasi Mari kita lakukannya bersama-sama membantu semua orang.

Penjelasan sistematik teknologi caching PHP

Ikhtisar

Penjelasan sistematik teknologi caching PHP

Caching telah menjadi bahagian penting dalam projek, ia merupakan faktor penting dalam meningkatkan Kaedah prestasi terbaik, seperti mengurangkan I/O rangkaian, mengurangkan I/O cakera, dsb., menjadikan beban projek lebih cepat.

Cache boleh berupa cache CPU, cache memori atau cache cakera keras Cache yang berbeza mempunyai kelajuan pertanyaan yang berbeza (cache CPU lebih baik daripada cache memori daripada cache cakera keras).

Seterusnya, saya akan memperkenalkan mereka kepada anda satu persatu.

Cache Penyemak Imbas

Pelayar menyimpan halaman yang diminta dalam cache pelanggan Apabila pelawat melawat halaman itu sekali lagi, penyemak imbas boleh membacanya terus daripada data pelanggan, mengurangkan akses kepada pelayan dan mempercepatkan pemuatan halaman web.

Cache Kuat

Permintaan yang dihantar oleh pengguna diperoleh terus daripada cache pelanggan tanpa meminta pelayan.

Tentukan sama ada cache yang kuat dipukul berdasarkan Tamat Tempoh dan Kawalan Cache.

Kod adalah seperti berikut:

header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');
header("Cache-Control: max-age=3600"); //有效期3600秒
Salin selepas log masuk

Cache-Control juga boleh menetapkan parameter berikut:

  • awam: boleh dicache oleh semua pengguna (pelayar pengguna akhir/pelayan CDN)

  • peribadi: hanya boleh dicache oleh penyemak imbas pengguna akhir

  • tiada cache: tidak gunakan cache tempatan

  • tiada kedai: Lumpuhkan cache data

Rundingkan cache

Permintaan yang dihantar oleh pengguna, dihantar kepada pelayan, oleh pelayan Tentukan sama ada hendak menggunakan caching sebelah klien.

Kod tersebut adalah seperti berikut:

$last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
if (time() - $last_modify < 3600) {
   header(&#39;Last-Modified: &#39;. gmdate(&#39;D, d M Y H:i:s&#39;, $last_modify).&#39; GMT&#39;);
   header(&#39;HTTP/1.1 304&#39;); //Not Modified
   exit;
}
header(&#39;Last-Modified: &#39;. gmdate(&#39;D, d M Y H:i:s&#39;).&#39; GMT&#39;);
Salin selepas log masuk

Kesan tingkah laku operasi pengguna pada cache

Penjelasan sistematik teknologi caching PHP

Caching fail

Cache fail data

Cache data dengan kekerapan kemas kini rendah dan kekerapan bacaan tinggi ke dalam fail.

Sebagai contoh, jika data bandar digunakan untuk pautan tiga peringkat di berbilang tempat dalam projek, kami boleh cache data bandar ke dalam fail (city_data.json) dan JS boleh terus membaca fail ini tanpa meminta bahagian belakang.

Statik di seluruh tapak

CMS (sistem pengurusan kandungan), mungkin semua orang sudah biasa dengannya, seperti DEDE awal, PHPCMS dan HTML statik boleh ditetapkan dalam latar belakang. Apabila pengguna mengakses laman web, semua yang mereka baca adalah HTML statik Tidak perlu meminta pangkalan data belakang atau antara muka data permintaan Ajax, yang mempercepatkan kelajuan pemuatan laman web.

HTML statik mempunyai kelebihan berikut:

  • Adalah berfaedah untuk kemasukan enjin carian (SEO)

  • Halaman dibuka cepat

  • Kurangkan beban pelayan

Cache CDN

Pengedaran kandungan CDN (Content Delivery Network) rangkaian.

Apabila pengguna melawati tapak web, kandungan nod CDN terdekat dipilih secara automatik tanpa meminta pelayan sumber, yang mempercepatkan pembukaan tapak web.

Cache terutamanya termasuk sumber statik seperti HTML, imej, CSS, JS dan XML.

NoSQL Cache

Memcached Cache

Memcached ialah pelayan cache memori teragih berprestasi tinggi.

Tujuan umum penggunaan adalah untuk meningkatkan kelajuan dan kebolehskalaan aplikasi web dinamik dengan menyimpan cache hasil pertanyaan pangkalan data dan mengurangkan bilangan akses pangkalan data.

Ia juga boleh digunakan untuk menyimpan data dalam pelbagai format, termasuk imej, video, fail, dsb.

Memcached hanya menyokong data jenis K/V dan tidak menyokong storan berterusan.

Perbezaan antara Memcache dan Memcached

Memcached bermula dari 0.2.0 memerlukan versi PHP >=5.2.0, Memcache memerlukan versi PHP >=4.3.

Memcached kali terakhir dikeluarkan pada 2018-12-24, dan Memcache kali terakhir dikeluarkan pada 2013-04-07.

Memcached adalah berdasarkan libmemcached, dan Memcache adalah berdasarkan sambungan PECL.

Fikirkan Memcached sebagai versi Memcache yang dinaik taraf.

Manual Pengguna PHP Memcached:

http://www.php.net/manual/zh/book.memcached.php

Memcached sering dibandingkan dengan Redis , Seterusnya , kami akan memperkenalkan cache Redis.

Redis Cache

Redis ialah pangkalan data K/V berprestasi tinggi.

Redis sebahagian besarnya mengimbangi kekurangan storan Memcached K/V, seperti Senarai (senarai terpaut), Set (set), Zset (set tersusun), Hash (cincang), yang boleh menyimpan data dalam Dalam ingatan , data juga boleh disimpan ke cakera, menyokong penyegerakan tuan-hamba.

Secara umum, Redis boleh dianggap sebagai versi lanjutan Memcached, lebih berat dan lebih berkuasa.

Redis kebanyakannya digunakan dalam kerja harian.

Tapak web pembelajaran Redis: http://www.redis.cn/

Cache MongoDB

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。

旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 学习网址:http://www.mongodb.org.cn

WEB服务器缓存

Apache缓存

利用 mod_expires ,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。

打开 http.conf,开启模块:

LoadModule expires_module modules/mod_expires.so
Salin selepas log masuk

指定缓存的过期时间:

<IfModule expires_module>
    #打开缓存
    ExpiresActive on
    #css缓存(8640000秒=10天)
    ExpiresByType text/css A8640000
    #js缓存
    ExpiresByType application/x-javascript A8640000
    ExpiresByType application/javascript A8640000
    #html缓存
    ExpiresByType text/html A8640000
    #图片缓存
    ExpiresByType image/jpeg A8640000
    ExpiresByType image/gif A8640000
    ExpiresByType image/png A8640000
    ExpiresByType image/x-icon A8640000
</IfModule>
Salin selepas log masuk

Nginx缓存

利用 expire 参数,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。

打开 nginx.conf :

//以图片为例:
location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location
   root html;
   expires 1d; #指定缓存时间
}
Salin selepas log masuk

大家也可以了解下:proxycachepath 和 proxy_cache,进行缓存的设置。

Opcode缓存

Opcode(Operate Code)操作码。

PHP程序运行完后,马上释放所有内存,所有程序中的变量都销毁,每次请求都要重新翻译、执行,导致速度可能会偏慢。

当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码。

操作码 的目地是避免重复编译,减少CPU和内存开销。

APC缓存

APC(Alternative PHP Cache)可选 PHP 缓存。

APC 的目标是提供一个自由、 开放,和健全的框架,用于缓存、优化 PHP 中间代码。

APC 可以去掉 php 动态解析以及编译的时间,使php脚本可以执行的更快。

APC 扩展最后的发布时间为 2012-09-03。

感兴趣可以了解下,官方介绍:http://php.net/manual/zh/book.apc.php

eAccelerator

eAccelerator:A PHP opcode cache。

感兴趣可以了解下,官方介绍:http://eaccelerator.net/

XCache

XCache 是一个又快又稳定的 PHP opcode 缓存器。

感兴趣可以了解下,官方介绍:http://xcache.lighttpd.net/

小结

文章主要简单的介绍了 浏览器缓存、文件缓存、NoSQL缓存、WEB服务器缓存、Opcode缓存。

每一种缓存都可以深入研究,从介绍 -> 安装 -> 使用 -> 总结应用场景。

大家可以思考下,通过上面的介绍,工作中我们使用了哪些缓存?

还可以再使用哪些缓存,可以对我们的项目有帮助?

关于缓存的常见问题

用过缓存,大家肯定遇到过比较头痛的问题,比如数据一致性,雪崩,热点数据缓存,缓存监控等等。

给大家列出几个问题,纯属抛转引玉。

当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么?

举一些场景:

一、比如实现一个简单的日志收集功能或发送大量短信、邮件的功能,实现方式是先将数据收集到队列中,然后有一个定时任务去消耗队列,处理该做的事情。

直接使用 Redis 的 lpush,rpop 或 rpush,lpop。

//进队列
$redis->lpush(key, value);
//出队列
$redis->rpop(key);
Memcached 没有这种数据结构。
Salin selepas log masuk

二、比如我们要存储用户信息,ID、姓名、电话、年龄、身高 ,怎么存储?

方案一:key => value

key = userdata用户ID

value = json_encode(用户数据)

查询时,先取出key,然后进行json_decode解析。

方案二:hash

key = userdata用户ID

hashKey = 姓名,value = xx

hashKey = 电话,value = xx

hashKey = 年龄,value = xx

hashKey = 身高,value = xx

查询时,取出key即可。

//新增
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
//编辑
$redis->hSet(key, hashKey, value);
//查询
$redis->hGetAll(key); //查询所有属性
$redis->hGet(key, hashKey); //查询某个属性
Salin selepas log masuk

方案二 优于 方案一。

三、比如社交项目类似于新浪微博,个人中心的关注列表和粉丝列表,双向关注列表,还有热门微博,还有消息订阅 等等。

以上都用 Redis 提供的相关数据结构即可。

四、Memcached 只存储在内存中,而 Redis 既可以存储在内存中,也可以持久化到磁盘上。

如果需求中的数据需要持久化,请选择 Redis 。

个人在工作中没有用到 Memcached ,通过查询资料得到 Memcached 内存分配时优于 Redis。

Memcached 默认使用 Slab Allocation 机制管理内存,按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。

如何保证,缓存与数据库的数据一致性?

新增数据:先新增到数据库,再新增到缓存。

编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。

删除数据:先删除缓存数据,再删除数据库中数据。

Data pertanyaan: Mula-mula tanya data cache, jika tiada, kemudian tanya pangkalan data, dan kemudian tambahkannya pada cache.

Konsistensi yang kukuh sukar untuk dijamin, seperti konsistensi transaksi, konsistensi titik-dalam-masa, konsistensi akhir, dsb.

Mari kita analisa isu khusus secara terperinci.

Apa yang perlu dilakukan mengenai penembusan cache?

Pengguna meminta data yang tidak wujud dalam cache, menyebabkan permintaan itu jatuh terus pada pangkalan data.

1 Tetapkan nilai Kunci biasa dan sahkan dahulu sama ada Kunci mematuhi spesifikasi.

2. Mengehadkan arus antara muka, menurunkan taraf dan pemutus litar, sila kaji istio: https://istio.io/

3.

4. Tetapkan cache kosong dan masa tamat tempoh untuk nilai kunci yang tidak wujud Jika lapisan storan mencipta data, kemas kini cache dengan tepat pada masanya.

Apa yang perlu dilakukan dengan runtuhan salji?

1. Mutex lock, hanya satu permintaan dibenarkan untuk membina semula indeks.

Penjelasan sistematik teknologi caching PHP

2. Strategi cache berganda, cache asal dan cache salinan Apabila cache asal tamat tempoh dan cache salinan diminta, masa tamat tempoh cache asal ditetapkan kepada jangka pendek dan cache salinan ditetapkan kepada jangka panjang.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Penjelasan sistematik teknologi caching PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
sumber:新亮笔记微信公众号
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan