PDKT dengan Redis

Muhammad Arslan 14 Desember 2016

PDKT dengan Redis

Redis adalah salah satu database dari dunia NoQSL yang berbasis key-value store. Sistemnya yang in-memory membuat pengambilan data dari Redis menjadi lebih cepat, namun dapat juga persistent bila ingin menyimpan data kita ke disk. Redis memiliki sejumlah query yang pastinya mudah digunakan untuk menyimpan mulai dari data sederhana hingga data kompleks. Selain itu dokumentasinya yang lengkap membuat kamu dapat menguasai Redis tanpa harus banyak googling.

Kali ini kita akan melakukan kencan kilat bersama Redis, yang siapa tahu dapat bermanfaat untuk aplikasi web yang kamu kembangkan.

Instalasi

Instalasi Redis sendiri cukup mudah, kamu dapat mengunduh paket instalasi Redis dari https://redis.io/download. Kemudian tinggal ekstrak dan set path ke direktori Redis di .bashrc atau environment variable. Kamu dapat melihatnya pada langkah - langkah berikut:
$ wget http://download.redis.io/releases/redis-2.8.19.tar.gz
$ tar xzf redis-2.8.19.tar.gz
$ cd redis-2.8.19
$ make
Untuk menyalakan Redis, kamu dapat menjalankan perintah redis-server di terminal. Sehingga dapat melihat output seperti berikut:
$ redis-server
22384:C 11 Dec 13:03:01.876 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
22384:M 11 Dec 13:03:01.877 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.5 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 22384
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

22384:M 11 Dec 13:03:01.878 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 22384:M 11 Dec 13:03:01.878 # Server started, Redis version 3.2.5 22384:M 11 Dec 13:03:01.878 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 22384:M 11 Dec 13:03:01.878 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 22384:M 11 Dec 13:03:01.878 * DB loaded from disk: 0.000 seconds 22384:M 11 Dec 13:03:01.878 * The server is now ready to accept connections on port 6379

Untuk melakukan operasi terhadap Redis melalui terminal, kamu dapat menggunakan redis-cli. Sehingga dapat dilihat output seperti berikut:

$ redis-cli
127.0.0.1:6379> PING
PONG
127.0.0.1:6379>

Melakukan Operasi terhadap Key

Di Redis, kamu dapat menyimpan langsung bagaimana suatu key menyimpan informasi tertentu. Misal kamu dapat menyimpan informasi seperti berikut:
127.0.0.1:6379> set user:12345 ridwanbejo
OK
127.0.0.1:6379> get user:12345
"ridwanbejo"
Kamu juga dapat mengatur berapa lama key tersebut dapat hidup di dalam Redis. Kamu dapat menggunakan SETEX untuk menambahkan ekspirasi suatu key, dan memeriksanya dengan menggunakan TTL:
127.0.0.1:6379> SETEX cart:123 5 "{\"nama\":\"shampoo jwitsal\", \"amount\":\"10\"}"
OK
127.0.0.1:6379> GET cart:123
"{\"nama\":\"shampoo jwitsal\", \"amount\":\"10\"}"
127.0.0.1:6379> GET cart:123
"{\"nama\":\"shampoo jwitsal\", \"amount\":\"10\"}"
127.0.0.1:6379> TTL cart:123
(integer) 1
127.0.0.1:6379> TTL cart:123
(integer) -2
127.0.0.1:6379>
Yang unik lainnya adalah, kamu dapat melakukan operasi increment dan decrement terhadap suatu key:
127.0.0.1:6379> SET visitor:home 1
OK
127.0.0.1:6379> INCR visitor:home
(integer) 2
127.0.0.1:6379> INCR visitor:home
(integer) 3
127.0.0.1:6379> INCR visitor:home
(integer) 4
127.0.0.1:6379> INCR visitor:home
(integer) 5
127.0.0.1:6379> INCR visitor:home
(integer) 6
127.0.0.1:6379> INCR visitor:home
(integer) 7
127.0.0.1:6379> INCR visitor:home
(integer) 8
127.0.0.1:6379> GET visitor:home
"8"
127.0.0.1:6379> DECR visitor:home
(integer) 7
127.0.0.1:6379> DECR visitor:home
(integer) 6
127.0.0.1:6379> DECR visitor:home
(integer) 5
127.0.0.1:6379> DECR visitor:home
(integer) 4
127.0.0.1:6379> DECR visitor:home
(integer) 3
127.0.0.1:6379> DECR visitor:home
(integer) 2
127.0.0.1:6379> DECR visitor:home
(integer) 1
127.0.0.1:6379> GET visitor:home
"1"

Melakukan Operasi terhadap Hash

