キャッシュはプロジェクトにとって不可欠な部分となっており、パフォーマンスを向上させる最善の方法です。次の記事では、PHP のキャッシュ テクノロジについて詳しく説明します。
キャッシュは、ネットワーク I/O の削減、ディスク I/O の削減など、プロジェクトの読み込みを高速化するなど、パフォーマンスを向上させるための最良の方法です。
キャッシュには CPU キャッシュ、メモリ キャッシュ、ハードディスク キャッシュがあり、キャッシュが異なればクエリ速度も異なります (CPU キャッシュ > メモリ キャッシュ > ハードディスク キャッシュ)。
次は一つずつ紹介していきます。
ブラウザは、要求されたページをクライアント キャッシュに保存します。訪問者がこのページに再度アクセスすると、ブラウザは、ページからデータを読み取ることで直接アクセスできます。クライアント キャッシュにより、サーバーへのアクセスが軽減され、Web ページの読み込みが高速化されます。
ユーザーが送信したリクエストは、サーバーにリクエストせずにクライアント キャッシュから直接取得されます。
Expires と Cache-Control に基づいて、強力なキャッシュがヒットするかどうかを判断します。
コードは次のとおりです:
header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT'); header("Cache-Control: max-age=3600"); //有效期3600秒
Cache-Control 次のパラメータも設定できます:
ユーザーが送信したリクエストはサーバーに送信され、サーバーはクライアント キャッシュを使用するかどうかを決定します。
コードは次のとおりです:
$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');
たとえば、プロジェクト内の複数の場所で都市データが 3 レベルの連携に使用されている場合、都市データをファイル (city_data.json) にキャッシュすることができ、JS はリクエストせずにこのファイルを直接読み取ることができます。バックエンドサーバー。
サイト全体で静的静的 HTML には次の利点があります。
検索エンジンの組み込み (SEO) に役立ちますユーザーが Web サイトにアクセスすると、ソース サーバーに要求することなく、最も近い CDN ノードのコンテンツが自動的に選択されるため、Web サイトを開く時間が短縮されます。
キャッシュには主に、HTML、画像、CSS、JS、XML などの静的リソースが含まれます。
NoSQL Cache使用の一般的な目的は、データベース クエリ結果をキャッシュすることでデータベース アクセスの数を減らし、動的 Web アプリケーションの速度とスケーラビリティを向上させることです。
画像、ビデオ、ファイルなど、さまざまな形式でデータを保存するために使用することもできます。
Memcached は K/V タイプのデータのみをサポートし、永続ストレージはサポートしません。
Memcache と Memcached の違い0.2.0 以降の Memcached には PHP バージョン >= 5.2.0 が必要で、Memcache には PHP バージョン >= 4.3 が必要です。
http://www.php.net/manual/zh/book.memcached.php
# # Memcached は Redis とよく比較されますが、次に Redis キャッシュについて紹介します。
Redis キャッシュ
MongoDB キャッシュ
旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
利用 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>
利用 expire
参数,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。
打开 nginx.conf
:
//以图片为例: location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location root html; expires 1d; #指定缓存时间 }
大家也可以了解下:proxy_cache_path 和 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 的 lpush,rpop 或 rpush,lpop。
//进队列 $redis->lpush(key, value); //出队列 $redis->rpop(key);
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); //查询某个属性
方案二 优于 方案一。
三、比如社交项目类似于新浪微博,个人中心的关注列表和粉丝列表,双向关注列表,还有热门微博,还有消息订阅 等等。
以上都用 Redis 提供的相关数据结构即可。
四、Memcached 只存储在内存中,而 Redis 既可以存储在内存中,也可以持久化到磁盘上。
如果需求中的数据需要持久化,请选择 Redis 。
个人在工作中没有用到 Memcached ,通过查询资料得到 Memcached 内存分配时优于 Redis。
Memcached 默认使用 Slab Allocation 机制管理内存,按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。
新增数据:先新增到数据库,再新增到缓存。
编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。
データの削除: まずキャッシュされたデータを削除し、次にデータベース内のデータを削除します。
データのクエリ: まずキャッシュ データをクエリし、データがない場合はデータベースにクエリを実行して、それをキャッシュに追加します。
トランザクションの一貫性、ポイントインタイムの一貫性、最終的な一貫性など、強い一貫性を保証するのは困難です。
特定の問題を詳しく分析してみましょう。
ユーザーがキャッシュに存在しないデータをリクエストしたため、リクエストはデータベースに直接送信されます。
1. 通常の Key 値を設定し、まずその Key が仕様に準拠しているかどうかを確認します。
2. インターフェイスの電流制限、ダウングレード、サーキット ブレーカーについては、istio をご覧ください: https://istio.io/
3. ブルームフィルター。
4. 空のキャッシュと存在しないキー値の有効期限を設定します。ストレージ レイヤーがデータを作成する場合は、適時にキャッシュを更新します。
1. ミューテックス ロック、インデックスの再構築は 1 つのリクエストのみ許可されます。他のリクエストはキャッシュの再構築が完了するまで待機し、キャッシュからデータを再取得します。
2. オリジナル キャッシュとコピー キャッシュのダブル キャッシュ戦略。オリジナル キャッシュが失敗してコピー キャッシュを要求すると、オリジナル キャッシュの有効期限は短期に設定され、コピー キャッシュは長期に設定されます。 。
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHP のキャッシュ テクノロジの詳細については、こちらをご覧ください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。