1. Ikhtisar Dalam aplikasi Web, pembuatan beberapa laporan mungkin memerlukan waktu lama untuk dihitung oleh database; beberapa situs web menyediakan informasi cuaca, yang memerlukan akses ke server jarak jauh untuk membuat panggilan SOAP guna memperoleh informasi suhu. Semua ini adalah contoh informasi yang kompleks. Menambahkan terlalu banyak informasi kompleks ke halaman Web dapat menyebabkan server Web dan server database kelebihan beban. Buffer blok kode JSP memberi pengembang kebebasan untuk menambahkan semua jenis informasi kompleks sesuka hati.
JSP dapat merangkum dan menjalankan kode Java yang kompleks di perpustakaan tag, yang membuat file halaman JSP lebih mudah dipelihara dan memudahkan pengembang non-profesional untuk menggunakan file halaman JSP. Sudah ada banyak perpustakaan tag, baik produk komersial maupun produk sumber terbuka. Namun sebagian besar produk ini hanya menggunakan perpustakaan tag untuk mengimplementasikan fungsi yang dapat diimplementasikan dengan Java Scriptlet sederhana.Beberapa produk menggunakan tag khusus dalam beberapa cara yang kreatif, menyediakan fungsi yang hampir sama sebelum munculnya perpustakaan tag khusus JSP.
Pustaka tag OSCache, dirancang oleh OpenSymphony, adalah aplikasi tag kustom JSP inovatif yang menyediakan cache memori cepat dalam halaman JSP yang ada. Meskipun ada beberapa vendor yang menawarkan produk caching dalam berbagai bentuk, semuanya merupakan produk khusus vendor. OSCache dapat berjalan di server apa pun yang mendukung JSP 1.1, dan dapat melakukan cache blok kode JSP yang ada tidak hanya untuk semua pengguna, tetapi juga pada basis per pengguna. OSCache juga menyertakan beberapa fitur lanjutan untuk meningkatkan skalabilitas, seperti buffering ke disk, buffer flushing yang dapat diprogram, kontrol pengecualian, dll. Selain itu, seperti produk OpenSymphony lainnya, kode OSCache didistribusikan secara bebas di bawah lisensi sumber terbuka.
Artikel ini mengambil contoh proses desain situs lelang imajiner untuk memperkenalkan proses kerja OSCache. Situs Web hipotetis ini berisi:
1: Halaman administratif yang melaporkan aktivitas lelang terkini;
2: Beranda dengan fungsi lengkap dan berbagai informasi promosi;
3: Bilah navigasi khusus yang berisi semua informasi lelang pengguna yang belum diselesaikan.
2. Halaman manajemen
Situs lelang berisi laporan manajemen, dan server database memerlukan beberapa detik untuk membuat laporan tersebut. Penting agar laporan membutuhkan waktu lama untuk dibuat, karena kami mungkin memiliki banyak administrator yang memantau pengoperasian sistem, dan kami ingin menghindari pembuatan ulang laporan setiap kali administrator berkunjung. Untuk mencapai hal ini, kami akan merangkum seluruh halaman ke dalam tag buffer tingkat aplikasi yang disegarkan setiap jam. Beberapa produk dari vendor lain mempunyai fungsi serupa, hanya saja OSCache melakukannya lebih baik dari mereka.
Demi kesederhanaan, kami tidak akan terlalu fokus pada masalah pemformatan. Saat menulis halaman manajemen, pertama-tama kita menambahkan deklarasi perpustakaan tag ke halaman:
<%@ taglib uri="cachetags" prefix="cache" %>
Selanjutnya kita harus mengelilingi seluruh halaman dengan tag cache. Waktu cache default untuk tag cache adalah 1 jam.
<cache:cache> .... Laporan manajemen yang kompleks.... </cache:cache>
Halaman manajemen sekarang disimpan dalam cache. Jika administrator mengakses halaman yang sama lagi dalam waktu satu jam setelah halaman dibuat, dia akan melihat halaman yang di-cache sebelumnya, dan server database tidak perlu membuat laporan ini lagi.
3. Halaman Beranda Halaman beranda situs lelang menampilkan aktivitas situs web dan mempromosikan lelang yang akan segera berakhir. Kami ingin menampilkan jumlah lelang yang sedang berlangsung, jumlah pengguna yang login saat ini, daftar lelang yang akan berakhir dalam waktu dekat, dan waktu saat ini. Pesan-pesan ini memiliki persyaratan akurasi waktu yang berbeda. Lelang di website biasanya berlangsung selama beberapa hari, jadi kita bisa mengatur waktu buffer jumlah lelang yang valid menjadi 6 jam. Jumlah pengguna jelas akan lebih sering berubah, tapi di sini kita akan buffer nilai ini selama 15 menit setiap kalinya. Terakhir, kami ingin waktu saat ini yang ditampilkan pada halaman selalu sama dengan waktu saat halaman diakses.
Setelah mendeklarasikan perpustakaan tag di halaman beranda, pertama-tama kita langsung menampilkan tanggal saat ini tanpa buffering:
sekarang menjadi: <%=new java.util.Date()%>
Selanjutnya, kita ingin menampilkan daftar tanggal yang akan dilelang yang berakhir dalam jangka pendek:
<cache:cache> <ul> <% // Membangun sebuah Iterator yang berisi lelang terkini Iterator Auctions = .... while (auctions.hasMore()) { Auction Auction = (Auction) Auctions.next (); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Terakhir, kami ingin menampilkan jumlah lelang yang sedang berlangsung, Angka ini harus berupa dibuffer selama 6 jam. Karena penandaan cache memerlukan jumlah detik untuk buffering data, kami mengubah 6 jam menjadi 21600 detik:
<cache:cache time="21600"> <% //Meminta database untuk mendapatkan jumlah total aktivitas lelang int AuctionCount = .. .. %> Ada <%=auctionCount%> lelang yang sedang berlangsung di situs web ini! </cache>
Seperti yang Anda lihat, kami hanya menggunakan sejumlah kecil kode untuk membuat beranda dengan sistem buffering yang kompleks. Sistem buffering ini melakukan buffering pada setiap bagian halaman secara terpisah, dan waktu buffering pada setiap bagian sepenuhnya konsisten dengan frekuensi perubahan informasi masing-masing. Berkat buffering, sekarang kita dapat menempatkan lebih banyak konten di beranda; tanpa buffering sebelumnya, menempatkan terlalu banyak konten di beranda akan menyebabkan akses halaman melambat, dan bahkan dapat menyebabkan masalah pada server database.
4. Bilah Navigasi Misalkan saat merencanakan situs web, kita memutuskan untuk menampilkan konten keranjang belanja di bawah bilah navigasi kiri. Kami akan menampilkan jumlah tawaran dan harga saat ini untuk setiap item dalam lelang oleh pengguna, serta daftar semua item yang tawaran tertingginya dimiliki oleh pengguna saat ini.
Kami menggunakan kemampuan buffering tingkat sesi untuk membangun fungsionalitas di atas di bilah navigasi. Masukkan kode berikut ke dalam templat atau sertakan file sehingga halaman lain di situs web dapat mereferensikan bilah navigasi ini:
<cache:cache key="navbar" scope="session" time="300"> <% //Ekstrak dan tampilkan informasi Tawaran saat ini%> </cache:cache>
Di sini kami memperkenalkan dua atribut penting, yaitu kunci dan cakupan. Pada kode sebelumnya di artikel ini, karena tag cache dapat secara otomatis membuat kunci unik untuk blok kode, kita tidak perlu menyetel atribut kunci ini secara manual. Namun di sini, kami ingin mereferensikan blok kode yang di-cache ini dari seluruh situs, jadi kami secara eksplisit mendefinisikan atribut key dari tag cache. Kedua, atribut scope digunakan untuk memberi tahu cache untuk menandai bahwa blok kode saat ini harus di-buffer per pengguna, bukan buffering satu kali untuk semua pengguna.
Anda harus sangat berhati-hati saat menggunakan buffering tingkat sesi, dan ini harus jelas: meskipun kita dapat membuat bilah navigasi yang rumit mengurangi beban server sebanyak 5x atau 10x, ini akan sangat meningkatkan ruang memori yang dibutuhkan per sesi. Tidak diragukan lagi, meningkatkan jumlah kemungkinan pengguna secara bersamaan dalam hal kemampuan CPU adalah hal yang ideal, tetapi setelah jumlah pengguna secara bersamaan dikurangi hingga batas CPU dalam hal kemampuan dukungan memori, solusi ini tidak lagi ideal.
Seperti disebutkan sebelumnya dalam artikel ini, kami ingin mereferensikan blok kode yang di-buffer ini dari seluruh situs. Hal ini karena ketika pengguna menambahkan item untuk dilelang, atau menawar item yang dilelang oleh pengguna lain, kami ingin menyegarkan buffer sehingga bilah navigasi memiliki konten terbaru saat dibaca lagi. Meskipun data ini dapat berubah karena aktivitas pengguna lain, mungkin akan sangat membingungkan bagi pengguna untuk melihat bahwa daftarnya tetap tidak berubah setelah melakukan tindakan di situs.
Tag flush yang disediakan oleh perpustakaan OSCache dapat menyegarkan konten buffer. Kita dapat menambahkan kode berikut ke halaman yang menangani tindakan pengguna yang mungkin mempengaruhi area ini:
<cache:flush key="navbar" scope="session" />
Ketika pengguna mengaksesnya di lain waktu, blok buffer navbar akan di-refresh .
Sejauh ini pembangunan website contoh kami telah selesai dan dapat mulai berjalan. Mari kita lihat kemampuan penanganan pengecualian OSCache. Sekalipun konten yang dibuffer telah tidak valid, seperti pengecualian Java yang terjadi dalam blok buffer, pustaka tag OSCache masih memungkinkan kita untuk menampilkan konten secara terprogram. Dengan fitur kontrol pengecualian ini, kita dapat memutus koneksi antara server database dan server web, dan website akan tetap dapat terus berjalan. Spesifikasi JSP 1.2 memperkenalkan antarmuka TryCatchFinally, yang memungkinkan tag itu sendiri mendeteksi dan menangani pengecualian Java. Oleh karena itu, markup dapat digabungkan dengan kode penanganan pengecualian ini untuk membuat halaman JSP lebih sederhana dan terorganisir.
OpenSymphony berencana untuk mengimplementasikan mekanisme buffering tambahan serta sistem utama yang lebih mudah dikelola yang memungkinkan kita mengelola RAM dan ruang disk yang digunakan oleh buffering. Setelah fitur-fitur ini diterapkan, kami akan dapat lebih meningkatkan daya tanggap dan keandalan situs web.
Contoh penggunaan:
oscache.properties file konfigurasi wizard
cache.memory
Nilainya benar atau salah. Defaultnya adalah menyimpan cache di memori.
Jika disetel ke false, cache hanya dapat di-cache di database atau hard disk, jadi apa gunanya cache :)
cache.capacity
Jumlah elemen cache
cache.persistence.class
Kelas cache persisten, jika kelas ini diaktifkan, Anda harus mengatur informasi cache.path
cache.cluster terkait dengan informasi pengaturan cluster.
menyukai
cache.cluster.multicast.ip adalah alamat IP siaran
cache.cluster.properties adalah properti cluster
3. Penggunaan dasar OSCache
cache1.jsp adalah sebagai berikut
<%@ page import="java.util.*" %>
<%@ taglib uri="oscache" awalan="cache" %>
<html>
<body>
Tidak ada tanggal yang di-cache: <%= Tanggal baru() %><p>
<!--Penyegaran otomatis-->
<cache:cache waktu="30">
Segarkan tanggal yang di-cache setiap 30 detik: <%= Tanggal baru() %>
</cache:cache>
<!--Penyegaran manual-->
<cache:cache key="testcache">
Segarkan tanggal cache secara manual: <%= Tanggal baru() %> <p>
</cache:cache>
<a href="/cache2.jsp">Penyegaran manual</a>
</body>
</html>
cache2.jsp melakukan penyegaran halaman secara manual sebagai berikut
<%@ taglib uri="oscache" awalan="cache" %>
<html>
<body>
Cache telah dibersihkan...<p>
<cache:flush key="testcache" scope="application"/>
<a href="/cache1.jsp">Kembali</a>
</body>
</html>
Anda juga dapat menentukan cakupan efektif Cache melalui pernyataan berikut. Jika Anda tidak menentukan cakupan, cakupan defaultnya adalah Applcation.
<cache:cache time="30" scope="sesi">
...
</cache:cache>
4. Filter cache CacheFilter
Anda dapat menentukan filter cache di web.xml untuk menentukan cache sumber daya tertentu.
1 <menyaring>
2 < filter - nama > CacheFilter </ filter - nama >
3 < filter - kelas > com.opensymphony.oscache.web.filter.CacheFilter </ filter - kelas >
4 <init-param>
5 <nama-param>waktu</nama-param>
6 < param - nilai > 60 </ param - nilai >
7 </init-param>
8 <init-param>
9 <nama-param>cakupan</nama-param>
10 <param-value>sesi</param-value>
11 </init-param>
12 </ saring >
13
14
15 <pemetaan filter>
16 < filter - nama > CacheFilter </ filter - nama >
17 < url - pola >* .jsp </ url - pola >
18 </filter - pemetaan >
Definisi di atas akan meng-cache semua halaman .jsp, waktu penyegaran cache adalah 60 detik, dan cakupan cache adalah Sesi.
Perhatikan bahwa CacheFilter hanya menangkap permintaan halaman dengan header Http 200, yaitu hanya menyimpan permintaan cache tanpa kesalahan.
Daripada menyimpan permintaan lain (seperti 500, 404, 400) dalam cache,
[Kesimpulan] OSCache dapat membantu kita membangun situs web yang lebih berwarna dan berkinerja lebih tinggi. Dengan bantuan perpustakaan tag OSCache, sekarang kita dapat menggunakannya untuk menyelesaikan beberapa masalah yang mempengaruhi respons situs web, seperti periode lalu lintas puncak, server database yang kelebihan beban, dll.
Kiat pribadi: Jika Anda menggunakan Struts atau arsitektur MVC lainnya, sulit untuk menikmati peningkatan kinerja yang dibawa oleh tag oscache, karena setiap permintaan masih harus diserahkan ke tindakan--dao-atau hal lain untuk diproses , Anda memerlukan metode lain, seperti caching tingkat metode di pencegat pegas... Jika semua kode pemrosesan bisnis Anda ditulis di halaman jsp, Anda dapat menggunakan tag cache untuk menyimpan data halaman yang dihasilkan sebelumnya untuk menghindari melakukan operasi bisnis yang sama.