Bagikan melalui


Meningkatkan Performa dengan Penembolokan Output (VB)

oleh Microsoft

Dalam tutorial ini, Anda mempelajari bagaimana Anda dapat secara dramatis meningkatkan performa aplikasi web MVC ASP.NET Anda dengan memanfaatkan penembolokan output. Anda mempelajari cara menyimpan cache hasil yang dikembalikan dari tindakan pengontrol sehingga konten yang sama tidak perlu dibuat setiap kali pengguna baru memanggil tindakan.

Tujuan dari tutorial ini adalah untuk menjelaskan bagaimana Anda dapat secara dramatis meningkatkan performa aplikasi MVC ASP.NET dengan memanfaatkan cache output. Cache output memungkinkan Anda untuk menyimpan konten yang dikembalikan oleh tindakan pengontrol. Dengan begitu, konten yang sama tidak perlu dihasilkan setiap kali tindakan pengontrol yang sama dipanggil.

Bayangkan, misalnya, bahwa aplikasi MVC ASP.NET Anda menampilkan daftar rekaman database dalam tampilan bernama Indeks. Biasanya, setiap kali pengguna memanggil tindakan pengontrol yang mengembalikan tampilan Indeks, kumpulan rekaman database harus diambil dari database dengan menjalankan kueri database.

Jika, di sisi lain, Anda memanfaatkan cache output maka Anda dapat menghindari menjalankan kueri database setiap kali pengguna memanggil tindakan pengontrol yang sama. Tampilan dapat diambil dari cache alih-alih diregenerasi dari tindakan pengontrol. Penembolokan memungkinkan Anda menghindari pekerjaan redundan di server.

Mengaktifkan Penembolokan Output

Anda mengaktifkan penembolokan output dengan menambahkan <atribut OutputCache> ke tindakan pengontrol individual atau seluruh kelas pengontrol. Misalnya, pengontrol di Daftar 1 memaparkan tindakan bernama Index(). Output tindakan Index() di-cache selama 10 detik.

Daftar 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=10, VaryByParam:="none")> _
    Function Index()
        Return View()
    End Function

End Class

Dalam versi Beta ASP.NET MVC, penembolokan output tidak berfungsi untuk URL seperti http://www.MySite.com/. Sebagai gantinya, Anda harus memasukkan URL seperti 'http://www.MySite.com/Home/Index'.

Dalam Daftar 1, output tindakan Index() di-cache selama 10 detik. Jika mau, Anda dapat menentukan durasi cache yang lebih lama. Misalnya, jika Anda ingin menyimpan output tindakan pengontrol selama satu hari maka Anda dapat menentukan durasi cache 86400 detik (60 detik * 60 menit * 24 jam).

Tidak ada jaminan bahwa konten akan di-cache selama jumlah waktu yang Anda tentukan. Ketika sumber daya memori menjadi rendah, cache mulai mengusir konten secara otomatis.

Pengontrol Beranda di Daftar 1 mengembalikan tampilan Indeks di Daftar 2. Tidak ada yang istimewa tentang tampilan ini. Tampilan Indeks hanya menampilkan waktu saat ini (lihat Gambar 1).

Daftar 2 – Views\Home\Index.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <div>
    
    The current time is: <%= DateTime.Now.ToString("T") %>
    
    </div>
</body>
</html>

Gambar 1 – Tampilan Indeks Singgahan

clip_image002

Jika Anda memanggil tindakan Index() beberapa kali dengan memasukkan URL /Home/Index di bilah alamat browser Anda dan menekan tombol Refresh/Muat Ulang di browser Anda berulang kali, maka waktu yang ditampilkan oleh tampilan Indeks tidak akan berubah selama 10 detik. Waktu yang sama ditampilkan karena tampilan di-cache.

Penting untuk dipahami bahwa tampilan yang sama di-cache untuk semua orang yang mengunjungi aplikasi Anda. Siapa pun yang memanggil tindakan Index() akan mendapatkan versi cache yang sama dari tampilan Indeks. Ini berarti bahwa jumlah pekerjaan yang harus dilakukan server web untuk melayani tampilan Indeks berkurang secara dramatis.

Tampilan di Listing 2 kebetulan melakukan sesuatu yang sangat sederhana. Tampilan hanya menampilkan waktu saat ini. Namun, Anda bisa dengan mudah menyimpan tampilan yang menampilkan sekumpulan rekaman database. Dalam hal ini, kumpulan rekaman database tidak perlu diambil dari database masing-masing dan setiap kali tindakan pengontrol yang mengembalikan tampilan dipanggil. Penembolokan dapat mengurangi jumlah pekerjaan yang harus dilakukan server web dan server database Anda.

