Bermain Node.js dan Redis Menggunakan NodeRedis

Muhammad Arslan 17 Desember 2016

Bermain Node.js dan Redis Menggunakan NodeRedis

Salah satu bahasa pemrograman yang mendukung Redis adalah Node.js. Disini kita akan menggunakan library node_redis yang dibuat oleh NodeRedis. Saat ini star-nya di Github mencapai 7.012 dengan fork sekitar 974-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 Node.js dan Redis menggunakan package ini.

Instalasi

Untuk instalasi library kita dapat menggunakan NPM. Pertama kita buat terlebih dahulu sebuah folder yang akan menyimpan file percobaan kita:
$ mkdir redis-demo
$ cd redis-demo
$ npm install redis
$ ls -l
node_modules
Sekarang silahkan buat sebuah file dengan nama connect.js di dalam folder redis-demo. Lalu buat kode berikut di dalam file tersebut:
var redis = require('redis'),
    client = redis.createClient();

client.on('error', function(err){ console.log('Error ' + err); });

console.log('Connection is establishing now...');

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

$ node connect.js 
Connection is establishing now...

Yeayyy, kamu berhasil terhubung ke Redis melalui Node.js :D. Sekarang siapkan dirimu untuk operasi - operasi dasar Redis menggunakan NodeRedis.

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.js kemudian buat kode berikut di dalamnya:
var redis = require('redis'),
    client = redis.createClient();

client.on('error', function(err){ console.log('Error ' + err); });

client.set('user:123', 'muhammad arslan', redis.print); client.get('user:123', function(err, replies){ console.log(replies); });

Bila dijalankan di terminal, maka akan muncul output berikut:

$ node key.js 
Reply: OK
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.js dan buat kode berikut:

var redis = require('redis'),
    client = redis.createClient();

client.on('error', function(err){
    console.log('Error ' + err);
});

client.setex('cart:123', 10, "{\"nama\":\"shampoo jwitsal\", \"amount\":\"10\"}", redis.print);

setInterval(function(){
    client.get('cart:123', function(err, replies){
        console.log(replies);
    });

    client.ttl('cart:123', function(err, replies){
        console.log(replies);

        if (replies < 0 )
        {
            console.log('cart:123 has been expired...');
        }
    });

}, 1000);

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

$ node key_expire.js 
Reply: OK
{"nama":"shampoo jwitsal", "amount":"10"}
9
{"nama":"shampoo jwitsal", "amount":"10"}
8
{"nama":"shampoo jwitsal", "amount":"10"}
7
{"nama":"shampoo jwitsal", "amount":"10"}
6
{"nama":"shampoo jwitsal", "amount":"10"}
5
{"nama":"shampoo jwitsal", "amount":"10"}
4
{"nama":"shampoo jwitsal", "amount":"10"}
3
{"nama":"shampoo jwitsal", "amount":"10"}
2
{"nama":"shampoo jwitsal", "amount":"10"}
1
null
-2
cart:123 has been expired...
null
-2
cart:123 has been expired...

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

var redis = require('redis'),
    client = redis.createClient();

client.on('error', function(err){
    console.log('Error ' + err);
});

client.set('visitor:home', 1, redis.print);

for (i=0; i < 10; i++){
    client.incr('visitor:home');

    client.get('visitor:home', function(err, replies){
        console.log(replies);
    });
}

for (i=0; i < 10; i++){
    client.decr('visitor:home');

    client.get('visitor:home', function(err, replies){
        console.log(replies);
    });
}

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

$ node key_incr_decr.js 
Reply: OK
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.js kemudian buat kode berikut:
var redis = require('redis'),
    client = redis.createClient();

function print_val(err, replies){ console.log(replies); }

client.on('error', function(err){ console.log('Error ' + err); });

client.hset(['user:123', 'name', 'arslan'], redis.print); client.hset(['user:123', 'email', 'arslan@gmail.com'], redis.print); client.hset(['user:123', 'dob', '1990-09-09'], redis.print);

client.hgetall('user:123', print_val);

client.hget("user:123", 'name', print_val); client.hget("user:123", 'email', print_val); client.hget("user:123", 'dob', print_val);

client.hkeys("user:123", print_val); client.hvals("user:123", print_val);

client.hstrlen("user:123", 'name', print_val); client.hlen("user:123", print_val); client.hexists("user:123", 'name', print_val); client.hexists("user:123", 'website', print_val);

client.hdel('user:123', 'dob', redis.print); client.hexists("user:123", 'dob', print_val);

client.del('user:123');

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:

$ node hash.js 
Reply: 1
Reply: 1
Reply: 1
{ name: 'arslan', email: 'arslan@gmail.com', dob: '1990-09-09' }
arslan
arslan@gmail.com
1990-09-09
[ 'name', 'email', 'dob' ]
[ 'arslan', 'arslan@gmail.com', '1990-09-09' ]
6
3
1
0
Reply: 1
0

