PDT Modul4b Cache
PDT Modul4b Cache
PDT Modul4b Cache
Oleh:
Alam Rahmatulloh
Ricky Indra Gunawan
TASIKMALAYA
2022
MODUL IV
CACHE
A. Tujuan Praktikum
Praktikum diharapkan dapat :
1. Memahami Cache.
2. Mengimplementasikan Cache dengan NoSQL dalam aplikasi web berbasis Laravel.
B. Dasar Teori
1. Database Caching
Database cache biasa digunakan oleh para pengembang aplikasi berbasis web dengan
tujuan untuk meningkatkan kemampuan web menjadi lebih baik lagi. Keuntungan dalam
menggunakan database cache ini adalah pemrosesan data berlangsung lebih cepat, dan
mengurangi kinerja dari CPU. Caching ini menyimpan data-data seperti gambar dan file di
website ke dalam server dari website itu sendiri. Jadi pengguna dapat lebih cepat untuk
mengakses website tersebut. Dengan begitu kecepatan website akan meningkat dan akan
meningkatkan pengalaman pengguna.
Redis adalah pilihan tepat untuk mengimplementasikan cache dalam memori yang
tersedia sangat baik untuk mengurangi latensi akses data, meningkatkan throughput, dan
memudahkan muatan dari database dan aplikasi NoSQL atau relasional. Redis dapat
melayani item yang sering diminta pada waktu respons di bawah satu milidetik, dan
memungkinkan Anda untuk secara mudah menskalakan muatan yang lebih tinggi tanpa
menambah biaya backend yang lebih mahal. Cache hasil kueri database, cache sesi persisten,
cache halaman web, dan cache objek yang sering digunakan seperti gambar, file, dan
metadata semuanya merupakan contoh populer cache dengan Redis.
2. Redis
Redis, merupakan singkatan dari Remote Dictionary Server, adalah penyimpanan data
nilai-kunci, sumber terbuka, dan dalam memori yang cepat. Proyek ini dimulai ketika
Salvatore Sanfilippo, yang merupakan developer awal Redis, mencoba meningkatkan
skalabilitas perusahaan rintisan Italia miliknya. Dari sana, ia mengembangkan Redis, yang
sekarang digunakan sebagai basis data, cache, broker pesan, dan antrean.
2
Redis memberikan respons waktu di bawah satu milidetik yang memungkinkan jutaan
permintaan per detik untuk aplikasi waktu nyata pada industri seperti gaming, teknologi
iklan, layanan finansial, pemeliharaan kesehatan, dan IoT. Saat ini, Redis adalah salah satu
mesin sumber terbuka yang paling populer, dijuluki sebagai basis data "Paling Dicintai" oleh
Stack Overflow selama lima tahun berturut-turut. Karena kecepatan performanya, Redis
menjadi pilihan populer untuk caching, manajemen sesi, gaming, papan peringkat, analitik
waktu nyata, geospasial, ride-hailing, obrolan/olah pesan, streaming media, dan aplikasi
pub/sub.
Cara kerja Laravel dengan Redis :
Keterangan:
1. Cache hit: membaca data dari cache.
2. Cache miss (jika cache kosong): membaca data dari database.
3. Ambil data dari database.
4. Tulis data ke cache, untuk digunakan nanti.
C. Praktikum
Requirements :
1. PHP v8.0.12
2. PHP MongoDB Extension v1.11 (php_mongodb.dll)
3. Laravel Framework v8.x-dev [8.83.15]
4. Composer v2.1.12
5. XAMPP v3.3.0
6. Visual Studio Code atau Code Editor lainnya
7. MongoDB Community Edition v5.x
8. MongoDB Compass
3
9. Redis v3.2.100
10. JMeter
11. Internet Connection
Dengan arsitektur sebagai berikut.
Langkah-langkah :
composer --version
4
Setelah itu, buatlah project Laravel dengan menggunakan Composer.
5
Setelah itu, kita buka project tersebut dengan code editor.
6
pindahkan file php_mongodb.dll ke dalam folder ext yang berada di dalam folder php. Folder
php berada di dalam folder xampp. Biasanya, defaultnya berada di C:\xampp\php\ext.
Setelah itu, edit file php.ini yang terletak pada folder PHP yang berada di dalam folder
XAMPP atau biasanya berada di C:\xampp\php.
<?php
phpinfo();
?>
7
Setelah itu, nyalakan Apache dalam XAMPP.
Selanjutnya, kita kunjungi halaman php yang telah kita buat. Gambar di bawah ini
merupakan tampilan halaman web yang memuat informasi PHP, salah satunya memuat
informasi mengenai ekstensi yang dipakai.
8
Jika kita telusuri halaman web-nya dan menemukan mongodb, maka extension
php_mongodb.dll telah berhasil terpasang.
9
Setelah itu, kita atur file .env dengan pengaturan sebagai berikut.
DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=<nama database yang
diinginkan> DB_USERNAME=
DB_PASSWORD=
10
Setelah itu, masih dalam file yang sama, kita perlu mendefinisikan database
MongoDB dengan code snippet sebagai berikut ke dalam list ‘connections’.
'mongodb' => [
'driver' => 'mongodb',
'host' => env('DB_HOST',
'127.0.0.1'), 'port' =>
env('DB_PORT', 27017),
'database' =>
env('DB_DATABASE'), 'username'
=> env('DB_USERNAME'),
'password' =>
env('DB_PASSWORD'), 'options'
=> [
// here you can pass more settings to the Mongo
Driver Manager
// see
https://www.php.net/manual/en/mongodb- driver-
manager.construct.php under "Uri Options" for a list of
complete parameters that you can use
11
Setelah itu, kita beralih ke dalam file config/app.php. Di sini, kita menambahkan
package untuk MongoDB Service Provider. Kita tambahkan ke dalam list ‘providers’.
Jenssegers\Mongodb\MongodbServiceProvider::class,
Di sini, kita telah berhasil menghubungkan project Laravel kita dengan database
MongoDB.
12
3. Pemasangan Fungsi CRUD NoSQL dan DomPDF dalam Proyek Laravel
Pada tahapan ini, kita memasang sistem CRUD berbasis MongoDB dalam proyek
Laravel. Pertama, buatlah model Buku :
Setelah itu, kita lakukan migrasi database terlebih dahulu. Jalankan perintah :
Php artisan migrate
Selanjutnya kita membuat controller untuk Buku. Jalankan perintah :
php artisan make:controller BukuController
13
Langkah berikutnya yaitu kita melakukan routing.
Route::get('/', [BukuController::class, 'index'])->name('home');
14
D:\Web\cache-mongodb-laravel\app\Http\Controllers\BukuController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Buku;
use Barryvdh\DomPDF\Facade as PDF;
15
Pada tahapan ini, kita memasang DomPDF, yang dimana kita nantinya bisa mencetak
tabel data dalam bentuk .pdf. Pertama, lakukan instalasi DomPDF dalam proyek Laravel. Ini
akan mengunduh paket dan pustaka dompdf + fontlib juga.
16
tambahkan package yang baru kita unduh pada bagian providers dan aliases dalam file
app.php agar Laravel mengenali package DomPDF ini.
17
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-
beta1/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-
giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1"
crossorigin="anonymous">
<!-- Font Awesome -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-
awesome/5.15.2/css/all.min.css" rel="stylesheet" integrity="sha512-
HK5fgLBL+xu6dm/Ii3z4xhlSUyZgTT9tuc/hSrtw6uzJOvgRr2a9jyxxT1ely+B+xFA
mJKVSTbpM/CuL7qxO8w==" crossorigin="anonymous"/>
<title>LIMAS Bookstore</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container-fluid">
<a class="navbar-brand" href="#">LIMAS Bookstore</a>
<button class="navbar-toggler" type="button" data-bs-
toggle="collapse" data-bs-target="#navbarNav" aria-
controls="navbarNav" aria-expanded="false" aria-label="Toggle
navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active" aria-current="page"
href="#">Home</a>
</li>
</ul>
</div>
</div>
</nav>
18
<tbody>
@php
$no = 1
@endphp
@foreach ($buku as $key => $value)
<tr class="text-center">
<th scope="row">{{ $no++ }}</th>
<td>{{ $value->judul }}</td>
<td>{{ $value->penerbit }}</td>
<td>{{ $value->harga }}</td>
<td>
<form action="{{ route('destroy', $value->id) }}"
method="POST">
<button type="button" class="btn btn-success btn-sm"
title="Update Data" data-bs-toggle="modal" data-bs-target="#modal-
update"
data-id="{{ $value->id }}"
data-judul="{{ $value->judul }}"
data-penerbit="{{ $value->penerbit }}"
data-harga="{{ $value->harga }}">
<i class="fas fa-pencil-alt"></i>
</button>
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm"
title="Delete Data"><i class="fas fa-trash"></i></button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@include('modal/modal-create')
@include('modal/modal-update')
<script type="text/javascript">
$(document).ready(function() {
$('#modal-update').on('show.bs.modal', function (event) {
var div = $(event.relatedTarget)
var modal = $(this)
modal.find('#id').attr("value", div.data('id'));
modal.find('#judul_buku_updt').attr("value",
div.data('judul'));
modal.find('#penerbit_buku_updt').attr("value",
div.data('penerbit'));
19
modal.find('#harga_buku_updt').attr("value", div.data('harga'));
});
window.setTimeout(function()
{
$(".alert").fadeTo(500, 0).slideUp(500,
function(){
$(this).remove();
});
}, 4000);
});
</script>
</body>
</html>
20
<label for="#" class="col-sm-3 col-form-label">Judul Buku</label>
<div class="col-sm-9">
<div class="col-sm-9">
<input name="penerbit_buku"> type="text" class="form-control"
</div>
</div>
<div class="row mb-3">
<labelfor="#"class="col-sm-3col-form- label">Harga</label>
<div class="col-sm-9">
<div class="modal-footer">
<buttontype="submit"class="btnbtn- primary">Tambah</button>
<button type="button" class="btn btn-secondary" data-bs- dismiss="modal">Clo
</div>
</form>
</div>
</div>
</div>
21
D:\Web\cache-mongodb-laravel\resources\views\modal\modal-update.blade.php
<div class="modal fade" id="modal-update" data-bs-backdrop="static"
data-bs-keyboard="false" tabindex="-1" aria-
labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">Ubah Data
Buku</h5>
<button type="button" class="btn-close" data-bs-
dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="frm_updt" method="post"
action="{{route('update')}}">
@csrf
@method('PUT')
<div class="row mb-3">
<label for="#" class="col-sm-3 col-form-label">Judul
Buku</label>
<div class="col-sm-9">
<input type="hidden" class="form-control" name="id"
id="id">
<input type="text" class="form-control"
name="judul_buku_updt" id="judul_buku_updt">
</div>
</div>
<div class="row mb-3">
<label for="#" class="col-sm-3 col-form-
label">Penerbit</label>
<div class="col-sm-9">
<input type="text" class="form-control"
name="penerbit_buku_updt" id="penerbit_buku_updt">
</div>
</div>
<div class="row mb-3">
<label for="#" class="col-sm-3 col-form-
label">Harga</label>
<div class="col-sm-9">
<input type="text" class="form-control"
name="harga_buku_updt" id="harga_buku_updt">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Ubah</button>
<button type="button" class="btn btn-secondary" data-bs-
dismiss="modal">Close</button>
</div>
</form>
</div>
</div>
</div>
22
File report.blade.php merupakan file untuk mengatur tampilan halaman .pdf yang
akan dicetak.
D:\Web\cache-mongodb-laravel\resources\views\report\report.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Book Data Report</title>
</head>
<style type="text/css">
table { border: solid 1px #000; border-collapse: collapse;
width: 100%; margin-top: 40px;}
tr th { font-size: 13px; border: solid 1px #000; padding: 8px
0; text-align: center; }
td { padding: 7px 5px; font-size: 12px; border: solid 1px
#000; text-align: center; }
h2 { text-align: center; }
</style>
<body>
<h2>Book Data Report</h2>
<table>
<thead>
<tr>
<th>No</th>
<th>Judul Buku</th>
<th>Penerbit</th>
<th>Harga</th>
</tr>
</thead>
<tbody>
@php
$no = 1;
@endphp
@foreach($buku as $key => $value)
<tr>
23
<td>{{ $no++ }}</td>
<td>{{$value->judul}}</td>
<td>{{$value->penerbit}}</td>
<td>{{$value->harga}}</td>
</tr>
@endforea
ch
</tbody>
</table>
</body>
Untuk melakukan uji coba web yang telah dibuat, lakukan perintah berikut ini.
php artisan
config:cache php
artisan cache:clear
24
Setelah melakukan perintah tersebut, maka kita akan melihat tampilan utama web.
Jika kita menekan tombol “+ Tambah Data” maka akan muncul modal untuk mengisi
data baru.
25
26
Setelah itu, kita coba tambahkan 1 data lagi.
Jika kita menekan tombol yang terdapat simbol pensil yang berada di dalam kolom
“Aksi”, maka akan muncul modal untuk mengupdate data yang berada di dalam baris data
tersebut.
27
28
Jika kita menekan tombol yang terdapat simbol keranjang sampah yang berada di
dalam kolom “Aksi”, maka data akan langsung terhapus.
29
Kita juga dapat mengecek data tersebut di dalam MongoDBCompass atau Mongosh
(MongoDB Shell).
30
Jika kita menekan tombol “Cetak ke PDF”, maka kita akan mengunduh file
book_data_report.pdf yang berisikan tabel data buku sesuai dengan tampilan yang telah
diatur dalam file D:\Web\cache-mongodb-laravel\resources\views\report\report.blade.php.
31
Dari langkah-langkah yang kita lakukan sejauh ini, kita telah berhasil membangun
website yang memiliki fungsi dasar seperti CRUD dan mencetak file .pdf dari data yang ada.
Selanjutnya, kita akan mengimplementasikan sistem cache.
4. Caching
Sebelumnya, kita perlu melakukan instalasi Redis ke dalam PC kita. Redis dapat
diunduh di https://github.com/microsoftarchive/redis/releases. Kali ini, Redis yang kita
gunakan yaitu versi 3.2.100. Di sini, kita cukup unduh Redis-x64-3.2.100.msi. Setelah
diunduh, kita buka file tersebut lalu ikuti langkah-langkah sesuai dengan instruksinya.
Setelah kita berhasil dalam instalasi Redis, kita dapat menjalankan redis-server
kemudian kita jalankan redis-cli.
Instalasi Redis dalam project Laravel dapat dilakukan dengan perintah berikut ini.
32
Setelah itu, kita mengubah pada bagian CACHE_DRIVER dari file menjadi redis
serta menambahkan REDIS_CLIENT=predis pada file .env.
Setelah itu, kita ubah juga pada bagian config/cache.php yang awalnya file menjadi
redis.
33
Untuk menerapkannya, kita cukup melakukan perintah berikut.
Jika
phptidak ada error, maka redis berhasil diterapkan.
artisan
config:cache php
34
Hasilnya yaitu sebagai berikut.
D:\Web\cache-mongodb-laravel\app\Http\Controllers\BukuController.php
<?php
namespace App\Http\Controllers;
35
use Illuminate\Http\Request;
use App\Models\Buku;
use Illuminate\Support\Facades\Cache;
use Barryvdh\DomPDF\Facade as PDF;
36
5. Pemasangan Laravel DebugBar untuk Melakukan Uji Coba Cache Redis
Laravel DebugBar dapat memberi kita informasi mengenai query apa saja yang telah
berjalan serta memberikan informasi mengenai response time.
Cara instalasi Laravel DebugBar ke dalam project kita adalah sebagai berikut.
Setelah itu, kita perlu memasukkan package ke dalam label ‘providers’ yang berada di
dalam file config/app.php.
37
Barryvdh\Debugbar\ServiceProvider::class,
Masih dalam file yang sama, kita juga perlu memasukkan package ke dalam label
‘aliases’ yang berada di dalam file config/app.php.
Setelah itu, kita perlu melakukan publish debugbar agar konfigurasi yang berasal dari
vendor dapat dipindahkan ke dalam konfigurasi utama project.
38
Setelah itu, kita dapat mencoba Laravel DebugBar yang baru saja kita pasang.
Pada gambar di bawah ini, kita dapat melihat response time serta query apa saja yang
dijalankan.
Jika kita menggunakan cache, ketika kita melakukan refresh, sistem tidak perlu
melakukan query lagi karena sudah tersimpan dalam cache sehingga response time-nya lebih
cepat daripada aplikasi yang tidak menggunakan cache.
39
Jika kita tidak menggunakan cache, ketika kita refresh halaman tersebut, sistem akan
melakukan query lagi ketika halaman di-refresh.
Data yang disimpan dalam cache dapat kita lihat dalam redis-cli.
40
6. Pengisian Data dan Pengujian Ulang Cache melalui Laravel DebugBar
Agar perubahan Response Time antara web yang menggunakan caching serta yang
tidak menggunakan caching dapat terlihat dengan jelas, di sini kita akan mencoba
memasukkan 1000 data ke dalam database MongoDB melalui file. File yang didukung oleh
MongoDB, diantaranya file yang berformat JSON dan CSV.
Pertama, kita masuk terlebih dahulu ke dalam database dan collection kita di
MongoDBCompass. Setelah itu, klik “ADD DATA” lalu klik “Import File”.
41
Setelah diklik, maka akan muncul modal box untuk melakukan import file ke dalam
database tersebut.
42
Setelah menekan tombol “IMPORT”, data yang berasal dari file tersebut akan
otomatis ditambahkan ke dalam collection database tersebut, yang dalam hal ini adalah
dengan database yang bernama book_db dan collection yang bernama buku. Di sini, dapat
kita lihat jumlah data/documents dalam collection tersebut menjadi 1,0k atau 1001 baris (1
data awal didapat dari operasi CREATE sebelumnya).
43
Setelah itu, kita dapat membandingkan kecepatannya.
44
Terlihat bahwa pada gambar pertama yang merupakan web yang tidak menggunakan
cache terdapat Response Time sebesar 215 ms dengan tambahan waktu query selama 1.18
ms.
Pada gambar kedua, ketika kita menggunakan cache, pada saat pertama kali kita
kunjungi website tersebut maka akan melakukan query seperti biasa. Namun, ketika kita
refresh/reload, maka data akan tersimpan di dalam cache sehingga web tersebut tidak perlu
melakukan query lagi. Selain itu, Response Time-nya pun jauh berkurang menjadi 158 ms.
45
7. JMeter Load Test/Stress Test
Untuk menguji serta membandingkan hasil response time antara aplikasi yang
menggunakan cache dengan yang tidak menggunakan cache dapat dilakukan uji load testing
atau stress test dengan menggunakan Apache JMeter.
Untuk menjalankan JMeter di Windows cukup klik dua kali jmeter.bat di dalam folder
apache-jmeter-5.4.1/bin/ atau buka command prompt dan ketik <file path>/apache-jmeter-
5.4.1/bin/jmeter.bat dan tunggu beberapa detik JMeter GUI akan diluncurkan.
46
Setelah itu, kita menggunakan HTTP Request.
47
Pada menu Thread Group, kita bisa menentukan Loop Count sesuai dengan kebutuhan.
48
Pada menu HTTP Request, kita perlu menentukan IP, Port serta Path yang akan diuji.
Pada menu Listener, kita perlu mencantumkan nama file yang akan digunakan sebagai
hasil output.
49
Setelah itu, kita dapat klik Play yang berada di menu atas.
Pada gambar di bawah ini merupakan hasil Load Testing/Stress Test pada aplikasi
yang menggunakan cache.
Pada gambar di bawah ini merupakan hasil Load Testing/Stress Test pada aplikasi
yang tidak menggunakan cache. Dapat terlihat Connect Time (ms) terdapat angka 19, yang
dimana lebih lama dibandingkan dengan gambar yang di atas.
50
Jika kita menyimpannya dalam .csv, kita dapat melakukan visualisasi dengan grafik
dalam aplikasi Microsoft Excel untuk membandingkan kedua test tersebut dengan jelas.
D. Kesimpulan
Database cache biasa digunakan oleh para pengembang aplikasi berbasis web dengan
tujuan untuk meningkatkan kemampuan web menjadi lebih baik lagi. Keuntungan dalam
menggunakan database cache ini adalah pemrosesan data berlangsung lebih cepat, dan
51
mengurangi kinerja dari CPU. Caching ini menyimpan data-data seperti gambar dan file di
website ke dalam server dari website itu sendiri. Jadi pengguna dapat lebih cepat untuk
mengakses website tersebut. Dengan begitu kecepatan website akan meningkat dan akan
meningkatkan pengalaman pengguna.
Redis, merupakan singkatan dari Remote Dictionary Server, adalah penyimpanan data
nilai-kunci, sumber terbuka, dan dalam memori yang cepat. Saat ini, Redis adalah salah satu
mesin sumber terbuka yang paling populer, dijuluki sebagai basis data "Paling Dicintai" oleh
Stack Overflow selama lima tahun berturut-turut. Karena kecepatan performanya, Redis
menjadi pilihan populer untuk caching, manajemen sesi, gaming, papan peringkat, analitik
waktu nyata, geospasial, ride-hailing, obrolan/olah pesan, streaming media, dan aplikasi
pub/sub.
52