Hash adalah suatu tipe data di Redis yang dapat menyimpan banyak key di dalam suatu key. Cocok bila kamu ingin menyimpan suatu data user yang memiliki beberapa atribut. Berikut contoh operasi hash menggunakan perintah HSET, HGET, dan HGETALL:
127.0.0.1:6379> HSET user:123 name "arslan"
(integer) 1
127.0.0.1:6379> HSET user:123 email "arslan@gmail.com"
(integer) 1
127.0.0.1:6379> HSET user:123 dob "1990-09-09"
(integer) 1
127.0.0.1:6379> HGET user:123
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> HGETALL user:123
1) "name"
2) "arslan"
3) "email"
4) "arslan@gmail.com"
5) "dob"
6) "1990-09-09"
127.0.0.1:6379> HGET user:123 email
"arslan@gmail.com"
127.0.0.1:6379> HGET user:123 name
"arslan"
127.0.0.1:6379> HGET user:123 dob
"1990-09-09"
127.0.0.1:6379>
Selain itu kita dapat mengambil key-nya saja atau value-nya saja:
127.0.0.1:6379> HKEYS user:123
1) "name"
2) "email"
3) "dob"
127.0.0.1:6379> HVALS user:123
1) "arslan"
2) "arslan@gmail.com"
3) "1990-09-09"
127.0.0.1:6379>
Bila ingin mengetahui jumlah key yang ada di dalam suatu hash kamu dapat memeriksanya dengan HEXIST dan HSTRLEN:
127.0.0.1:6379> HSTRLEN user:123 name
(integer) 6
127.0.0.1:6379> HLEN user:123
(integer) 3
127.0.0.1:6379> HEXISTS user:123 email
(integer) 1
127.0.0.1:6379> HEXISTS user:123 website
(integer) 0
Kamu juga dapat menghapus key yang tidak diperlukan dari suatu hash dengan menggunakan HDEL:
127.0.0.1:6379> HDEL user:123 dob
(integer) 1
127.0.0.1:6379> HEXISTS user:123 dob
(integer) 0
127.0.0.1:6379>

Melakukan Operasi terhadap List

Sekarang kita akan bermain dengan List yang merupakan sebuah tipe data yang menyimpan sejumlah data di dalam suatu key. Kamu dapat memulainya dengan menggunakan LRANGE, RPUSH dan LPUSH:
127.0.0.1:6379> LPUSH tim_bola "Persib Bandung FC"
(integer) 1
127.0.0.1:6379> LPUSH tim_bola "Persipura Jayapura FC"
(integer) 2
127.0.0.1:6379> LPUSH tim_bola "Arema Cronus FC"
(integer) 3
127.0.0.1:6379> LPUSH tim_bola "Madura United FC"
(integer) 4
127.0.0.1:6379> LRANGE tim_bola 0 -1
1) "Madura United FC"
2) "Arema Cronus FC"
3) "Persipura Jayapura FC"
4) "Persib Bandung FC"
127.0.0.1:6379> LPUSH tim_bola "Mitra Kukar FC"
(integer) 5
127.0.0.1:6379> LPUSH tim_bola "Semen Padang FC"
(integer) 6
127.0.0.1:6379> RPUSH tim_bola "Persija Jakarta FC"
(integer) 7
127.0.0.1:6379> RPUSH tim_bola "PSM Makassar FC"
(integer) 8
127.0.0.1:6379> LRANGE tim_bola 0 -1
1) "Semen Padang FC"
2) "Mitra Kukar FC"
3) "Madura United FC"
4) "Arema Cronus FC"
5) "Persipura Jayapura FC"
6) "Persib Bandung FC"
7) "Persija Jakarta FC"
8) "PSM Makassar FC"
127.0.0.1:6379>
Dapat kita lihat bahwa LPUSH akan mengisi list dari sebelah "kiri", sedangkan RPUSH akan mengisi list dari sebelah kanan. Untuk menampilkannya, kamu dapat menggunakan LRANGE dengan melewatkan indeks awal yang akan ditampilkan sampai indeks ke berapa. Sekarang mari kita coba periksa panjang list yang telah kita buat dan coba akses beberapa value yang ada di dalam list:
127.0.0.1:6379> LLEN tim_bola
(integer) 8
127.0.0.1:6379> LINDEX tim_bola 1
"Mitra Kukar FC"
127.0.0.1:6379> LINDEX tim_bola 2
"Madura United FC"
127.0.0.1:6379> LINDEX tim_bola 4
"Persipura Jayapura FC"
127.0.0.1:6379> LINDEX tim_bola 5
"Persib Bandung FC"
127.0.0.1:6379> LINDEX tim_bola 10
(nil)
127.0.0.1:6379>
Untuk mengganti suatu nilai pada suatu indeks di dalam list, kamu dapat menggunakan LSET:
127.0.0.1:6379> LSET tim_bola 1 "Mitra Kutai Kartanegara FC"
OK
127.0.0.1:6379> LRANGE tim_bola 0 -1
1) "Semen Padang FC"
2) "Mitra Kutai Kartanegara FC"
3) "Madura United FC"
4) "Arema Cronus FC"
5) "Persipura Jayapura FC"
6) "Persib Bandung FC"
7) "Persija Jakarta FC"
8) "PSM Makassar FC"
127.0.0.1:6379>
Untuk menghapus suatu nilai di dalam list, kamu dapat menggunakan LPOP, RPOP, atau LREM:
127.0.0.1:6379> LPOP tim_bola
"Semen Padang FC"
127.0.0.1:6379> LRANGE tim_bola 0 -1
1) "Mitra Kutai Kartanegara FC"
2) "Madura United FC"
3) "Arema Cronus FC"
4) "Persipura Jayapura FC"
5) "Persib Bandung FC"
6) "Persija Jakarta FC"
7) "PSM Makassar FC"
127.0.0.1:6379> RPOP tim_bola
"PSM Makassar FC"
127.0.0.1:6379> LRANGE tim_bola 0 -1
1) "Mitra Kutai Kartanegara FC"
2) "Madura United FC"
3) "Arema Cronus FC"
4) "Persipura Jayapura FC"
5) "Persib Bandung FC"
6) "Persija Jakarta FC"
127.0.0.1:6379> LREM tim_bola 3 "Arema Cronus FC"
(integer) 1
127.0.0.1:6379> LRANGE tim_bola 0 -1
1) "Mitra Kutai Kartanegara FC"
2) "Madura United FC"
3) "Persipura Jayapura FC"
4) "Persib Bandung FC"
5) "Persija Jakarta FC"
127.0.0.1:6379>