Jangan gunakan halaman <%@ Direktif OutputCache %> dalam tampilan MVC. Arahan ini berdarah dari dunia Formulir Web dan tidak boleh digunakan dalam aplikasi MVC ASP.NET.

Di mana Konten Di-cache

Secara default, saat Anda menggunakan <atribut OutputCache, konten di-cache> di tiga lokasi: server web, server proksi apa pun, dan browser web. Anda dapat mengontrol dengan tepat di mana konten di-cache dengan memodifikasi properti Lokasi dari <atribut OutputCache> .

Anda bisa mengatur properti Lokasi ke salah satu nilai berikut ini:

· Apa pun

· Klien

· Hilir

· Server

· Tidak

· ServerAndClient

Secara default, properti Lokasi memiliki nilai Apa pun. Namun, ada situasi di mana Anda mungkin ingin menyimpan cache hanya di browser atau hanya di server. Misalnya, jika Anda menyimpan cache informasi yang dipersonalisasi untuk setiap pengguna, Anda tidak boleh menyimpan informasi di server. Jika Anda menampilkan informasi yang berbeda kepada pengguna yang berbeda, Maka Anda harus menyimpan informasi hanya pada klien.

Misalnya, pengontrol di Listing 3 memaparkan tindakan bernama GetName() yang mengembalikan nama pengguna saat ini. Jika Jack masuk ke situs web dan memanggil tindakan GetName() maka tindakan mengembalikan string "Hi Jack". Jika, kemudian, Jill masuk ke situs web dan memanggil tindakan GetName() maka dia juga akan mendapatkan string "Hi Jack". String di-cache di server web untuk semua pengguna setelah Jack awalnya memanggil tindakan pengontrol.

Daftar 3 – Controllers\BadUserController.vb

Public Class BadUserController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=3600, VaryByParam:="none")> _
    Function Index()
        Return "Hi " & User.Identity.Name
    End Function

End Class

Kemungkinan besar, pengontrol di Listing 3 tidak berfungsi seperti yang Anda inginkan. Anda tidak ingin menampilkan pesan "Hai Jack" ke Jill.

Anda tidak boleh menyimpan konten yang dipersonalisasi dalam cache server. Namun, Anda mungkin ingin menyimpan konten yang dipersonalisasi di cache browser untuk meningkatkan performa. Jika Anda menyimpan konten di browser, dan pengguna memanggil tindakan pengontrol yang sama beberapa kali, konten dapat diambil dari cache browser alih-alih server.

Pengontrol yang dimodifikasi di Listing 4 menyimpan output tindakan GetName(). Namun, konten hanya di-cache di browser dan bukan di server. Dengan begitu, ketika beberapa pengguna memanggil metode GetName(), setiap orang mendapatkan nama pengguna mereka sendiri dan bukan nama pengguna orang lain.

Daftar 4 – Controllers\UserController.vb

Public Class UserController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=3600, VaryByParam:="none", Location:=OutputCacheLocation.Client, NoStore:=True)> _
    Function GetName()
        Return "Hi " & User.Identity.Name
    End Function

End Class

Perhatikan bahwa <atribut OutputCache> di Daftar 4 menyertakan properti Lokasi yang diatur ke nilai OutputCacheLocation.Client. Atribut <OutputCache> juga menyertakan properti NoStore. Properti NoStore digunakan untuk menginformasikan server proksi dan browser bahwa mereka tidak boleh menyimpan salinan permanen konten yang di-cache.

Memvariasikan Cache Output

Dalam beberapa situasi, Anda mungkin menginginkan versi cache yang berbeda dari konten yang sangat sama. Bayangkan, misalnya, bahwa Anda membuat halaman master/detail. Halaman master menampilkan daftar judul film. Saat mengklik judul, Anda mendapatkan detail untuk film yang dipilih.

Jika Anda menyimpan cache halaman detail, maka detail untuk film yang sama akan ditampilkan terlepas dari film mana yang Anda klik. Film pertama yang dipilih oleh pengguna pertama akan ditampilkan kepada semua pengguna di masa mendatang.

Anda dapat memperbaiki masalah ini dengan memanfaatkan properti VaryByParam dari <atribut OutputCache> . Properti ini memungkinkan Anda membuat versi cache yang berbeda dari konten yang sangat sama ketika parameter formulir atau parameter string kueri bervariasi.

Misalnya, pengontrol di Listing 5 memaparkan dua tindakan bernama Master() dan Details(). Tindakan Master() mengembalikan daftar judul film dan tindakan Details() mengembalikan detail untuk film yang dipilih.

