En savoir plus sur la technologie de mise en cache en PHP

青灯夜游
Libérer: 2023-04-10 11:10:01
avant
6142 Les gens l'ont consulté

La mise en cache est devenue un élément essentiel du projet, et c'est le meilleur moyen d'améliorer les performances. L'article suivant vous amènera à en apprendre davantage sur la technologie de mise en cache en PHP.

En savoir plus sur la technologie de mise en cache en PHP

La mise en cache est le meilleur moyen d'améliorer les performances, comme la réduction des E/S réseau, la réduction des E/S disque, etc., ce qui accélère le chargement des projets.

Le cache peut être un cache CPU, un cache mémoire, un cache disque dur et différentes vitesses de requête de cache sont différentes (Cache CPU > Cache mémoire > Cache disque dur).

Ensuite, je vous les présenterai un par un.

Cache du navigateur

Le navigateur stocke la page demandée dans le cache client. Lorsque le visiteur visite à nouveau cette page, le navigateur peut lire les données directement à partir du cache client, réduisant ainsi la charge sur l'accès au serveur. le chargement des pages Web.

Strong Cache

Les requêtes envoyées par les utilisateurs sont obtenues directement à partir du cache client sans demander au serveur.

Déterminez si le cache fort est atteint en fonction de l'expiration et du contrôle du cache.

Le code est le suivant :

header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');
header("Cache-Control: max-age=3600"); //有效期3600秒
Copier après la connexion

Cache-Control Vous pouvez également définir les paramètres suivants :

  • public : peut être mis en cache par tous les utilisateurs (navigateur de l'utilisateur final/serveur CDN)
  • private : ne peut être mis en cache que par Cache du navigateur de l'utilisateur final
  • no-cache : ne pas utiliser le cache local
  • no-store : désactiver la mise en cache des données

Négocier le cache

Les requêtes envoyées par les utilisateurs sont envoyées au serveur, et le serveur détermine si pour utiliser le cache client.

Le code est le suivant :

$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;);
Copier après la connexion

L'impact du comportement des opérations de l'utilisateur sur le cache

En savoir plus sur la technologie de mise en cache en PHP

Cache de fichiers

Cache de fichiers de données

Cache les données avec une faible fréquence de mise à jour et une fréquence de lecture élevée dans les fichiers.

Par exemple, si les données de la ville sont utilisées pour une liaison à trois niveaux à plusieurs endroits du projet, nous pouvons mettre en cache les données de la ville dans un fichier (city_data.json), et JS peut lire directement ce fichier sans demander au back-end serveur.

Statique pour l'ensemble du site

CMS (système de gestion de contenu), peut-être que tout le monde le connaît, comme les premiers DEDE et PHPCMS. Le HTML statique peut être défini en arrière-plan lorsque les utilisateurs visitent le site Web. read est un HTML statique qui n'a pas besoin de demander à la base de données principale ou à Ajax de demander l'interface de données, ce qui accélère la vitesse de chargement du site Web.

Le HTML statique présente les avantages suivants :

  • Facile à l'inclusion dans les moteurs de recherche (SEO)
  • Ouverture rapide des pages
  • Réduit la charge du serveur

Cache CDN

Réseau de distribution de contenu CDN (Content Delivery Network).

Lorsque les utilisateurs visitent le site Web, le contenu du nœud CDN le plus proche est automatiquement sélectionné sans demander au serveur source, ce qui accélère l'ouverture du site Web.

Le cache comprend principalement des ressources statiques telles que HTML, images, CSS, JS, XML, etc.

NoSQL Cache

Memcached Cache

Memcached est un serveur de cache mémoire distribué hautes performances.

L'objectif général de l'utilisation est d'augmenter la vitesse et l'évolutivité des applications Web dynamiques en mettant en cache les résultats des requêtes de base de données et en réduisant le nombre d'accès à la base de données.

Il peut également être utilisé pour stocker des données dans divers formats, notamment des images, des vidéos, des fichiers, etc.

Memcached ne prend en charge que les données de type K/V et ne prend pas en charge le stockage persistant.

La différence entre Memcache et Memcached

  • Memcached à partir de 0.2.0 nécessite la version PHP >=5.2.0, Memcache nécessite la version PHP >=4.3.
  • Memcached a été publié pour la dernière fois le 24/12/2018 et Memcache a été publié pour la dernière fois le 07/04/2013.
  • Memcached est basé sur libmemcached et Memcache est basé sur l'extension PECL.

Vous pouvez considérer Memcached comme une version améliorée de Memcache.

Manuel d'utilisation PHP Memcached :

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

Memcached est souvent comparé à Redis. Ensuite, nous présenterons le cache Redis.

Redis Cache

Redis est une base de données K/V hautes performances.

Redis compense largement les lacunes du stockage Memcached K/V, telles que List (liste liée), Set (set), Zset (ensemble ordonné), Hash (hash), qui peut stocker des données en mémoire ou les données peuvent être conservées. sur le disque et prend en charge la synchronisation maître-esclave.

En général, Redis peut être considéré comme une version étendue de Memcached, plus lourde et plus puissante.

Redis est principalement utilisé dans le travail quotidien.

MongoDB Cache

MongoDB est une base de données basée sur le stockage de fichiers distribués. Écrit en langage C++.

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

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

WEB服务器缓存

Apache缓存

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

打开 http.conf,开启模块:

LoadModule expires_module modules/mod_expires.so
Copier après la connexion

指定缓存的过期时间:

<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>
Copier après la connexion

Nginx缓存

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

打开 nginx.conf

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

大家也可以了解下:proxy_cache_path 和 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);
Copier après la connexion

Memcached 没有这种数据结构。

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

方案一:key => value

key = user_data_用户ID

value = json_encode(用户数据)

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

方案二:hash

key = user_data_用户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); //查询某个属性
Copier après la connexion

方案二 优于 方案一。

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

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

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

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

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

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

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

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

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

Supprimer les données : supprimez d'abord les données du cache, puis supprimez les données de la base de données.

Requête de données : interrogez d'abord les données du cache, s'il n'y en a pas, puis interrogez la base de données, puis ajoutez-la au cache.

Une cohérence forte est difficile à garantir, comme la cohérence des transactions, la cohérence à un moment donné, la cohérence éventuelle, etc.

Analysons des problèmes spécifiques en détail.

Que faire en cas de pénétration du cache ?

L'utilisateur demande des données qui n'existent pas dans le cache, ce qui fait que la requête tombe directement sur la base de données.

1. Définissez une valeur de clé normale et vérifiez d'abord si la clé est conforme à la spécification.

2. Pour la limitation du courant d'interface, le déclassement et le disjoncteur, veuillez étudier istio : istio.io/

3.

4. Définissez un cache vide et un délai d'expiration pour les valeurs de clé inexistantes. Si la couche de stockage crée des données, mettez à jour le cache en temps opportun.

Que faire en cas d'avalanche ?

1. Le verrouillage Mutex, autorise une seule requête pour reconstruire l'index, les autres requêtes attendent que la reconstruction du cache soit terminée et ré-obtiennent les données du cache.

2. Stratégie de double cache, cache d'origine et cache de copie Lorsque le cache d'origine expire et qu'un cache de copie est demandé, le délai d'expiration du cache d'origine est défini sur court terme et le cache de copie est défini sur long terme.

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:zhihu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal