Saya telah membaca banyak informasi tentang caching halaman dan caching halaman parsial dalam aplikasi MVC. Namun, saya ingin tahu bagaimana cara menyimpan data.
Dalam skenario saya, saya akan menggunakan LINQ untuk Entitas (kerangka kerja entitas). Pada panggilan pertama ke GetNames (atau apa pun metodenya), saya ingin mengambil data dari database. Saya ingin menyimpan hasil dalam cache dan pada panggilan kedua untuk menggunakan versi yang di-cache jika ada.
Adakah yang bisa menunjukkan contoh bagaimana ini akan bekerja, di mana ini harus dilaksanakan (model?) Dan jika itu akan berhasil.
Saya telah melihat ini dilakukan dalam aplikasi ASP.NET tradisional, biasanya untuk data yang sangat statis.
asp.net-mvc
database
caching
Coolcoder
sumber
sumber
Jawaban:
Referensi dll System.Web dalam model Anda dan gunakan System.Web.Caching.Cache
Sedikit disederhanakan tapi saya kira itu akan berhasil. Ini bukan MVC spesifik dan saya selalu menggunakan metode ini untuk menyimpan data.
sumber
DB.GetNames().AsQueryable
metode menunda kueri?Inilah kelas / layanan cache pembantu yang bagus dan sederhana yang saya gunakan:
Pemakaian:
Penyedia cache akan memeriksa apakah ada sesuatu dengan nama "id cache" dalam cache, dan jika tidak ada, itu akan memanggil metode delegasi untuk mengambil data dan menyimpannya dalam cache.
Contoh:
sumber
Saya merujuk ke posting TT dan menyarankan pendekatan berikut:
Referensi dll System.Web dalam model Anda dan gunakan System.Web.Caching.Cache
Anda seharusnya tidak mengembalikan nilai yang dibaca ulang dari cache, karena Anda tidak akan pernah tahu apakah pada saat itu masih dalam cache. Bahkan jika Anda memasukkannya dalam pernyataan sebelumnya, itu mungkin sudah hilang atau belum pernah ditambahkan ke cache - Anda tidak tahu.
Jadi Anda menambahkan data yang dibaca dari database dan mengembalikannya secara langsung, bukan membaca ulang dari cache.
sumber
Cache["names"] = noms;
dimasukkan ke dalam cache?Untuk .NET 4.5+ framework
tambahkan referensi:
System.Runtime.Caching
tambahkan menggunakan pernyataan:
using System.Runtime.Caching;
Info lebih lanjut:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
sumber
Db.GerNames()
datangnya?Steve Smith melakukan dua posting blog luar biasa yang menunjukkan cara menggunakan pola CachedRepository di ASP.NET MVC. Ini menggunakan pola repositori secara efektif dan memungkinkan Anda mendapatkan caching tanpa harus mengubah kode yang ada.
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
Dalam dua posting ini dia menunjukkan kepada Anda bagaimana mengatur pola ini dan juga menjelaskan mengapa ini berguna. Dengan menggunakan pola ini Anda mendapatkan caching tanpa kode yang ada melihat logika caching. Pada dasarnya Anda menggunakan repositori dalam cache seolah-olah itu adalah repositori lainnya.
sumber
Caching AppFabric didistribusikan dan teknik caching dalam memori yang menyimpan data dalam pasangan nilai kunci menggunakan memori fisik di beberapa server. AppFabric memberikan peningkatan kinerja dan skalabilitas untuk aplikasi .NET Framework. Konsep dan Arsitektur
sumber
Memperluas jawaban @Hrvoje Hudo ...
Kode:
Contohnya
Caching item tunggal (ketika setiap item di-cache berdasarkan ID-nya karena caching seluruh katalog untuk jenis item akan terlalu intensif).
Caching semua hal
Mengapa TId
Pembantu kedua sangat baik karena sebagian besar kunci data tidak komposit. Metode tambahan dapat ditambahkan jika Anda sering menggunakan kunci komposit. Dengan cara ini Anda menghindari melakukan segala macam penggabungan string atau string. Format untuk mendapatkan kunci untuk meneruskan ke penolong cache. Ini juga membuat melewati metode akses data lebih mudah karena Anda tidak harus memasukkan ID ke dalam metode pembungkus ... semuanya menjadi sangat singkat dan konsisten untuk sebagian besar kasus penggunaan.
sumber
Inilah peningkatan jawaban Hrvoje Hudo. Implementasi ini memiliki beberapa peningkatan utama:
Perhatikan bahwa ini memiliki ketergantungan pada Newtonsoft.Json untuk membuat serialisasi objek dependOn, tetapi itu dapat dengan mudah diganti untuk metode serialisasi lainnya.
ICache.cs
InMemoryCache.cs
Pemakaian:
sumber
if (item == null)
harus berada di dalam kunci. Sekarang ketika iniif
sebelum kunci, kondisi lomba dapat terjadi. Atau bahkan lebih baik, Anda harus menyimpanif
sebelum kunci, tetapi periksa kembali apakah cache masih kosong sebagai baris pertama di dalam kunci. Karena jika dua utas datang pada saat yang sama, keduanya memperbarui cache. Kunci Anda saat ini tidak membantu.sumber
Saya telah menggunakannya dengan cara ini dan itu bekerja untuk saya. https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx parameter info untuk system.web.caching.cache.add.
sumber
Saya menggunakan dua kelas. Pertama, objek inti cache:
Yang kedua adalah daftar objek cache:
sumber
Saya akan mengatakan menerapkan Singleton pada masalah data yang ada dapat menjadi solusi untuk masalah ini jika Anda menemukan solusi sebelumnya jauh lebih rumit
sumber
sumber
Anda juga dapat mencoba dan menggunakan caching yang ada di dalam ASP MVC:
Tambahkan atribut berikut ke metode pengontrol yang ingin Anda cache:
Dalam hal ini, ActionResult ini akan di-cache selama 10 detik.
Lebih lanjut tentang ini di sini
sumber