Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 16824|Jawab: 0

[ASP.NET] Membangun cache file kustom ASP.NET pengoptimalan performa

[Salin tautan]
Diposting pada 19/04/2015 22.06.12 | | | |
ASP.NET caching output (yaitu HTML statis) berbasis memori hingga .NET 4.0. Artinya, jika situs kami berisi banyak cache, mudah untuk mengkonsumsi memori lokal. Sekarang, dengan bantuan . OutputCacheProvider di .NET 4.0, kami memiliki beberapa opsi untuk membuat cache kami sendiri. Misalnya, kita dapat menyimpan cache keluaran HTML di server klaster terdistribusi memcached atau MongoDB (database berorientasi dokumen yang umum digunakan, baca http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx ini). Tentu saja, kita juga dapat menyimpan cache sebagai file di hard drive, yang merupakan cara termurah untuk melakukannya dengan mempertimbangkan skalabilitas, dan artikel ini adalah tentang cara membangun cache file khusus.
1:Penyedia CacheOutput
OutputCacheProvider adalah kelas dasar abstrak yang perlu kita ganti empat metodenya, yaitu:
Tambahkan metode untuk memasukkan item yang ditentukan ke dalam cache output.
Get, yang mengembalikan referensi ke item yang ditentukan dalam cache output.
Hapus metode untuk menghapus item yang ditentukan dari cache output.
Set, menyisipkan item yang ditentukan ke dalam cache output, dan menimpa item jika di-cache.
2: Buat kelas penanganan cache file Anda sendiri
Jenisnya adalah FileCacheProvider, dan kodenya adalah sebagai berikut:

  1. public class FileCacheProvider : OutputCacheProvider
  2. {
  3.     private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

  4.     public override void Initialize(string name, NameValueCollection attributes)
  5.     {
  6.         base.Initialize(name, attributes);
  7.         CachePath = HttpContext.Current.Server.MapPath(attributes["cachePath"]);
  8.     }

  9.     public override object Add(string key, object entry, DateTime utcExpiry)
  10.     {
  11.         Object obj = Get(key);
  12.         if (obj != null)    //这一步很重要
  13.         {
  14.             return obj;
  15.         }
  16.         Set(key,entry,utcExpiry);
  17.         return entry;
  18.     }

  19.     public override object Get(string key)
  20.     {
  21.         string path = ConvertKeyToPath(key);
  22.         if (!File.Exists(path))
  23.         {
  24.             return null;
  25.         }
  26.         CacheItem item = null;
  27.         using (FileStream file = File.OpenRead(path))
  28.         {
  29.             var formatter = new BinaryFormatter();
  30.             item = (CacheItem)formatter.Deserialize(file);
  31.         }

  32.         if (item.ExpiryDate <= DateTime.Now.ToUniversalTime())
  33.         {
  34.             log.Info(item.ExpiryDate + "*" + key);
  35.             Remove(key);
  36.             return null;
  37.         }
  38.         return item.Item;
  39.     }


  40.     public override void Set(string key, object entry, DateTime utcExpiry)
  41.     {
  42.         CacheItem item = new CacheItem(entry, utcExpiry);
  43.         string path = ConvertKeyToPath(key);
  44.         using (FileStream file = File.OpenWrite(path))
  45.         {
  46.             BinaryFormatter formatter = new BinaryFormatter();
  47.             formatter.Serialize(file, item);
  48.         }
  49.     }
  50.       
  51.     public override void Remove(string key)
  52.     {
  53.         string path = ConvertKeyToPath(key);
  54.         if (File.Exists(path))
  55.             File.Delete(path);
  56.     }

  57.     public string CachePath
  58.     {
  59.         get;
  60.         set;
  61.     }

  62.     private string ConvertKeyToPath(string key)
  63.     {
  64.         string file = key.Replace('/', '-');
  65.         file += ".txt";
  66.         return Path.Combine(CachePath, file);
  67.     }
  68. }

  69. [Serializable]
  70. public class CacheItem
  71. {
  72.     public DateTime ExpiryDate;
  73.     public object Item;

  74.     public CacheItem(object entry, DateTime utcExpiry)
  75.     {
  76.         Item = entry;
  77.         ExpiryDate = utcExpiry;
  78.     }
  79. }
Salin kode
Ada dua tempat yang membutuhkan perhatian khusus:
Dalam metode Add, ada penilaian bersyarat yang harus ditangani dengan cara ini, jika tidak, mekanisme caching akan menyimpan hasil pertama dalam cache, dan cache akan kedaluwarsa setelah tanggal kedaluwarsa dan tidak akan dibangun kembali.
Dalam contoh program, kita cukup menempatkan cache di direktori cache, dan dalam praktik proyek aktual, mengingat halaman yang di-cache akan ribuan, kita harus melakukan klasifikasi direktori, jika tidak, menemukan dan membaca file cache akan menjadi kemacetan efisiensi, yang akan menguras CPU.
3: File konfigurasi

Kita perlu mengonfigurasi di Web.config bahwa penangan cache adalah FileCacheProvider khusus, yaitu menambahkan node di bawah FileCacheProvider:
  1. <caching>
  2.   <outputCache defaultProvider="FileCache">
  3.     <providers>
  4.       <add name="FileCache" type="MvcApplication2.Common.FileCacheProvider" cachePath="~/Cache" />
  5.     </providers>
  6.   </outputCache>
  7. </caching>
Salin kode

4: Penggunaan cache

Kami berasumsi bahwa menggunakannya dalam kontrol MVC (jika Anda ingin menggunakannya di halaman ASP.NET, sertakan <% dalam page@OutputCache VaryByParam="none" Duration="10" %>), dan Anda dapat melihat bahwa Index tidak di-cache output, sedangkan Index2 di-cache selama 10 detik.
  1. public class HomeController : Controller
  2. {
  3.     private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  4.     static string s_conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";
  5.     public ActionResult Index()
  6.     {
  7.         using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))
  8.         {
  9.             ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
  10.         }
  11.         return View();
  12.     }

  13.     [OutputCache(Duration = 10, VaryByParam = "none")]
  14.     public ActionResult Index2()
  15.     {
  16.         using (DataSet ds = Common.SqlHelper.ExecuteDataset(s_conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))
  17.         {
  18.             ViewBag.Message = ds.Tables[0].Rows[0]["name"].ToString();
  19.         }
  20.         return View();
  21.     }
  22. }
Salin kode
5: Periksa efeknya
Kode di atas, setelah mengakses Index2, akan menghasilkan file cache di folder Cache, sebagai berikut:

Sekarang, mari kita evaluasi perbandingan performa antara cache output dan cache output, mensimulasikan 100 permintaan bersamaan dari 100 pengguna sebagai berikut:








Mantan:Siklus hidup sesi
Depan:C#. .NET untuk mencegah serangan injeksi SQL
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com