Bermain PHP dan Redis Menggunakan PRedis

Muhammad Arslan 15 Desember 2016

Bermain PHP dan Redis Menggunakan PRedis

Salah satu bahasa pemrograman yang mendukung Redis adalah PHP. Disini kita akan menggunakan library predis yang dibuat oleh Nrk. Saat ini star-nya di Github mencapai 3.122 dengan fork sekitar 580-an. Package ini merupakan salah satu dari sekian package yang dapat terhubung ke Redis yang paling aktif pengembangannya. Oleh karena itu kita akan sedikit bermain dengan PHP dan Redis menggunakan package ini.

Instalasi

Untuk instalasi library kita dapat menggunakan Composer. Pertama kita buat terlebih dahulu sebuah folder yang akan menyimpan file percobaan kita:
$ mkdir redis-demo
$ cd redis-demo
$ composer require predis/predis
$ ls -l
composer.json  composer.lock vendor
Sekarang silahkan buat sebuah file dengan nama connect.php di dalam folder redis-demo. Lalu buat kode berikut di dalam file tersebut:
<?php

require_once DIR . '/vendor/autoload.php';

use Predis\Client;

try { $redis = new Client(); printf("Connection to redis has been established...\n"); } catch (Exception $e) { die ($e->getMessage()); }

?>

Pada kode diatas kita gunakan library yang ada di dalam folder vendor. Kemudian kita gunakan class Client yang dimiliki oleh predis. Selanjutnya kita buat client baru dan kita pastikan bahwa koneksi ke Redis sudah menyala. Sekarang kita coba jalankan via Terminal atau command line:

$ php connect.php 
Connection to redis has been established...
$ 

Yeayyy, kamu berhasil terhubung ke Redis melalui PHP :D. Sekarang siapkan dirimu untuk operasi - operasi dasar Redis menggunakan PRedis.

Operasi Dasar pada Key

Sebagai perkenalan, sekarang kita akan mencoba method get dan set untuk menyimpan suatu key beserta nilainya. Silahkan buat sebuah file bernama key.php kemudian buat kode berikut di dalamnya:
<?php

require_once DIR . '/vendor/autoload.php';

use Predis\Client;

try { $redis = new Client();

$redis-&gt;set('user:12345', 'muhammad arslan');

$user = $redis-&gt;get('user:12345');

echo $user."\n";

} catch (Exception $e) { die ($e->getMessage()); }

?>

Bila dijalankan di terminal, maka akan muncul output berikut:

$ php key.php 
muhammad arslan

Kamu juga dapat membubuhkan waktu basi terhadap suatu key. Sebenarnya agak kurang cocok bila waktu basi, mari kita namai saja waktu kadaluwarsa. Dengan menggunakan method setex() kamu dapat menambahkan waktu kadaluwarsa pada suatu key. Dan bila ingin melihat berapa lama lagi key tersebut sampai kadaluwarsa, kamu dapat memeriksanya dengan menggunakan method ttl().

Silahkan buat file dengan nama key_expire.php dan buat kode berikut:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use Predis\Client;

try {
    $redis = new Client();

    $redis->setex('cart:12345', 10, "{\"nama\":\"shampoo jwitsal\", \"amount\":\"10\"}");

    $run = true;

    while ($run){
        $cart = $redis->get('cart:12345');
        echo $cart."\n";

        $ttl = $redis->ttl('cart:12345');
        echo "ttl: ".$ttl."\n";

        sleep(1);

        if ($ttl < 0)
        {
            $run = false;
        }
    }
}
catch (Exception $e) {
    die ($e->getMessage());
}

?>

Bila kita jalankan kode diatas, kita akan melihat bahwa setiap detik key akan kadaluwarsa:

$ php key_expire.php 
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 10
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 9
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 8
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 7
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 6
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 5
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 4
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 3
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 2
{"nama":"shampoo jwitsal", "amount":"10"}
ttl: 1

ttl: -2

Kamu pun dapat melakukan operasi increment atau decrement terhadap suatu key yang berisi angka dengan menggunakan method incr() dan decr():

<?php

require_once __DIR__ . '/vendor/autoload.php';

use Predis\Client;

try {
    $redis = new Client();

    $redis->set('visitor:home', 1);

    for ($i=0; $i < 10; $i++)
    {
        $redis->incr('visitor:home');
        echo $redis->get('visitor:home')."\n";
    }

    echo "\n";

    for ($i=0; $i < 10; $i++)
    {
        $redis->decr('visitor:home');
        echo $redis->get('visitor:home')."\n";
    }

}
catch (Exception $e) {
    die ($e->getMessage());
}

?>

Bila kita jalankan kode diatas, maka kita dapat melihat output berikut:

$ php key_incr_decr.php 
2
3
4
5
6
7
8
9
10
11

10
9
8
7
6
5
4
3
2
1

