Maison > Article > développement back-end > Explication systématique de la technologie de mise en cache PHP
Cet article vous apporte des connaissances pertinentes sur PHP, qui présentent principalement le contenu pertinent de la technologie de mise en cache. La mise en cache est devenue un élément indispensable du projet et constitue le meilleur moyen d'améliorer les performances. Examinons-le ensemble, j'espère que cela vous aidera. tout le monde.
La mise en cache est devenue un élément essentiel du projet. C'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. La vitesse de chargement du projet devient plus rapide.
Le cache peut être un cache CPU, un cache mémoire, un cache disque dur. Les différentes vitesses de requête du cache sont également différentes (le cache CPU est meilleur que le cache mémoire que le cache disque dur).
Ensuite, je vous les présenterai un par un.
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 l'accès au serveur, accélérant la vitesse de chargement de. pages Web.
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秒
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 être mis en cache par les utilisateurs finaux Cache du navigateur
no-cache : Ne pas utiliser le cache local
no-store : Désactiver la mise en cache des données
La requête envoyée par l'utilisateur est envoyée au serveur, et le serveur détermine s'il doit utiliser le cache côté client.
Le code est le suivant :
$last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']); if (time() - $last_modify < 3600) { header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT'); header('HTTP/1.1 304'); //Not Modified exit; } header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');
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.
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 :
CDN (réseau de diffusion de contenu ) réseau de diffusion de contenu. 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.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. De manière générale, Redis peut être considéré comme une version étendue de Memcached, plus lourde et plus puissante. Redis est principalement utilisé dans le travail quotidien. Site Web d'apprentissage Redis : http://www.redis.cn/ Cache MongoDB
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。
旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB 学习网址:http://www.mongodb.org.cn
Apache缓存
利用 mod_expires ,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。
打开 http.conf,开启模块:
LoadModule expires_module modules/mod_expires.so
指定缓存的过期时间:
<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>
Nginx缓存
利用 expire 参数,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。
打开 nginx.conf :
//以图片为例: location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location root html; expires 1d; #指定缓存时间 }
大家也可以了解下:proxycachepath 和 proxy_cache,进行缓存的设置。
Opcode(Operate Code)操作码。
PHP程序运行完后,马上释放所有内存,所有程序中的变量都销毁,每次请求都要重新翻译、执行,导致速度可能会偏慢。
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码。
操作码 的目地是避免重复编译,减少CPU和内存开销。
APC(Alternative PHP Cache)可选 PHP 缓存。
APC 的目标是提供一个自由、 开放,和健全的框架,用于缓存、优化 PHP 中间代码。
APC 可以去掉 php 动态解析以及编译的时间,使php脚本可以执行的更快。
APC 扩展最后的发布时间为 2012-09-03。
感兴趣可以了解下,官方介绍:http://php.net/manual/zh/book.apc.php
eAccelerator:A PHP opcode cache。
感兴趣可以了解下,官方介绍:http://eaccelerator.net/
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 没有这种数据结构。
二、比如我们要存储用户信息,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); //查询某个属性
方案二 优于 方案一。
三、比如社交项目类似于新浪微博,个人中心的关注列表和粉丝列表,双向关注列表,还有热门微博,还有消息订阅 等等。
以上都用 Redis 提供的相关数据结构即可。
四、Memcached 只存储在内存中,而 Redis 既可以存储在内存中,也可以持久化到磁盘上。
如果需求中的数据需要持久化,请选择 Redis 。
个人在工作中没有用到 Memcached ,通过查询资料得到 Memcached 内存分配时优于 Redis。
Memcached 默认使用 Slab Allocation 机制管理内存,按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。
新增数据:先新增到数据库,再新增到缓存。
编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。
删除数据:先删除缓存数据,再删除数据库中数据。
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.
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 : https://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.
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 échoue, 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. 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!