1. نظرة عامة في تطبيقات الويب، قد يستغرق إنشاء بعض التقارير وقتًا طويلاً لحساب قاعدة البيانات؛ وتوفر بعض مواقع الويب معلومات عن الطقس، الأمر الذي يتطلب الوصول إلى خادم بعيد لإجراء اتصال SOAP للحصول على معلومات درجة الحرارة. كل هذه أمثلة على المعلومات المعقدة. قد تؤدي إضافة الكثير من المعلومات المعقدة إلى صفحة ويب إلى زيادة التحميل على خادم الويب وخادم قاعدة البيانات. يمنح التخزين المؤقت لكتلة كود JSP للمطورين حرية إضافة جميع أنواع المعلومات المعقدة حسب الرغبة.
يمكن لـ JSP تغليف وتشغيل تعليمات برمجية Java معقدة في مكتبة العلامات، مما يسهل صيانة ملفات صفحات JSP ويجعلها أكثر ملاءمة للمطورين غير المحترفين لاستخدام ملفات صفحات JSP. يوجد بالفعل العديد من مكتبات العلامات، والتي تكون إما منتجات تجارية أو منتجات مفتوحة المصدر. لكن معظم هذه المنتجات تستخدم فقط مكتبات العلامات لتنفيذ الوظائف التي يمكن تنفيذها باستخدام برنامج Java Scriptlet البسيط. يستخدم عدد قليل من المنتجات العلامات المخصصة بطريقة إبداعية، مما يوفر نفس الوظيفة تقريبًا قبل ظهور مكتبات العلامات المخصصة لـ JSP.
تعد مكتبة علامات OSCache، التي صممتها OpenSymphony، تطبيقًا رائدًا لعلامات JSP المخصصة يوفر تخزينًا مؤقتًا سريعًا للذاكرة داخل صفحات JSP الموجودة. على الرغم من وجود عدد قليل من البائعين الذين يقدمون منتجات التخزين المؤقت بأشكال مختلفة، إلا أنهم جميعًا منتجات خاصة بالبائعين. يمكن تشغيل OSCache على أي خادم متوافق مع JSP 1.1، ويمكنه تخزين كتل تعليمات JSP الموجودة مؤقتًا ليس فقط لجميع المستخدمين، ولكن أيضًا على أساس كل مستخدم. يتضمن OSCache أيضًا بعض الميزات المتقدمة لتحسين قابلية التوسع، مثل التخزين المؤقت على القرص، ومسح المخزن المؤقت القابل للبرمجة، والتحكم في الاستثناءات، وما إلى ذلك. بالإضافة إلى ذلك، مثل منتجات OpenSymphony الأخرى، يتم توزيع كود OSCache مجانًا بموجب ترخيص مفتوح المصدر.
تأخذ هذه المقالة عملية تصميم موقع مزاد وهمي كمثال لتقديم عملية عمل OSCache. سيحتوي موقع الويب الافتراضي هذا على:
1: صفحة إدارية تعرض أنشطة المزاد الأخيرة؛
2: صفحة رئيسية تحتوي على وظائف كاملة ومعلومات ترويجية متنوعة؛
3: شريط تنقل خاص يحتوي على جميع معلومات المزاد الخاصة بالمستخدم والتي لم تكتمل بعد.
2. صفحة الإدارة
يحتوي موقع المزاد على تقرير الإدارة، ويستغرق خادم قاعدة البيانات عدة ثوانٍ لإنشاء مثل هذا التقرير. من المهم أن يستغرق إنشاء التقرير وقتًا طويلاً، لأنه قد يكون لدينا العديد من المسؤولين الذين يراقبون تشغيل النظام، ونريد تجنب إعادة إنشاء التقرير في كل مرة يقوم فيها المسؤول بزيارة الموقع. ولتحقيق ذلك، سنقوم بتغليف الصفحة بأكملها في علامة مخزن مؤقت على مستوى التطبيق يتم تحديثها كل ساعة. تتمتع بعض المنتجات من البائعين الآخرين بوظائف مماثلة، لكن OSCache يقوم بها بشكل أفضل منهم.
ومن أجل التبسيط، لن نركز كثيرًا على مشكلات التنسيق. عند كتابة صفحة الإدارة، نضيف أولاً إعلان مكتبة العلامات إلى الصفحة:
<%@ taglib uri="cachetags" prefix="cache" %>
بعد ذلك يتعين علينا إحاطة الصفحة بأكملها بعلامات ذاكرة التخزين المؤقت. وقت التخزين المؤقت الافتراضي لعلامات التخزين المؤقت هو ساعة واحدة.
<cache:cache> .... تقارير الإدارة المعقدة.... </cache:cache>
صفحة الإدارة مخزنة مؤقتًا الآن. إذا قام المسؤول بالوصول إلى نفس الصفحة مرة أخرى خلال ساعة بعد إنشاء الصفحة، فسوف يرى الصفحة المخزنة مؤقتًا مسبقًا، وليست هناك حاجة إلى أن يقوم خادم قاعدة البيانات بإنشاء هذا التقرير مرة أخرى.
3. الصفحة الرئيسية تعرض الصفحة الرئيسية لموقع المزاد أنشطة الموقع وتروج للمزادات التي على وشك الانتهاء. نريد عرض عدد المزادات الجارية، وعدد المستخدمين المسجلين حاليًا، وقائمة المزادات التي من المقرر أن تنتهي في المستقبل القريب، والوقت الحالي. تحتوي هذه الرسائل على متطلبات دقة زمنية مختلفة. تستمر المزادات على الموقع الإلكتروني عادةً لعدة أيام، لذا يمكننا ضبط الوقت لتقليل عدد المزادات الصالحة إلى 6 ساعات. من الواضح أن عدد المستخدمين سيتغير بشكل متكرر، ولكن هنا سنقوم بتخزين هذه القيمة لمدة 15 دقيقة في المرة الواحدة. وأخيرًا، نريد أن يكون الوقت الحالي المعروض على الصفحة دائمًا هو الوقت المحدد للوصول إلى الصفحة.
بعد الإعلان عن مكتبة العلامات في الصفحة الرئيسية، نقوم أولاً بإخراج التاريخ الحالي مباشرة دون تخزين مؤقت:
الآن هو: <%=new java.util.Date()%>
بعد ذلك، نريد عرض قائمة بتلك التي ستقام مزادات تنتهي على المدى القصير:
<cache:cache> <ul> <% // إنشاء مكرر يحتوي على مزادات حديثة Iterator Auctions = .... while (auctions.hasMore()) { Auction Auction = (Auction) Auctions.next (); %><li><%=auction%></li%< } %> </ul> </cache:cache>
وأخيرًا، نريد عرض عدد المزادات الجارية، ويجب أن تكون هذه الأرقام مخزنة لمدة 6 ساعات. نظرًا لأن وضع علامة على ذاكرة التخزين المؤقت يتطلب عدد الثواني لتخزين البيانات مؤقتًا، فإننا نقوم بتحويل 6 ساعات إلى 21600 ثانية:
<cache:cache time="21600"> <% // الاستعلام عن قاعدة البيانات للحصول على العدد الإجمالي لأنشطة المزاد int AuctionCount = .. .. %> هناك <%=auctionCount%> مزادات جارية على هذا الموقع </cache>
كما ترون، نحن نستخدم فقط كمية صغيرة من التعليمات البرمجية لإنشاء صفحة رئيسية بنظام تخزين مؤقت معقد. يقوم نظام التخزين المؤقت هذا بتخزين كل جزء من الصفحة مؤقتًا بشكل منفصل، ويتوافق وقت التخزين المؤقت لكل جزء تمامًا مع تكرار التغييرات في المعلومات الخاصة به. بفضل التخزين المؤقت، يمكننا الآن وضع المزيد من المحتوى على الصفحة الرئيسية؛ دون التخزين المؤقت من قبل، سيؤدي وضع الكثير من المحتوى على الصفحة الرئيسية إلى إبطاء الوصول إلى الصفحة، وقد يسبب مشاكل لخادم قاعدة البيانات.
4. شريط التنقل لنفترض أنه عند التخطيط لموقع الويب، قررنا عرض محتوى عربة التسوق أسفل شريط التنقل الأيسر. سنعرض عدد عروض الأسعار والسعر الحالي لكل عنصر في المزاد بواسطة المستخدم، بالإضافة إلى قائمة بجميع العناصر التي حصل المستخدم الحالي على أعلى عرض لها.
نحن نستخدم إمكانات التخزين المؤقت على مستوى الجلسة لإنشاء الوظيفة المذكورة أعلاه في شريط التنقل. ضع الكود التالي في القالب أو قم بتضمين ملف حتى تتمكن الصفحات الأخرى في موقع الويب من الرجوع إلى شريط التنقل هذا
: معلومات العطاء الحالي%> </cache:cache>
نقدم هنا سمتين مهمتين، وهما المفتاح والنطاق. في التعليمات البرمجية السابقة في هذه المقالة، نظرًا لأن علامة ذاكرة التخزين المؤقت يمكنها تلقائيًا إنشاء مفتاح فريد لكتلة التعليمات البرمجية، فلا نحتاج إلى تعيين سمة المفتاح هذه يدويًا. ولكننا نريد هنا الرجوع إلى كتلة التعليمات البرمجية المخزنة مؤقتًا هذه من بقية الموقع، لذلك نحدد بوضوح السمة الرئيسية لعلامة ذاكرة التخزين المؤقت. ثانيًا، يتم استخدام سمة النطاق لإخبار ذاكرة التخزين المؤقت بوضع علامة على أن كتلة التعليمات البرمجية الحالية يجب أن يتم تخزينها مؤقتًا على أساس كل مستخدم، بدلاً من التخزين المؤقت مرة واحدة لجميع المستخدمين.
يجب أن تكون حذرًا جدًا عند استخدام التخزين المؤقت على مستوى الجلسة، ويجب أن يكون الأمر واضحًا: على الرغم من أنه يمكننا إنشاء شريط تنقل معقد يقلل من تحميل الخادم بمقدار 5x أو 10x، إلا أنه سيزيد بشكل كبير من مساحة الذاكرة المطلوبة لكل جلسة. مما لا شك فيه أنه من المثالي زيادة عدد المستخدمين المتزامنين المحتملين من حيث قدرات وحدة المعالجة المركزية، ولكن بمجرد تقليل عدد المستخدمين المتزامنين إلى الحد الأقصى لوحدة المعالجة المركزية من حيث قدرات دعم الذاكرة، لم يعد هذا الحل مثاليًا.
كما ذكرنا سابقًا في هذه المقالة، نريد الرجوع إلى مجموعة التعليمات البرمجية المخزنة مؤقتًا من بقية الموقع. وذلك لأنه عندما يقوم مستخدم بإضافة عنصر للمزاد، أو تقديم عروض أسعار لعناصر تم بيعها بالمزاد بواسطة مستخدمين آخرين، فإننا نريد تحديث المخزن المؤقت بحيث يحتوي شريط التنقل على أحدث محتوى في المرة التالية التي تتم قراءته فيها. على الرغم من أن هذه البيانات قد تتغير بسبب نشاط مستخدمين آخرين، فقد يكون من المربك جدًا للمستخدم أن يرى أن قائمته تظل دون تغيير بعد تنفيذ إجراء ما على الموقع.
يمكن لعلامة التدفق التي توفرها مكتبة OSCache تحديث محتوى المخزن المؤقت. يمكننا إضافة الكود التالي إلى الصفحة التي تتعامل مع إجراءات المستخدم التي قد تؤثر على هذه المنطقة:
<cache:flush key="navbar"scope="session" />
عندما يصل المستخدم إليها في المرة القادمة، سيتم تحديث كتلة المخزن المؤقت لشريط التنقل .
حتى الآن، تم الانتهاء من إنشاء نموذج موقع الويب الخاص بنا ويمكن البدء في تشغيله. دعونا نلقي نظرة على إمكانيات معالجة الاستثناءات في OSCache. حتى إذا تم إبطال المحتوى المخزن مؤقتًا، مثل حدوث استثناء Java داخل كتلة المخزن المؤقت، فإن مكتبة علامات OSCache لا تزال تسمح لنا بعرض المحتوى برمجيًا. باستخدام ميزة التحكم في الاستثناءات هذه، يمكننا قطع الاتصال بين خادم قاعدة البيانات وخادم الويب، وسيظل موقع الويب قادرًا على الاستمرار في التشغيل. قدمت مواصفات JSP 1.2 واجهة TryCatchFinally، التي تسمح للعلامة نفسها باكتشاف استثناءات Java والتعامل معها. لذلك، يمكن دمج العلامات مع كود معالجة الاستثناء هذا لجعل صفحات JSP أكثر بساطة وتنظيمًا.
يخطط OpenSymphony لتنفيذ آليات تخزين مؤقت إضافية بالإضافة إلى نظام رئيسي أكثر قابلية للإدارة والذي سيسمح لنا بإدارة ذاكرة الوصول العشوائي (RAM) ومساحة القرص المستخدمة بواسطة التخزين المؤقت. وبمجرد توفر هذه الميزات، سنكون قادرين على تحسين استجابة وموثوقية الموقع.
مثال للاستخدام:
معالج تكوين ملف oscache.properties،
ذاكرة التخزين
المؤقت
القيمة صحيحة أو خاطئة والقيمة الافتراضية هي التخزين المؤقت في الذاكرة.
إذا تم التعيين على خطأ، فلا يمكن تخزين ذاكرة التخزين المؤقت إلا في قاعدة البيانات أو القرص الصلب، فما فائدة ذاكرة التخزين
المؤقت
:)
عدد عناصر ذاكرة التخزين المؤقت
Cache.persistence.class
فئة ذاكرة التخزين المؤقت المستمرة، إذا تم تشغيل هذه الفئة، فيجب عليك تعيين
ذاكرة التخزين المؤقت لمعلومات المسار. مجموعة ذاكرة التخزين المؤقت المتعلقة بمعلومات إعداد المجموعة.
يحب
Cache.cluster.multicast.ip هو عنوان IP للبث
Cache.cluster.properties هي خصائص الكتلة
3. الاستخدام الأساسي لـ OSCache
Cache1.jsp هو كما يلي
<%@ page import="java.util.*" %>
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>
لا يوجد تاريخ مخبأ: <%= new Date() %><p>
<!--التحديث التلقائي-->
<ذاكرة التخزين المؤقت: وقت ذاكرة التخزين المؤقت = "30">
قم بتحديث التاريخ المخزن مؤقتًا كل 30 ثانية: <%= new Date() %>
</ذاكرة التخزين المؤقت: ذاكرة التخزين المؤقت>
<!--التحديث اليدوي-->
<cache:cache key="testcache">
قم بتحديث التاريخ المخزن مؤقتًا يدويًا: <%= new Date() %> <p>
</ذاكرة التخزين المؤقت: ذاكرة التخزين المؤقت>
<a href="/cache2.jsp">التحديث اليدوي</a>
</body>
</html>
يقوم Cache2.jsp بالتحديث اليدوي للصفحة كما يلي
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>
تم مسح ذاكرة التخزين المؤقت...<p>
<cache:flush key="testcache"scope="application"/>
<a href="/cache1.jsp">إرجاع</a>
</body>
</html>
يمكنك أيضًا تحديد النطاق الفعال لذاكرة التخزين المؤقت من خلال العبارة التالية. إذا لم تقم بتعريف النطاق، فسيتم تعيين النطاق بشكل افتراضي على Applcation.
<ذاكرة التخزين المؤقت: وقت ذاكرة التخزين المؤقت = "30" نطاق = "جلسة">
...
</cache:cache>
4. مرشح ذاكرة التخزين المؤقت CacheFilter
يمكنك تحديد مرشح ذاكرة التخزين المؤقت في web.xml لتحديد ذاكرة التخزين المؤقت لموارد معينة.
1 <مرشح>
2 < عامل التصفية - الاسم > مرشح ذاكرة التخزين المؤقت </ عامل التصفية - الاسم >
3 < مرشح - فئة > com.opensymphony.oscache.web.filter.CacheFilter </ مرشح - فئة >
4 <الحرف الأول>
5 <param-name>الوقت</param-name>
6 < بارام - القيمة > 60 </ بارام - القيمة >
7 </init-param>
8 <البداية-المعامل>
9 <param-name>النطاق</param-name>
10 <param-value>جلسة</param-value>
11 </init-param>
12 </فلتر>
13
14
15 <تعيين عامل التصفية>
16 < مرشح - اسم > مرشح ذاكرة التخزين المؤقت </ مرشح - اسم >
17 < URL - النمط >* .jsp </ URL - النمط >
18 </ مرشح - رسم الخرائط >
سيعمل التعريف أعلاه على تخزين جميع صفحات .jsp مؤقتًا، ووقت تحديث ذاكرة التخزين المؤقت هو 60 ثانية، ونطاق ذاكرة التخزين المؤقت هو الجلسة.
لاحظ أن CacheFilter يلتقط فقط طلبات الصفحة برأس Http 200، أي أنه يخزن الطلبات مؤقتًا فقط دون أخطاء.
بدلاً من تخزين الطلبات الأخرى مؤقتًا (مثل 500، 404، 400)
[الاستنتاج] يمكن أن يساعدنا OSCache في إنشاء موقع ويب أكثر تنوعًا وأعلى أداء. بمساعدة مكتبة علامات OSCache، يمكننا الآن استخدامها لحل بعض المشكلات التي تؤثر على استجابة موقع الويب، مثل فترات ذروة حركة المرور، وخوادم قواعد البيانات المحملة بشكل زائد، وما إلى ذلك.
نصيحة شخصية: إذا كنت تستخدم Struts أو بنية MVC أخرى، فمن الصعب الاستمتاع بتحسين الأداء الذي توفره علامة oscache، لأنه لا يزال يتعين إرسال كل طلب إلى الإجراء - dao أو أي شيء آخر للمعالجة، لذلك، لاستخدام التخزين المؤقت ، أنت بحاجة إلى طرق أخرى، مثل التخزين المؤقت على مستوى الطريقة في معترض الربيع... إذا كانت جميع أكواد معالجة أعمالك مكتوبة في صفحات jsp، فيمكنك استخدام علامات ذاكرة التخزين المؤقت لتخزين بيانات الصفحة التي تم إنشاؤها مسبقًا مؤقتًا لتجنب القيام بنفس العمليات التجارية.