Operasi Dasar pada List

Sekarang kita akan mencoba melakukan operasi list dengan menggunakan predis. Silahkan buat file dengan nama list.js dan buat kode berikut:
var redis = require('redis'),
    client = redis.createClient();

function print_val(err, replies){ console.log(replies); }

client.on('error', function(err){ console.log('Error ' + err); });

client.lpush('tim_bola', 'Persib', redis.print); client.lpush('tim_bola', 'Persipura', redis.print); client.lpush('tim_bola', 'Arema Cronus', redis.print); client.lpush('tim_bola', 'Madura United', redis.print);

client.lrange('tim_bola', 0, -1, print_val);

client.rpush('tim_bola', 'Mitra Kukar', redis.print); client.rpush('tim_bola', 'Semen Padang', redis.print); client.rpush('tim_bola', 'Persija', redis.print); client.rpush('tim_bola', 'PSM Makassar', redis.print);

client.lrange('tim_bola', 0, -1, print_val); client.llen('tim_bola', print_val);

client.lindex('tim_bola', 1, print_val); client.lindex('tim_bola', 2, print_val); client.lindex('tim_bola', 4, print_val); client.lindex('tim_bola', 5, print_val); client.lindex('tim_bola', 10, print_val);

client.lset('tim_bola', 1, 'Persipura Jayapura FC', redis.print); client.lrange('tim_bola', 0, -1, print_val);

client.lpop('tim_bola', redis.print); client.lrange('tim_bola', 0, -1, print_val);

client.rpop('tim_bola', redis.print); client.lrange('tim_bola', 0, -1, print_val);

client.del('tim_bola', redis.print);

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() atau rpop().

Bila kita jalankan maka akan muncul output berikut:

$ node list.js 
Reply: 1
Reply: 2
Reply: 3
Reply: 4
[ 'Madura United', 'Arema Cronus', 'Persipura', 'Persib' ]
Reply: 5
Reply: 6
Reply: 7
Reply: 8
[ 'Madura United',
  'Arema Cronus',
  'Persipura',
  'Persib',
  'Mitra Kukar',
  'Semen Padang',
  'Persija',
  'PSM Makassar' ]
8
Arema Cronus
Persipura
Mitra Kukar
Semen Padang
null
Reply: OK
[ 'Madura United',
  'Persipura Jayapura FC',
  'Persipura',
  'Persib',
  'Mitra Kukar',
  'Semen Padang',
  'Persija',
  'PSM Makassar' ]
Reply: Madura United
[ 'Persipura Jayapura FC',
  'Persipura',
  'Persib',
  'Mitra Kukar',
  'Semen Padang',
  'Persija',
  'PSM Makassar' ]
Reply: PSM Makassar
[ 'Persipura Jayapura FC',
  'Persipura',
  'Persib',
  'Mitra Kukar',
  'Semen Padang',
  'Persija' ]
Reply: 1

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.js dan buat kode berikut:
var redis = require('redis'),
    client = redis.createClient();

function print_val(err, replies){ console.log(replies);; }

client.on('error', function(err){ console.log('Error ' + err); });;

client.sadd('myset', 'Andik', print_val); client.sadd('myset', 'Sergio', print_val); client.sadd('myset', 'Irfan', print_val); client.sadd('myset', 'Zola', print_val);

client.sadd('employee', 'Andik', print_val); client.sadd('employee', 'Sergio', print_val); client.sadd('employee', 'Lilipaly', print_val); client.sadd('employee', 'Beni', print_val); client.sadd('employee', 'Bayu', print_val); client.sadd('employee', 'Boaz', print_val); client.sadd('employee', 'Kurnia', print_val); client.sadd('employee', 'Rizky', print_val);

client.smembers('myset', print_val); client.sismember('myset', 'Andik', print_val); client.sismember('myset', 'Siroch Chatong', print_val);

client.srem('myset', 'Zola', redis.print); client.smembers('myset', print_val);

client.sdiff('employee', 'myset', print_val); client.sinter('employee', 'myset', print_val); client.sunion('employee', 'myset', print_val);

client.del('myset'); client.del('employee');

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:

$ node set.js 
1
1
1
1
1
1
1
1
1
1
1
1
[ 'Sergio', 'Zola', 'Andik', 'Irfan' ]
1
0
Reply: 1
[ 'Sergio', 'Andik', 'Irfan' ]
[ 'Boaz', 'Kurnia', 'Lilipaly', 'Beni', 'Bayu', 'Rizky' ]
[ 'Sergio', 'Andik' ]
[ 'Beni',
  'Sergio',
  'Bayu',
  'Rizky',
  'Kurnia',
  'Lilipaly',
  'Andik',
  'Irfan',
  'Boaz' ]

Penutup

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

Referensi

  • https://github.com/NodeRedis/node_redis
  • https://redis.io/documentation
(arslan/node_redis/redis)