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" %>
ต่อไปเราต้องล้อมรอบทั้งหน้าด้วยแท็กแคช เวลาแคชเริ่มต้นสำหรับแท็กแคชคือ 1 ชั่วโมง
<cache:cache> .... รายงานการจัดการที่ซับซ้อน.... </cache:cache>
ขณะนี้หน้าการจัดการถูกแคชไว้แล้ว หากผู้ดูแลระบบเข้าถึงเพจเดิมอีกครั้งภายในหนึ่งชั่วโมงหลังจากสร้างเพจ เขาจะเห็นเพจที่แคชไว้ก่อนหน้านี้ และเซิร์ฟเวอร์ฐานข้อมูลไม่จำเป็นต้องสร้างรายงานนี้อีกครั้ง
3. หน้าแรก หน้าแรกของเว็บไซต์การประมูลจะแสดงกิจกรรมของเว็บไซต์และส่งเสริมการประมูลที่กำลังจะสิ้นสุด เราต้องการแสดงจำนวนการประมูลที่กำลังดำเนินอยู่ จำนวนผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน รายการการประมูลที่จะสิ้นสุดในอนาคตอันใกล้นี้ และเวลาปัจจุบัน ข้อความเหล่านี้มีข้อกำหนดด้านความแม่นยำของเวลาที่แตกต่างกัน โดยปกติการประมูลบนเว็บไซต์จะใช้เวลาหลายวัน ดังนั้นเราจึงสามารถตั้งเวลาเพื่อบัฟเฟอร์จำนวนการประมูลที่ถูกต้องไว้ที่ 6 ชั่วโมง จำนวนผู้ใช้จะเปลี่ยนแปลงบ่อยขึ้นอย่างเห็นได้ชัด แต่ที่นี่เราจะบัฟเฟอร์ค่านี้ครั้งละ 15 นาที สุดท้ายนี้ เราต้องการให้เวลาปัจจุบันที่แสดงบนเพจเป็นเวลาที่แน่นอนที่มีการเข้าถึงเพจเสมอ
หลังจากประกาศไลบรารีแท็กในหน้าแรกแล้ว ขั้นแรกเราจะส่งออกวันที่ปัจจุบันโดยตรงโดยไม่มีการบัฟเฟอร์:
ตอนนี้คือ: <%=new java.util.Date()%>
ต่อไป เราต้องการแสดงรายการวันที่ที่จะประมูล ที่สิ้นสุดในระยะสั้น:
<cache:cache> <ul> <% // สร้างตัววนซ้ำที่มีการประมูลล่าสุด การประมูลตัววนซ้ำ = .... ในขณะที่ (auctions.hasMore()) { การประมูลการประมูล = (การประมูล) การประมูลถัดไป (); %><li><%=auction%></li%< } %> </ul> </cache:cache>
สุดท้ายนี้ เราต้องการแสดงจำนวนการประมูลที่กำลังดำเนินอยู่ ตัวเลขนี้จะต้องเป็น บัฟเฟอร์เป็นเวลา 6 ชั่วโมง เนื่องจากการทำเครื่องหมายแคชต้องใช้จำนวนวินาทีในการบัฟเฟอร์ข้อมูล เราจึงแปลง 6 ชั่วโมงเป็น 21600 วินาที:
<cache:cache time="21600"> <% //สืบค้นฐานข้อมูลเพื่อรับจำนวนกิจกรรมการประมูลทั้งหมด int AuctionCount = .. .. %> มีการประมูลที่กำลังดำเนินอยู่ <%=auctionCount%> บนเว็บไซต์นี้! </cache>
อย่างที่คุณเห็น เราใช้โค้ดเพียงเล็กน้อยเพื่อสร้างหน้าแรกที่มีระบบบัฟเฟอร์ที่ซับซ้อน ระบบบัฟเฟอร์นี้จะบัฟเฟอร์แต่ละส่วนของหน้าแยกจากกัน และเวลาบัฟเฟอร์ของแต่ละส่วนจะสอดคล้องกับความถี่ของการเปลี่ยนแปลงข้อมูลที่เกี่ยวข้องอย่างสมบูรณ์ ด้วยการบัฟเฟอร์ ทำให้เราสามารถใส่เนื้อหาเพิ่มเติมในหน้าแรกได้ หากไม่มีการบัฟเฟอร์มาก่อน การวางเนื้อหามากเกินไปในหน้าแรกจะทำให้การเข้าถึงหน้าเว็บช้าลง และอาจทำให้เกิดปัญหากับเซิร์ฟเวอร์ฐานข้อมูลที่มากเกินไป
4. Navigation Bar สมมติว่าเมื่อวางแผนเว็บไซต์ เราตัดสินใจแสดงเนื้อหาตะกร้าสินค้าใต้แถบนำทางด้านซ้าย เราจะแสดงจำนวนการประมูลและราคาปัจจุบันสำหรับแต่ละรายการในการประมูลโดยผู้ใช้ รวมถึงรายการของสินค้าทั้งหมดที่ผู้ใช้ปัจจุบันมีราคาเสนอสูงสุด
เราใช้ความสามารถในการบัฟเฟอร์ระดับเซสชันเพื่อสร้างฟังก์ชันการทำงานข้างต้นในแถบนำทาง ใส่โค้ดต่อไปนี้ลงในเทมเพลตหรือรวมไฟล์เพื่อให้หน้าอื่นๆ ในเว็บไซต์สามารถอ้างอิงแถบนำทางนี้ได้:
<cache:cache key="navbar" scope="session" time="300"> <% //แยกและแสดง ข้อมูลการเสนอราคาปัจจุบัน%> </cache:cache>
ที่นี่เราจะแนะนำคุณลักษณะที่สำคัญสองประการ ได้แก่ คีย์และขอบเขต ในโค้ดก่อนหน้าของบทความนี้ เนื่องจากแท็กแคชสามารถสร้างคีย์เฉพาะสำหรับบล็อคโค้ดได้โดยอัตโนมัติ เราจึงไม่จำเป็นต้องตั้งค่าแอตทริบิวต์คีย์นี้ด้วยตนเอง แต่ที่นี่ เราต้องการอ้างอิงบล็อกโค้ดที่แคชไว้นี้จากส่วนอื่นๆ ของไซต์ ดังนั้นเราจึงกำหนดแอตทริบิวต์คีย์ของแท็กแคชอย่างชัดเจน ประการที่สอง แอ็ตทริบิวต์ขอบเขตใช้เพื่อบอกแคชให้ทำเครื่องหมายว่าบล็อกโค้ดปัจจุบันต้องถูกบัฟเฟอร์ตามผู้ใช้แต่ละราย แทนที่จะบัฟเฟอร์เพียงครั้งเดียวสำหรับผู้ใช้ทั้งหมด
คุณควรใช้ความระมัดระวังอย่างมากเมื่อใช้การบัฟเฟอร์ระดับเซสชัน และควรมีความชัดเจน: แม้ว่าเราจะสามารถทำให้แถบนำทางที่ซับซ้อนลดภาระของเซิร์ฟเวอร์ได้ 5 เท่าหรือ 10 เท่า แต่จะเพิ่มพื้นที่หน่วยความจำที่ต้องใช้ต่อเซสชันอย่างมาก ไม่ต้องสงสัยเลยว่าจะเพิ่มจำนวนผู้ใช้พร้อมกันที่เป็นไปได้ในแง่ของความสามารถของ CPU แต่เมื่อจำนวนผู้ใช้พร้อมกันลดลงจนถึงขีดจำกัดของ CPU ในแง่ของความสามารถในการรองรับหน่วยความจำ โซลูชันนี้ไม่เหมาะอีกต่อไป
ตามที่กล่าวไว้ก่อนหน้าในบทความนี้ เราต้องการอ้างอิงบล็อกโค้ดที่บัฟเฟอร์นี้จากส่วนที่เหลือของไซต์ เนื่องจากเมื่อผู้ใช้เพิ่มรายการสำหรับการประมูล หรือเสนอราคาสำหรับรายการที่ประมูลโดยผู้ใช้รายอื่น เราต้องการรีเฟรชบัฟเฟอร์เพื่อให้แถบนำทางมีเนื้อหาล่าสุดในครั้งต่อไปที่มีการอ่าน แม้ว่าข้อมูลนี้อาจเปลี่ยนแปลงเนื่องจากกิจกรรมของผู้ใช้รายอื่น แต่อาจทำให้ผู้ใช้สับสนมากเมื่อเห็นว่ารายการของตนยังคงไม่เปลี่ยนแปลงหลังจากดำเนินการบนไซต์
แท็กฟลัชที่จัดทำโดยไลบรารี OSCache สามารถรีเฟรชเนื้อหาบัฟเฟอร์ได้ เราสามารถเพิ่มโค้ดต่อไปนี้ลงในเพจที่จัดการการกระทำของผู้ใช้ที่อาจส่งผลกระทบต่อพื้นที่นี้:
<cache:flush key="navbar" scope="session" />
เมื่อผู้ใช้เข้าถึงในครั้งถัดไป บล็อกบัฟเฟอร์ navbar จะถูกรีเฟรช .
จนถึงขณะนี้ การสร้างเว็บไซต์ตัวอย่างของเราเสร็จสมบูรณ์แล้วและสามารถเริ่มดำเนินการได้ มาดูความสามารถในการจัดการข้อยกเว้นของ OSCache กัน แม้ว่าเนื้อหาที่บัฟเฟอร์ไม่ถูกต้อง เช่น ข้อยกเว้น Java ที่เกิดขึ้นภายในบล็อกบัฟเฟอร์ ไลบรารีแท็ก OSCache ยังคงอนุญาตให้เราแสดงเนื้อหาโดยทางโปรแกรม ด้วยคุณสมบัติการควบคุมข้อยกเว้นนี้ เราสามารถรื้อการเชื่อมต่อระหว่างเซิร์ฟเวอร์ฐานข้อมูลและเว็บเซิร์ฟเวอร์ได้ และเว็บไซต์จะยังคงสามารถทำงานต่อไปได้ ข้อกำหนด JSP 1.2 นำเสนออินเทอร์เฟซ TryCatchFinally ซึ่งช่วยให้แท็กสามารถตรวจจับและจัดการข้อยกเว้นของ Java ได้ ดังนั้น มาร์กอัปสามารถรวมกับโค้ดการจัดการข้อยกเว้นนี้เพื่อทำให้เพจ JSP เรียบง่ายและเป็นระเบียบมากขึ้น
OpenSymphony กำลังวางแผนที่จะใช้กลไกการบัฟเฟอร์เพิ่มเติม เช่นเดียวกับระบบหลักที่สามารถจัดการได้มากขึ้น ซึ่งจะช่วยให้เราจัดการ RAM และพื้นที่ดิสก์ที่ใช้โดยการบัฟเฟอร์ได้ เมื่อคุณสมบัติเหล่านี้พร้อมใช้งานแล้ว เราจะสามารถปรับปรุงการตอบสนองและความน่าเชื่อถือของเว็บไซต์ต่อไปได้
ตัวอย่างการใช้งาน:
ตัวช่วยสร้างการกำหนดค่าไฟล์ oscache.properties
cache.memory
ค่าเป็นจริงหรือเท็จ ค่าเริ่มต้นคือการแคชในหน่วยความจำ
หากตั้งค่าเป็นเท็จแคชสามารถแคชได้เฉพาะในฐานข้อมูลหรือฮาร์ดดิสก์เท่านั้นดังนั้นจุดของแคชคืออะไร :)
cache.capacity
จำนวนองค์ประกอบแคช
cache.persistence.class
คลาสแคชถาวร หากเปิดใช้งานคลาสนี้ คุณต้องตั้งค่าข้อมูล cache.path
cache.cluster ที่เกี่ยวข้องกับข้อมูลการตั้งค่าคลัสเตอร์
ชอบ
cache.cluster.multicast.ip เป็นที่อยู่ IP ของการออกอากาศ
cache.cluster.properties คือคุณสมบัติของคลัสเตอร์
3. การใช้งานพื้นฐานของ OSCache
cache1.jsp เป็นดังนี้
<%@ page import="java.util.*" %>
<%@ taglib uri="oscache" คำนำหน้า = "แคช" %>
<html>
<body>
ไม่มีวันที่แคช: <%= วันที่ใหม่ () %><p>
<!--รีเฟรชอัตโนมัติ-->
<แคช:แคชเวลา="30">
รีเฟรชวันที่แคชทุกๆ 30 วินาที: <%= new Date() %>
</แคช:แคช>
<!--รีเฟรชด้วยตนเอง-->
<แคช:คีย์แคช="ทดสอบแคช">
รีเฟรชวันที่แคชด้วยตนเอง: <%= new Date() %> <p>
</แคช:แคช>
<a href="/cache2.jsp">รีเฟรชด้วยตนเอง</a>
</body>
</html>
cache2.jsp ทำการรีเฟรชเพจด้วยตนเองดังต่อไปนี้
<%@ taglib uri="oscache" คำนำหน้า = "แคช" %>
<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 < ตัวกรอง - ชื่อ > CacheFilter </ ตัวกรอง - ชื่อ >
3 < ตัวกรอง - คลาส > com.opensymphony.oscache.web.filter.CacheFilter </ ตัวกรอง - คลาส >
4 <init-พารามิเตอร์>
5 <param-name>เวลา</param-name>
6 < พารามิเตอร์ - ค่า > 60 </ พารามิเตอร์ - ค่า >
7 </init-พารามิเตอร์>
8 <init-พารามิเตอร์>
9 <param-name>ขอบเขต</param-name>
10 <param-value>เซสชัน</param-value>
11 </init-พารามิเตอร์>
12 </ ตัวกรอง >
13
14
15 <การแมปตัวกรอง>
16 < ตัวกรอง - ชื่อ > CacheFilter </ ตัวกรอง - ชื่อ >
17 < url - รูปแบบ >* .jsp </ url - รูปแบบ >
18 </ ตัวกรอง - การทำแผนที่ >
คำจำกัดความข้างต้นจะแคชเพจ .jsp ทั้งหมด เวลารีเฟรชแคชคือ 60 วินาที และขอบเขตแคชคือเซสชัน
โปรดทราบว่า CacheFilter จะรวบรวมเฉพาะคำขอเพจที่มีส่วนหัว Http เท่ากับ 200 กล่าวคือ แคชเฉพาะคำขอที่ไม่มีข้อผิดพลาด
แทนที่จะแคชคำขออื่นๆ (เช่น 500, 404, 400)
[บทสรุป] OSCache สามารถช่วยให้เราสร้างเว็บไซต์ที่มีสีสันและมีประสิทธิภาพสูงขึ้นได้ ด้วยความช่วยเหลือของไลบรารีแท็ก OSCache ตอนนี้เราสามารถใช้เพื่อแก้ไขปัญหาบางอย่างที่ส่งผลต่อการตอบสนองของเว็บไซต์ เช่น ช่วงที่มีการรับส่งข้อมูลสูงสุด เซิร์ฟเวอร์ฐานข้อมูลที่โอเวอร์โหลด เป็นต้น
เคล็ดลับส่วนตัว: หากคุณใช้ Struts หรือสถาปัตยกรรม MVC อื่น ๆ เป็นการยากที่จะเพลิดเพลินกับการปรับปรุงประสิทธิภาพที่มาจากแท็ก oscache เนื่องจากแต่ละคำขอยังคงต้องถูกส่งไปยังการดำเนินการ - dao หรือสิ่งอื่น ๆ เพื่อการประมวลผล ดังนั้นเพื่อใช้แคช คุณต้องมีวิธีการอื่นๆ เช่น การแคชระดับวิธีการใน interceptor ของ spring... หากรหัสประมวลผลธุรกิจของคุณทั้งหมดเขียนในหน้า jsp คุณสามารถใช้แท็กแคชเพื่อแคชข้อมูลเพจที่สร้างขึ้นก่อนหน้านี้เพื่อหลีกเลี่ยงการดำเนินธุรกิจเดียวกัน