|
| 1 | +# Caching data |
| 2 | + |
| 3 | +Caching data adalah tentang menyimpan beberapa variabel PHP ke dalam cache dan mengambilnya kembali dari cache. |
| 4 | +Ini juga menjadi fondasi untuk fitur caching yang lebih lanjut, seperti [caching halaman](page.md). |
| 5 | + |
| 6 | +Untuk menggunakan cache, pasang paket [yiisoft/cache](https://github.com/yiisoft/cache): |
| 7 | + |
| 8 | +```shell |
| 9 | +composer require yiisoft/cache |
| 10 | +``` |
| 11 | + |
| 12 | +Kode berikut adalah pola penggunaan umum caching data, di mana `$cache` merujuk ke |
| 13 | +instance `Cache` dari paket tersebut: |
| 14 | + |
| 15 | +```php |
| 16 | +public function getTopProducts(\Yiisoft\Cache\CacheInterface $cache): array |
| 17 | +{ |
| 18 | + $key = ['top-products', $count = 10]; |
| 19 | + |
| 20 | + // Try retrieving $data from cache. |
| 21 | + $data = $cache->getOrSet($key, function (\Psr\SimpleCache\CacheInterface $cache) use ($count) { |
| 22 | + // Can't find $data in cache, calculate it from scratch. |
| 23 | + return getTopProductsFromDatabase($count); |
| 24 | + }, 3600); |
| 25 | + |
| 26 | + return $data; |
| 27 | +} |
| 28 | +``` |
| 29 | + |
| 30 | +Ketika cache memiliki data yang terkait dengan `$key`, ia akan mengembalikan nilai yang di-cache. |
| 31 | +Jika tidak, ia akan mengeksekusi fungsi anonim yang diberikan untuk menghitung nilai yang akan di-cache dan dikembalikan. |
| 32 | + |
| 33 | +Jika fungsi anonim membutuhkan beberapa data dari scope luar, Anda dapat meneruskannya menggunakan pernyataan `use`. |
| 34 | + |
| 35 | +## Cache handlers |
| 36 | + |
| 37 | +Layanan cache menggunakan handler cache yang kompatibel dengan [PSR-16](https://www.php-fig.org/psr/psr-16/) yang merepresentasikan berbagai |
| 38 | +penyimpanan cache, seperti memori, berkas, dan basis data. |
| 39 | + |
| 40 | +Yii menyediakan handler berikut: |
| 41 | + |
| 42 | +- `NullCache` — placeholder cache yang tidak melakukan caching nyata. Tujuan handler ini adalah menyederhanakan |
| 43 | + kode yang perlu memeriksa ketersediaan cache. Misalnya, selama pengembangan atau jika server tidak memiliki |
| 44 | + dukungan cache, Anda dapat mengonfigurasi layanan cache untuk menggunakan handler ini. |
| 45 | + Saat Anda mengaktifkan dukungan cache nyata, Anda dapat beralih menggunakan handler cache yang sesuai. |
| 46 | + Pada kedua kasus, Anda dapat menggunakan kode yang sama tanpa pemeriksaan tambahan. |
| 47 | +- `ArrayCache` — menyediakan caching hanya untuk permintaan saat ini dengan menyimpan nilai dalam sebuah array. |
| 48 | +- [APCu](https://github.com/yiisoft/cache-apcu) — menggunakan ekstensi PHP [APC](https://secure.php.net/manual/en/book.apc.php). |
| 49 | + Ini bisa dianggap sebagai opsi tercepat saat berurusan dengan cache untuk aplikasi terpusat (mis., satu |
| 50 | + server, tanpa load balancer khusus, dll.). |
| 51 | +- [Database](https://github.com/yiisoft/cache-db) — menggunakan tabel basis data untuk menyimpan data yang di-cache. |
| 52 | +- [File](https://github.com/yiisoft/cache-file) — menggunakan berkas standar untuk menyimpan data yang di-cache. Ini sangat cocok |
| 53 | + untuk menyimpan potongan data besar, seperti konten halaman. |
| 54 | +- [Memcached](https://github.com/yiisoft/cache-memcached) — menggunakan ekstensi PHP [memcached](https://secure.php.net/manual/en/book.memcached.php). |
| 55 | + Ini bisa dianggap sebagai opsi tercepat saat berurusan dengan cache di aplikasi terdistribusi |
| 56 | + (mis., beberapa server, load balancer, dll.) |
| 57 | +- [Wincache](https://github.com/yiisoft/cache-wincache) — menggunakan ekstensi PHP [WinCache](https://iis.net/downloads/microsoft/wincache-extension) |
| 58 | + ([lihat juga](https://secure.php.net/manual/en/book.wincache.php)). |
| 59 | + |
| 60 | +[Anda dapat menemukan lebih banyak handler di packagist.org](https://packagist.org/providers/psr/simple-cache-implementation). |
| 61 | + |
| 62 | +> [!TIP] |
| 63 | +> Anda dapat menggunakan penyimpanan cache yang berbeda dalam aplikasi yang sama. Strategi umum adalah: |
| 64 | +> - Gunakan penyimpanan cache berbasis memori untuk menyimpan data kecil tetapi sering digunakan (mis., statistik) |
| 65 | +> - Gunakan penyimpanan cache berbasis berkas atau basis data untuk menyimpan data besar dan jarang digunakan (mis., konten halaman) |
| 66 | +
|
| 67 | +Handler cache biasanya disetel dalam [dependency injection container](../concept/di-container.md) sehingga dapat |
| 68 | +dikonfigurasi dan diakses secara global. |
| 69 | + |
| 70 | +Karena semua handler cache mendukung kumpulan API yang sama, Anda dapat menukar handler cache yang digunakan |
| 71 | +dengan yang lain. Anda dapat melakukannya dengan mengonfigurasi ulang aplikasi tanpa mengubah kode yang menggunakan cache. |
| 72 | + |
| 73 | +### Cache keys |
| 74 | + |
| 75 | +Sebuah kunci mengidentifikasi secara unik setiap item data yang disimpan di cache. Saat Anda menyimpan sebuah item data, |
| 76 | +Anda harus menentukan kunci untuknya. Nantinya, ketika Anda mengambil item data tersebut, Anda perlu memberikan |
| 77 | +kunci yang sesuai. |
| 78 | + |
| 79 | +Anda dapat menggunakan string atau nilai arbitrer sebagai kunci cache. Ketika kunci bukan string, ia akan |
| 80 | +diserialisasi menjadi string secara otomatis. |
| 81 | + |
| 82 | +Strategi umum dalam mendefinisikan kunci cache adalah menyertakan semua faktor penentu dalam bentuk array. |
| 83 | + |
| 84 | +Ketika aplikasi yang berbeda menggunakan penyimpanan cache yang sama, Anda harus menentukan prefiks kunci cache yang unik |
| 85 | +untuk setiap aplikasi guna menghindari konflik kunci cache. |
| 86 | +Anda dapat melakukannya dengan menggunakan dekorator `\Yiisoft\Cache\PrefixedCache`: |
| 87 | + |
| 88 | +```php |
| 89 | +$arrayCacheWithPrefix = new \Yiisoft\Cache\PrefixedCache(new \Yiisoft\Cache\ArrayCache(), 'myapp_'); |
| 90 | +$cache = new \Yiisoft\Cache\Cache($arrayCacheWithPrefix); |
| 91 | +``` |
| 92 | + |
| 93 | +### Cache expiration |
| 94 | + |
| 95 | +Item data yang disimpan di cache akan tetap di sana selamanya kecuali dihapus karena beberapa kebijakan |
| 96 | +caching. Misalnya, ruang cache penuh dan penyimpanan cache menghapus data tertua. |
| 97 | +Untuk mengubah perilaku ini, Anda dapat menyetel parameter TTL saat memanggil metode untuk menyimpan item data: |
| 98 | + |
| 99 | +```php |
| 100 | +$ttl = 3600; |
| 101 | +$data = $cache->getOrSet($key, function (\Psr\SimpleCache\CacheInterface $cache) use ($count) { |
| 102 | +return getTopProductsFromDatabase($count); |
| 103 | +}, $ttl); |
| 104 | +``` |
| 105 | + |
| 106 | +Parameter `$ttl` menunjukkan berapa detik item data dapat tetap valid di cache. Ketika Anda mengambil |
| 107 | +item data tersebut, jika waktu kedaluwarsanya telah lewat, metode akan mengeksekusi fungsi dan menyetel nilai yang dihasilkan |
| 108 | +ke dalam cache. |
| 109 | + |
| 110 | +Anda dapat menyetel TTL bawaan untuk cache: |
| 111 | + |
| 112 | +```php |
| 113 | +$cache = new \Yiisoft\Cache\Cache($arrayCache, 60 * 60); // 1 hour |
| 114 | +``` |
| 115 | + |
| 116 | +Selain itu, Anda dapat menginvalidasi kunci cache secara eksplisit: |
| 117 | + |
| 118 | +```php |
| 119 | +$cache->remove($key); |
| 120 | +``` |
| 121 | + |
| 122 | +### Invalidation dependencies |
| 123 | + |
| 124 | +Selain pengaturan kedaluwarsa, perubahan pada yang disebut sebagai **ketergantungan invalidasi** juga dapat menginvalidasi item data yang di-cache. |
| 125 | +Misalnya, `\Yiisoft\Cache\Dependency\FileDependency` merepresentasikan ketergantungan pada waktu modifikasi sebuah berkas. |
| 126 | +Ketika ketergantungan ini berubah, itu berarti ada sesuatu yang memodifikasi berkas terkait. |
| 127 | +Akibatnya, konten berkas yang usang yang ditemukan di cache harus diinvalidasi. |
| 128 | + |
| 129 | +Ketergantungan cache adalah objek dari kelas turunan `\Yiisoft\Cache\Dependency\Dependency`. Ketika Anda |
| 130 | +menyimpan sebuah item data ke cache, Anda dapat menyertakan objek ketergantungan cache terkait. Contohnya, |
| 131 | + |
| 132 | +```php |
| 133 | +/** |
| 134 | + * @var callable $callable |
| 135 | + * @var \Yiisoft\Cache\CacheInterface $cache |
| 136 | + */ |
| 137 | + |
| 138 | +use Yiisoft\Cache\Dependency\TagDependency; |
| 139 | + |
| 140 | +// Set many cache values marking both with a tag. |
| 141 | +$cache->getOrSet('item_42_price', $callable, null, new TagDependency('item_42')); |
| 142 | +$cache->getOrSet('item_42_total', $callable, 3600, new TagDependency('item_42')); |
| 143 | + |
| 144 | +// Trigger invalidation by tag. |
| 145 | +TagDependency::invalidate($cache, 'item_42'); |
| 146 | +``` |
| 147 | + |
| 148 | +Berikut ringkasan ketergantungan cache yang tersedia: |
| 149 | + |
| 150 | +- `\Yiisoft\Cache\Dependency\ValueDependency`: menginvalidasi cache ketika nilai yang ditentukan berubah. |
| 151 | +- `\Yiisoft\Cache\Dependency\CallbackDependency`: menginvalidasi cache ketika hasil dari callback PHP yang ditentukan |
| 152 | + berbeda. |
| 153 | +- `\Yiisoft\Cache\Dependency\FileDependency`: menginvalidasi cache ketika waktu modifikasi terakhir berkas berbeda. |
| 154 | +- `\Yiisoft\Cache\Dependency\TagDependency`: mengaitkan item data yang di-cache dengan satu atau banyak tag. Anda dapat menginvalidasi |
| 155 | + item data yang di-cache dengan tag tertentu dengan memanggil `TagDependency::invalidate()`. |
| 156 | + |
| 157 | +Anda dapat mengombinasikan banyak ketergantungan menggunakan `\Yiisoft\Cache\Dependency\AnyDependency` atau `\Yiisoft\Cache\Dependency\AllDependencies`. |
| 158 | + |
| 159 | +Untuk mengimplementasikan ketergantungan Anda sendiri, turunkan dari `\Yiisoft\Cache\Dependency\Dependency`. |
| 160 | + |
| 161 | +### Cache stampede prevention |
| 162 | + |
| 163 | +[Cache stampede](https://en.wikipedia.org/wiki/Cache_stampede) adalah jenis kegagalan berantai yang dapat terjadi ketika sistem komputasi paralel masif |
| 164 | +dengan mekanisme cache berada di bawah beban tinggi. |
| 165 | +Perilaku ini terkadang juga disebut dog-piling. |
| 166 | + |
| 167 | +`\Yiisoft\Cache\Cache` menggunakan algoritma bawaan "Probably early expiration" yang mencegah cache stampede. |
| 168 | +Algoritma ini secara acak memalsukan cache miss untuk satu pengguna sementara yang lain masih dilayani nilai dari cache. |
| 169 | +Anda dapat mengontrol perilakunya dengan parameter opsional kelima dari `getOrSet()`, yaitu nilai float bernama `$beta`. |
| 170 | +Secara bawaan, beta adalah `1.0`, yang biasanya sudah cukup. |
| 171 | +Semakin tinggi nilainya, semakin awal cache akan dibuat ulang. |
| 172 | + |
| 173 | +```php |
| 174 | +/** |
| 175 | + * @var mixed $key |
| 176 | + * @var callable $callable |
| 177 | + * @var \DateInterval $ttl |
| 178 | + * @var \Yiisoft\Cache\CacheInterface $cache |
| 179 | + * @var \Yiisoft\Cache\Dependency\Dependency $dependency |
| 180 | + */ |
| 181 | + |
| 182 | +$beta = 2.0; |
| 183 | +$cache->getOrSet($key, $callable, $ttl, $dependency, $beta); |
| 184 | +``` |
0 commit comments