Operasi Dasar pada Hash

Sekarang kita akan coba mengoperasikan berbagai method terkait Hash. Hash sendiri adalah sebuah struktur kompleks mirip JSON yang dapat menyimpan berbagai key dan value di dalam suatu key. Kita akan mencoba menyimpan sebuah struktur user yang terdiri dari name, email, dan dob. Silahkan buat file dengan nama hash.php kemudian buat kode berikut:
<?php

require_once DIR . '/vendor/autoload.php';

use Predis\Client;

try { $redis = new Client();

$redis-&gt;hset('user:123', 'name', 'arslan');
$redis-&gt;hset('user:123', 'email', 'arslan@gmail.com');
$redis-&gt;hset('user:123', 'dob', '1990-09-09');

print_r($redis-&gt;hgetall('user:123'));

echo $redis-&gt;hget('user:123', 'name')."\n";
echo $redis-&gt;hget('user:123', 'email')."\n";
echo $redis-&gt;hget('user:123', 'dob')."\n";

print_r($redis-&gt;hkeys('user:123'));
print_r($redis-&gt;hvals('user:123'));

echo $redis-&gt;hstrlen('user:123', 'name')."\n";
echo $redis-&gt;hlen('user:123')."\n";
echo $redis-&gt;hexists('user:123', 'email')."\n";
echo $redis-&gt;hexists('user:123', 'website')."\n";

$redis-&gt;hdel('user:123', 'dob')."\n";
echo $redis-&gt;hexists('user:123', 'dob')."\n";

$redis-&gt;del('user:123');

} catch (Exception $e) { die ($e->getMessage()); }

?>

Pada kode diatas, untuk menyimpan suatu key di dalam hash digunakan method hset(). Sedangkan untuk mengambil suatu nilai dari hash digunakan hget(), bila ingin semuanya diambil digunakan hgetall(). Bila ingin mengambil key-nya saja gunakan hkeys(), bila ingin nilainya saja gunakan hvals. Berikutnya ada hexists() untuk memeriksa apakah suatu key ada di dalam hash atau tidak.

Bila kita jalankan maka akan muncul output berikut:

$ php hash.php 
Array
(
    [name] => arslan
    [email] => arslan@gmail.com
    [dob] => 1990-09-09
)
arslan
arslan@gmail.com
1990-09-09
Array
(
    [0] => name
    [1] => email
    [2] => dob
)
Array
(
    [0] => arslan
    [1] => arslan@gmail.com
    [2] => 1990-09-09
)
6
3
1
0
0

Operasi Dasar pada List

Sekarang kita akan mencoba melakukan operasi list dengan menggunakan predis. Silahkan buat file dengan nama list.php dan buat kode berikut:
<?php

require_once DIR . '/vendor/autoload.php';

use Predis\Client;

try { $redis = new Client();

$redis-&gt;lpush('tim_bola', 'Persib');
$redis-&gt;lpush('tim_bola', 'Persipura');
$redis-&gt;lpush('tim_bola', 'Arema Cronus');
$redis-&gt;lpush('tim_bola', 'Madura United');

print_r($redis-&gt;lrange('tim_bola', 0, -1));

$redis-&gt;rpush('tim_bola', 'Mitra Kukar');
$redis-&gt;rpush('tim_bola', 'Semen Padang');
$redis-&gt;rpush('tim_bola', 'Persija');
$redis-&gt;rpush('tim_bola', 'PSM Makassar');

print_r($redis-&gt;lrange('tim_bola', 0, -1));

echo $redis-&gt;llen('tim_bola')."\n";

echo $redis-&gt;lindex('tim_bola', 1)."\n";
echo $redis-&gt;lindex('tim_bola', 2)."\n";
echo $redis-&gt;lindex('tim_bola', 4)."\n";
echo $redis-&gt;lindex('tim_bola', 5)."\n";
echo $redis-&gt;lindex('tim_bola', 10)."\n";

$redis-&gt;lset('tim_bola', 2, 'Persipura Jayapura FC');
print_r($redis-&gt;lrange('tim_bola', 0, -1));

$redis-&gt;lpop('tim_bola');
print_r($redis-&gt;lrange('tim_bola', 0, -1));

$redis-&gt;rpop('tim_bola');
print_r($redis-&gt;lrange('tim_bola', 0, -1));

$redis-&gt;lrem('tim_bola', 2, 'Persipura Jayapura FC');
print_r($redis-&gt;lrange('tim_bola', 0, -1));

$redis-&gt;del('tim_bola');

} catch (Exception $e) { die ($e->getMessage()); }

?>

Pada kode diatas, kamu dapat menggunakan lpush atau rpush untuk mengisi suatu list. Untuk menampilkan isi list, dapat menggunakan lrange. Untuk memeriksa panjang list dapat digunakan llen(). Untuk mengakses setiap elemen list dapat menggunakan lindex(). Sedangkan untuk mengubah salah satu isi list digunakanlah lset().