Daftar 5 – Controllers\MoviesController.vb

Public Class MoviesController
    Inherits System.Web.Mvc.Controller

    Private _dataContext As MovieDataContext

    Public Sub New()
        _dataContext = New MovieDataContext()
    End Sub

    <OutputCache(Duration:=Integer.MaxValue, VaryByParam:="none")> _
    Public Function Master()
        ViewData.Model = (From m In _dataContext.Movies _
                          Select m).ToList()
        Return View()
    End Function

    <OutputCache(Duration:=Integer.MaxValue, VaryByParam:="id")> _
    Public Function Details(ByVal id As Integer)
        ViewData.Model = _dataContext.Movies.SingleOrDefault(Function(m) m.Id = id)
        Return View()
    End Function

End Class

Tindakan Master() menyertakan properti VaryByParam dengan nilai "tidak ada". Saat tindakan Master() dipanggil, versi cache yang sama dari tampilan Master dikembalikan. Parameter formulir atau parameter string kueri diabaikan (lihat Gambar 2).

Gambar 2 – Tampilan /Movies/Master

clip_image004

Gambar 3 – Tampilan /Movies/Details

clip_image006

Tindakan Details() menyertakan properti VaryByParam dengan nilai "Id". Ketika nilai parameter Id yang berbeda diteruskan ke tindakan pengontrol, versi cache yang berbeda dari tampilan Detail dihasilkan.

Penting untuk dipahami bahwa menggunakan properti VaryByParam menghasilkan lebih banyak penembolokan dan tidak kurang. Versi cache yang berbeda dari tampilan Detail dibuat untuk setiap versi parameter Id yang berbeda.

Anda bisa mengatur properti VaryByParam ke nilai berikut:

* = Buat versi cache yang berbeda setiap kali parameter string formulir atau kueri bervariasi.

none = Jangan pernah membuat versi cache yang berbeda

Daftar titik koma parameter = Buat versi cache yang berbeda setiap kali salah satu parameter string formulir atau kueri dalam daftar bervariasi

Membuat Profil Cache

Sebagai alternatif untuk mengonfigurasi properti cache output dengan memodifikasi properti <atribut OutputCache> , Anda dapat membuat profil cache di file konfigurasi web (web.config). Membuat profil cache dalam file konfigurasi web menawarkan beberapa keuntungan penting.

Pertama, dengan mengonfigurasi penembolokan output dalam file konfigurasi web, Anda dapat mengontrol cara pengontrol melakukan tindakan cache konten di satu lokasi pusat. Anda dapat membuat satu profil cache dan menerapkan profil ke beberapa pengontrol atau tindakan pengontrol.

Kedua, Anda dapat memodifikasi file konfigurasi web tanpa mengolah ulang aplikasi Anda. Jika Anda perlu menonaktifkan penembolokan untuk aplikasi yang telah disebarkan ke produksi, maka Anda cukup memodifikasi profil cache yang ditentukan dalam file konfigurasi web. Setiap perubahan pada file konfigurasi web akan terdeteksi secara otomatis dan diterapkan.

Misalnya, bagian <konfigurasi web penembolokan> di Daftar 6 menentukan profil cache bernama Cache1Hour. Bagian <penembolokan> harus muncul di dalam bagian <system.web> dari file konfigurasi web.

Daftar 6 – Bagian penembolokan untuk web.config

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Cache1Hour" duration="3600" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

Pengontrol di Listing 7 menggambarkan bagaimana Anda dapat menerapkan profil Cache1Hour ke tindakan pengontrol dengan <atribut OutputCache> .

Listing 7 – Controllers\ProfileController.vb

Public Class ProfileController
    Inherits System.Web.Mvc.Controller

    <OutputCache(CacheProfile:="Cache1Hour")> _
    Function Index()
        Return DateTime.Now.ToString("T")
    End Function

End Class

Jika Anda memanggil tindakan Index() yang diekspos oleh pengontrol di Daftar 7, maka waktu yang sama akan dikembalikan selama 1 jam.

Ringkasan

Penembolokan output memberi Anda metode yang sangat mudah untuk meningkatkan performa aplikasi MVC ASP.NET Anda secara dramatis. Dalam tutorial ini, Anda mempelajari cara menggunakan <atribut OutputCache> untuk menyimpan output tindakan pengontrol. Anda juga mempelajari cara memodifikasi properti <atribut OutputCache> seperti properti Durasi dan VaryByParam untuk memodifikasi cara konten di-cache. Terakhir, Anda mempelajari cara menentukan profil cache dalam file konfigurasi web.