Skip to content

C. Cache

Benedict E. Pranata edited this page Jul 16, 2019 · 3 revisions

Mengapa Menggunakan 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.

Default Cache

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

Driver Files

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");

Driver Redis

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.

Inisiasi Cache

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;
    }

Contoh Penggunaan Cache

Membuat cache

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());
        }
    }

Menghapus cache

# 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']);

Selengkapnya

Untuk lebih detil mengenai penggunaan cache ini, silahkan kunjungi PhpFastCache

Clone this wiki locally