-
Notifications
You must be signed in to change notification settings - Fork 2
C. Cache
Bayangkan jika Anda mempunyai 10.000 pengguna website/aplikasi yang online dan mengakses data secara bersamaan, maka otomatis akan ada 10.000 query yang sama dikirim ke database server Anda. Dengan menggunakan cache, website/aplikasi Anda hanya akan mengirimkan 1 query ke database server Anda dan 9.999 sisanya akan ditangani oleh cache tersebut. Otomatis beban dari database server Anda akan berkurang secara drastis dan website/aplikasi Anda menjadi lebih responsive.
ScientiaApp menggunakan library PhpFastCache untuk menghandle cache.
Secara default driver yang digunakan adalah files, yang berarti semua cache yang digenerati akan disimpan dalam text file/plain text yang terletak pada src/ScientiaAPP/App/Cache/Api
Berikut adalah contoh konfigurasi driver menggunakan files
dan redis
Contoh konfigurasi yang digunakan, jika tidak ingin mengganti maka abaikan saja.
File: src/ScientiaAPP/Bootstrap/App.php
/* FastCachePHP - FileDriver
* Setup cache File Path
*/
CacheManager::setDefaultConfig(["path" => APP_PATH . "/Cache/Api"]);
/* Create Instance Cache */
$cache = CacheManager::getInstance("files");
Jika ingin menggunakan driver redis, maka konfigurasinya seperti berikut:
File: src/ScientiaAPP/Bootstrap/App.php
/* FastCachePHP - RedisDriver */
$cache = CacheManager::getInstance('redis', [
'host' => $conf['REDIS_HOST'],
'port' => $conf['REDIS_PORT'],
'password' => $conf['REDIS_PASS'],
'database' => $conf['REDIS_DB']
]);
Dan aktifkan konfigurasi redis pada file env.php
Ubah dari yang awalnya seperti berikut:
// 'REDIS_HOST' => '127.0.0.1',
// 'REDIS_PORT' => 6379,
// 'REDIS_PASS' => null,
// 'REDIS_DB' => null,
Menjadi seperti berikut:
'REDIS_HOST' => '127.0.0.1',
'REDIS_PORT' => 6379,
'REDIS_PASS' => null,
'REDIS_DB' => null,
Tentu saja sesuaikan dengan konfigurasi yang ada pada server redis Anda.
Ada beberapa cara untuk menginstansiasi cache pada ScientiaApp, yaitu dengan mengambil langsung dari $container
atau melalui properti yang dimiliki BaseController
jika Anda memanggil lewat controller.
Contoh inisiasi cache langsung dari $container
/* Constructor Model */
public function __construct(\Slim\Container $container)
{
/* Call Parent Constructor */
parent::__construct($container);
# Cache langsung dari $container
$this->Cacher = $container->cacher;
}
Contoh inisiasi dari properti BaseController
/* Controller */
private function contohFungsi()
{
# Cache dari properti BaseController
$Cacher = $this->InstanceCache;
}
public function sampleCache(int $id)
{
try {
$output = null;
//buat cache key untuk pengecekan cache
$cacheKey = hash('md5', 'sampleCache' . $id);
$CachedString = $this->InstanceCache->getItem($cacheKey);
//Cek apakah cache sudah ada/belum
if (!$CachedString->isHit()) {
// Jika belum, ambil data untuk di cache
$output = $this->fungsiAmbilData($id);
$CachedString->set($output)->expiresAfter(3600/*dalam detik*/)->addTag('tag-untuk-gruping-cache');
$this->Cacher->save($CachedString); //simpan data ke cache
}else { // Jika cache ditemukan, ambil data dari cache
$output = $CachedString->get();
}
return $output;
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
}
}
# Hapus cache dengan cache id
$cacheKey = hash('md5', 'sampleCache' . $id);
$this->InstanceCache->deleteItem($cacheKey);
# Hapus cache dengan tagname, bisa lebih dari 1 tagname
$this->InstanceCache->deleteItemsByTags(['tag-untuk-gruping-cache', 'tag-lain']);
Untuk lebih detil mengenai penggunaan cache ini, silahkan kunjungi PhpFastCache