Caching dan Prestasi dalam Lucee: Panduan Lengkap
Panduan caching Lucee untuk prestasi CFML: template cache, query cache, cachePut dan cacheGet, cfcache, membatalkan cache, dan mengukur prestasi aplikasi.

Kandungan
- Caching dan Prestasi dalam Lucee: Panduan Lengkap
- Mengapa Aplikasi CFML Perlu Caching
- Jenis Cache dalam Lucee
- Menyediakan Sambungan Cache dalam Application.cfc
- Query Cache dengan cachedWithin
- Cache Objek dengan cachePut dan cacheGet
- Cache Halaman dan Blok dengan cfcache
- Template Cache dan Tetapan dalam Lucee Admin
- Cache Datasource dan Tetapan Lalai
- Membatalkan Cache dengan Betul
- Bila Caching Membahayakan: Data Basi
- Mengukur Prestasi Sebelum Mengoptimum
- Tetapan JVM dan Memori
- Soalan Lazim (FAQ)
- Sumber
Caching dan Prestasi dalam Lucee: Panduan Lengkap
Penulis: Thalhah · Tarikh: 16 Oktober 2026
Caching dalam Lucee bermaksud menyimpan hasil operasi yang mahal, seperti query pangkalan data yang perlahan, panggilan API luar atau pengiraan yang kompleks, supaya permintaan seterusnya boleh mengambil semula hasil itu daripada memori dan bukannya mengulang kerja yang sama. Lucee menyediakan lapisan cache yang boleh ditukar ganti dengan beberapa jenis cache untuk kegunaan berbeza. Artikel ini menerangkan cara menggunakan setiap jenis cache, cara membatalkan cache dengan betul, dan bila caching sebenarnya memudaratkan.
Mengapa Aplikasi CFML Perlu Caching
Setiap kali kod anda menjalankan operasi yang mahal, hasilnya dibuang sebaik sahaja permintaan tamat. Permintaan seterusnya akan melakukan kerja yang sama sekali lagi. Caching membolehkan anda mengekalkan hasil itu: satu permintaan melakukan kerja yang mahal, setiap permintaan berikutnya mendapat jawapan daripada memori sehingga anda memutuskan data itu sudah basi. Hasilnya, pangkalan data menerima lebih sedikit query dan halaman anda dimuatkan lebih pantas.
Rujuk panduan konfigurasi datasource kerana query cache sangat berkait dengan sambungan pangkalan data anda.
Jenis Cache dalam Lucee
Lucee tidak mempunyai satu cache tunggal. Ia mempunyai konsep jenis cache: object, query, function, template, resource, include, http, file dan webservice. Setiap jenis boleh dihalakan ke sambungan cache yang berbeza. Apabila satu sambungan ditetapkan sebagai default object cache, cachePut dan cacheGet menggunakannya secara automatik; apabila satu sambungan ialah default query cache, cachedWithin menggunakannya.
Backend cache boleh ditukar tanpa mengubah kod aplikasi. Lucee membawa cache RAM terbina dalam dan menyokong penyedia berasaskan sambungan seperti Redis, EHCache, DynamoDB, Memcached dan MongoDB. Mulakan dengan cache RAM kerana ia sifar konfigurasi; apabila satu pelayan tidak mencukupi, tukar kepada penyedia teragih seperti Redis.
Menyediakan Sambungan Cache dalam Application.cfc
Sebelum anda boleh menyimpan apa-apa, anda perlu sambungan cache. Cara paling mudah ialah dalam Application.cfc:
// Application.cfc
component {
this.cache.connections["myCache"] = {
class: 'lucee.runtime.cache.ram.RamCache',
storage: false,
custom: { timeToIdleSeconds: 3600, timeToLiveSeconds: 3600 },
default: 'object'
};
}
Kod ini mencipta cache RAM bernama myCache dan menjadikannya default object cache. Medan custom mengawal tempoh hidup entri, iaitu satu jam untuk idle timeout dan tempoh mutlak. Anda juga boleh menetapkan cache lalai bagi setiap jenis operasi, contohnya this.cache.query dan this.cache.template; satu cache hanya boleh menjadi lalai untuk satu jenis. Struktur penuh Application.cfc ada dalam panduan Application.cfc.
Query Cache dengan cachedWithin
Penggunaan cache yang paling biasa ialah mengcache hasil query supaya query yang sama menggunakan semula hasil yang dicache dan bukannya melanggar pangkalan data lagi:
<cfquery name="qProducts" cachedWithin="#createTimeSpan( 0, 0, 5, 0 )#">
SELECT * FROM products WHERE active = 1
</cfquery>
Query ini dicache selama lima minit. Lucee membina kunci cache daripada hash SQL dan parameternya, nama datasource, nama pengguna dan kata laluan, returntype serta maxrows. Nama query tidak termasuk dalam kunci, jadi dua query dengan SQL dan tetapan yang sama berkongsi satu entri cache.
cachedWithin juga berfungsi pada fungsi, cfhttp dan cffile; setiap set argumen unik mendapat entri sendiri. Kes khas cachedWithin="request" menyimpan hasil hanya untuk permintaan semasa menggunakan stor dalaman, tanpa sambungan cache.
Cache Objek dengan cachePut dan cacheGet
Aliran kerja teras untuk data sebarang jenis ialah cachePut dan cacheGet, yang menerima sebarang jenis CFML termasuk rentetan, struct, array, query dan komponen. Corak paling biasa ialah cache-aside, iaitu semak cache dahulu dan hanya lakukan kerja mahal apabila cache tersasar:
function getUserProfile( required string userId ) {
var cacheKey = "userProfile:" & arguments.userId;
var cached = cacheGet( cacheKey );
if ( !isNull( cached ) ) return cached;
var profile = queryExecute(
"SELECT name, email, plan FROM users WHERE id = :id",
{ id: arguments.userId }
);
cachePut( cacheKey, profile, createTimeSpan( 0, 0, 10, 0 ) );
return profile;
}
cachePut menerima dua argumen timespan pilihan: timeSpan untuk tamat mutlak, dan idleTime untuk tamat jika entri tidak diakses. Gunakan kunci berprefiks seperti user:42 supaya penapisan wildcard menjadi mudah kemudian.
Cache Halaman dan Blok dengan cfcache
cfcache mempercepat paparan halaman dengan mencipta fail sementara yang mengandungi HTML statik yang dikembalikan oleh halaman. Contoh ringkas:
<cfcache action="cache" timespan="#createTimeSpan( 0, 0, 10, 0 )#">
<cfoutput>#now()#</cfoutput>
</cfcache>
Atribut action menentukan kelakuan: cache untuk caching template sisi pelayan dan klien, content untuk mengcache hanya badan tag, put dan get untuk objek, serta flush untuk membuang halaman yang dicache. clientCache mengcache sisi klien sahaja, manakala serverCache untuk sisi pelayan sahaja. Mulai Lucee 7, useQueryString secara lalai FALSE, jadi query string tidak diambil kira kecuali anda menghidupkannya.
Template Cache dan Tetapan dalam Lucee Admin
Lucee menyusun fail CFM yang diubah suai kepada kelas Java baharu. Tetapan di bawah Performance/Caching dalam Lucee Admin menentukan bagaimana Lucee mengendalikan fail CFM yang berubah:
| Tetapan | Keterangan | Kesan prestasi |
|---|---|---|
| Never | Tidak pernah semak sama ada template berubah | Paling pantas, sesuai pengeluaran yang jarang berubah |
| Once | Semak hanya sekali setiap permintaan (lalai) | Imbangan terbaik antara kesegaran dan prestasi |
| Always | Semak setiap template pada setiap permintaan | Paling perlahan, hanya untuk pembangunan aktif |
Dokumentasi rasmi menunjukkan bezanya: untuk 10,000 gelung include, Never mengambil kira-kira 22 ms dan Once 23 ms, manakala Always kira-kira 345 ms. Di halaman yang sama anda boleh membuang template dan query cache dengan butang yang disediakan. Fungsi InspectTemplates() memaksa pelayan menyemak semula fail, dan pagePoolClear() mengosongkan page pool jika aplikasi anda menjana fail semasa permintaan.
Cache Datasource dan Tetapan Lalai
Apabila anda mengcache query dengan cachedWithin, Lucee menyimpan hasil dalam default query cache aplikasi. Kunci cache merangkumi nama datasource, jadi query yang sama terhadap datasource berbeza tidak bercampur. Anda boleh membuang cached query bagi satu datasource dengan cacheClear yang menyatakan tags dan nama datasource, atau memanggil systemCacheClear("query") untuk membuang keseluruhan default query cache. Untuk panduan menulis query yang selamat, lihat panduan cfquery dan cfqueryparam.
Membatalkan Cache dengan Betul
Menyimpan dalam cache itu mudah, tetapi membuang entri yang betul apabila data berubah adalah bahagian yang lebih sukar. Untuk membuang satu entri objek, gunakan cacheDelete dengan kunci tepat. Untuk membuang sekumpulan entri, gunakan cacheClear dengan penapis wildcard, contohnya cacheClear("user:*") membuang semua entri bermula user: tanpa menyentuh yang lain.
Untuk query yang dicache, Lucee 7.1 memperkenalkan cachedWithinFlush(), yang membuang satu cached query. Pada versi lama, jalankan query yang sama dengan timespan sifar. Query juga boleh ditag dengan atribut tags pada cfquery, kemudian dibuang berkumpulan dengan cacheClear yang menyasarkan tag itu dalam query cache. Jika anda perlukan kawalan penuh ke atas kunci, cache sendiri dengan cachePut dan cacheGet di bawah kunci berprefiks.
Bila Caching Membahayakan: Data Basi
Caching bukan ubat untuk semua masalah; setiap entri cache ialah keputusan untuk melayani data yang mungkin basi. Jangan cache data yang berubah setiap saat seperti baki stok masa nyata, dan jangan cache data sensitif per pengguna dalam cache kongsi kerana risiko pendedahan antara pengguna.
Satu lagi perangkap ialah cache yang terlalu agresif pada data penting. Jika tempoh tamat terlalu panjang, pengguna melihat maklumat lapuk tanpa anda sedari. Jika kesegaran penting, pendekkan timespan dan batalkan cache secara eksplisit dalam kod yang mengubah data, jangan bergantung pada tamat masa.
Mengukur Prestasi Sebelum Mengoptimum
Jangan optimum secara membuta tuli; ukur dahulu, kemudian optimum. Gunakan getTickCount() atau tag cftimer untuk merekod masa operasi sebelum dan selepas menambah cache, supaya anda tahu cache itu benar-benar membantu. Tanpa ukuran, anda mungkin mengcache operasi yang sudah pantas dan menambah overhead yang tidak perlu.
Ukur pada beban yang mewakili pengeluaran, bukan mesin pembangunan yang senyap. Satu query yang pantas secara individu boleh menjadi kesesakan apabila dipanggil ribuan kali serentak. Selepas mengcache, pantau kadar hit cache untuk memastikan entri digunakan semula.
Tetapan JVM dan Memori
Caching menyimpan data dalam memori, jadi saiz heap JVM menentukan berapa banyak yang boleh anda cache sebelum berlaku tekanan memori. Heap JVM dikawal oleh -Xms untuk saiz awal dan -Xmx untuk saiz maksimum. Pada imej Docker rasmi Lucee, pemboleh ubah LUCEE_JAVA_OPTS membawa nilai lalai "-Xms64m -Xmx512m". Dalam pemasangan bukan Docker, tetapkan nilai ini dalam skrip permulaan enjin servlet.
Lucee juga menyediakan pemboleh ubah persekitaran berkaitan memori. LUCEE_REQUESTTIMEOUT_MEMORYTHRESHOLD ialah nombor antara 0 dan 1 yang membolehkan Lucee menguatkuasakan request timeout hanya apabila penggunaan memori mencapai ambang itu. Tiga lagi mengawal pembersihan classloader: LUCEE_TEMPLATE_CLASSLOADER_INSPECTION_COUNT dengan lalai 1000, LUCEE_TEMPLATE_CLASSLOADER_INSPECTION_SIZE dengan lalai 100 MB, dan LUCEE_TEMPLATE_CLASSLOADER_INSPECTION_RATIO dengan lalai 3. Untuk gambaran prestasi yang lebih luas, baca Lucee 7 dan masa depan, dan untuk menjalankan Lucee dalam bekas, rujuk panduan deploy Docker.
Soalan Lazim (FAQ)
Apakah beza cachedWithin dan cachePut?
cachedWithin ialah atribut pada query, fungsi, cfhttp dan cffile yang mengcache hasil operasi secara automatik dengan kunci yang dibina Lucee. cachePut menyimpan sebarang nilai di bawah kunci yang anda pilih, memberi kawalan penuh ke atas kunci dan tamat.
Apakah beza cache objek dan cache query?
Kedua-duanya menggunakan lapisan cache yang sama tetapi pintu masuk berbeza. Cache objek digunakan oleh cachePut dan cacheGet, manakala cache query digunakan oleh cachedWithin.
Bagaimana cara membuang cache query dalam Lucee?
Guna cachedWithinFlush(namaQuery) dalam Lucee 7.1, jalankan semula query dengan timespan sifar pada versi lama, atau systemCacheClear("query") untuk membuang keseluruhan default query cache.
Bilakah saya tidak patut guna caching?
Jangan cache data yang berubah setiap saat, data yang kesegarannya kritikal, atau data sensitif per pengguna dalam cache kongsi, kerana risiko data basi dan pendedahan data.
Adakah cache RAM hilang apabila pelayan dimulakan semula?
Ya, cache RAM bersifat sementara dan hilang apabila pelayan dimulakan semula. Untuk data yang perlu kekal atau dikongsi merentas beberapa pelayan, guna penyedia cache berterusan seperti Redis atau EHCache.
Sumber
- Getting Started with Caching, docs.lucee.org
- Using cachedWithin, docs.lucee.org
- Invalidating and Grouping Cached Queries, docs.lucee.org
- Adding Caches via Application.cfc, docs.lucee.org
- cfcache tag reference, docs.lucee.org
- Template Performance / Caching, docs.lucee.org
- Environment Variables and System Properties, docs.lucee.org
- Laman rasmi Lucee