Bila ingin membuang suatu elemen pada list dapat menggunakan lpop(), rpop(), atau lrem().

Bila kita jalankan maka akan muncul output berikut:

$ php list.php 
Array
(
    [0] => Madura United
    [1] => Arema Cronus
    [2] => Persipura
    [3] => Persib
)
Array
(
    [0] => Madura United
    [1] => Arema Cronus
    [2] => Persipura
    [3] => Persib
    [4] => Mitra Kukar
    [5] => Semen Padang
    [6] => Persija
    [7] => PSM Makassar
)
8
Arema Cronus
Persipura
Mitra Kukar
Semen Padang

Array
(
    [0] => Madura United
    [1] => Arema Cronus
    [2] => Persipura Jayapura FC
    [3] => Persib
    [4] => Mitra Kukar
    [5] => Semen Padang
    [6] => Persija
    [7] => PSM Makassar
)
Array
(
    [0] => Arema Cronus
    [1] => Persipura Jayapura FC
    [2] => Persib
    [3] => Mitra Kukar
    [4] => Semen Padang
    [5] => Persija
    [6] => PSM Makassar
)
Array
(
    [0] => Arema Cronus
    [1] => Persipura Jayapura FC
    [2] => Persib
    [3] => Mitra Kukar
    [4] => Semen Padang
    [5] => Persija
)
Array
(
    [0] => Arema Cronus
    [1] => Persib
    [2] => Mitra Kukar
    [3] => Semen Padang
    [4] => Persija
)

Operasi Dasar pada Set

Pada dasarnya set hampir sama dengan list, hanya saja di dalam set tidak akan ada nilai yang duplikat. Sehingga bila kita mengisi suatu nilai yang sama berkali - kali, hanya satu saja yang akan disimpan. Sekarang silahkan buat file bernama set.php dan buat kode berikut:
<?php

require_once DIR . '/vendor/autoload.php';

use Predis\Client;

try { $redis = new Client();

$redis-&gt;sadd('employee', 'Smith');
$redis-&gt;sadd('employee', 'Paul');
$redis-&gt;sadd('employee', 'George');
$redis-&gt;sadd('employee', 'Timothy');
$redis-&gt;sadd('employee', 'Michael');
$redis-&gt;sadd('employee', 'Alan');

$redis-&gt;sadd('myset', 'Smith');
$redis-&gt;sadd('myset', 'Paul');
$redis-&gt;sadd('myset', 'George');
$redis-&gt;sadd('myset', 'George');
$redis-&gt;sadd('myset', 'George');
$redis-&gt;sadd('myset', 'Christopher');

print_r($redis-&gt;smembers('myset'));

echo $redis-&gt;sismember('myset', 'George')."\n";
echo $redis-&gt;sismember('myset', 'Alan')."\n";

echo $redis-&gt;srem('myset', 'Paul');
print_r($redis-&gt;smembers('myset'));

print_r($redis-&gt;sdiff('myset', 'employee'));
print_r($redis-&gt;sinter('myset', 'employee'));
print_r($redis-&gt;sunion('myset', 'employee'));

$redis-&gt;del('myset');
$redis-&gt;del('employee');

} catch (Exception $e) { die ($e->getMessage()); }

Untuk menambah elemen baru pada suatu set, kamu dapat menggunakan sadd(). Untuk mencetak isinya, kamu dapat menggunakan smembers(), sedangkan untuk memeriksa apakah suatu nilai merupakan anggota dari set dapat menggunakan sismember().

Untuk menghapus suatu nilai, dapat digunakan srem(). Dan karena ini merupakan set, kamu dapat melakukan operasi himpunan menggunakan sdiff(), sinter(), dan sunion().

Bila kita jalankan maka akan muncul output berikut:

$ php set.php 
Array
(
    [0] => Christopher
    [1] => Smith
    [2] => George
    [3] => Paul
)
1
0
1Array
(
    [0] => Christopher
    [1] => Smith
    [2] => George
)
Array
(
    [0] => Christopher
)
Array
(
    [0] => Smith
    [1] => George
)
Array
(
    [0] => Christopher
    [1] => Timothy
    [2] => Michael
    [3] => Paul
    [4] => Smith
    [5] => Alan
    [6] => George
)

Penutup

Dengan tutorial ini, diharapkan ada output yang dapat dikuasai seputar PHP dan Redis. Kamu dapat mulai memanfaatkan Redis untuk mencatat session, caching, atau menggunakannya sebagai sistem queue messaging dengan memanfaatkan package PHP lain. Selain itu, kamu juga mulai dapat bereksperimen Redis dengan memanfaatkan teknologi virtualisasi seperti Docker atau lainnya.

Referensi

  • https://github.com/nrk/predis
  • https://redis.io/documentation
(arslan/predis/redis)