Melakukan Operasi terhadap Set

Yang terakhir, kita akan bermain dengan Set. Dimana Set adalah sebuah tipe data yang menyimpan sejumlah data di dalam suatu key namun tidak memiliki urutan dan hanya dapat menyimpan satu nilai unik. Sekarang mari kita coba membuat sebuah set di dalam Redis dengan menggunakan perintah SADD:
127.0.0.1:6379> SADD myset Smith
(integer) 1
127.0.0.1:6379> SADD myset Paul
(integer) 1
127.0.0.1:6379> SADD myset George
(integer) 1
127.0.0.1:6379> SADD myset George
(integer) 0
127.0.0.1:6379> SADD myset George
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "George"
2) "Paul"
3) "Smith"
127.0.0.1:6379>
Kamu dapat memeriksa suatu nilai apakah anggota suatu set atau bukan dengan perintah SISMEMBER:
127.0.0.1:6379> SISMEMBER myset George
(integer) 1
127.0.0.1:6379> SISMEMBER myset Alan
(integer) 0
127.0.0.1:6379>
Untuk menghapus suatu nilai pada set dapat menggunakan SREM:
127.0.0.1:6379> SREM myset Paul
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "George"
2) "Smith"
Kamu juga dapat melakukan operasi himpunan seperti SUNION, SINTER, dan SDIFF:
127.0.0.1:6379> SMEMBERS myset
1) "George"
2) "Smith"
3) "Christoper"
127.0.0.1:6379> SMEMBERS employee
1) "George"
2) "Alan"
3) "Timothy"
4) "Michael"
5) "Paul"
6) "Smith"
127.0.0.1:6379> SDIFF myset employee
1) "Christoper"
127.0.0.1:6379> SINTER myset employee
1) "George"
2) "Smith"
127.0.0.1:6379> SUNION myset employee
1) "George"
2) "Alan"
3) "Timothy"
4) "Michael"
5) "Paul"
6) "Smith"
7) "Christoper"

Penutup

Redis sangat membantu kita bila ingin memiliki session engine atau cached engine yang lebih cepat dibandingkan berbasis file. Selain itu kemampuannya untuk menangani cluster dapat membantu kita untuk memadukan aplikasi kita dengan skalabilitas yang lebih baik. Saat ini sudah banyak wrapper yang dapat mempermudah kita untuk menggunakan Redis seperti:
  • redis-py untuk Python
  • redisco untuk Python, sebuah ORM untuk Redis
  • predis untuk PHP
  • redis untuk Node.js
  • dan lainnya
Sehingga produktivitas kamu tetap optimal dan terbantu dengan menggunakan wrapper yang telah disebutkan.

Referensi

  • http://redis.io/documentation
  • http://www.tutorialspoint.com/redis/
(arslan/redis)