Memanfaatkan Redis

Topic created · 1 Posts · 32 Views
  • redis-tutorial.png
    Redis(remote dictionary service) adalah salah satu database NoSQL yang pasti sering teman-teman dengar. Redis merupakan sebuah penyimpanan struktur data di dalam memory (bisa persistent juga di dalam disk) yang biasa digunakan sebagai database, cache atau message-broker.

    Redis mendukung banyak tipe struktur data seperti: Strings, Lists, Sets, Hashes, Sorted Sets, Geospatial Indexes, dan lain-lain yang teman-teman dapat lihat di halaman resmi redis.

    Kapan kita perlu redis?

    Penggunaan umum redis yang sering kita dengar adalah sebagai cache storage. Namun sebenarnya ada banyak kasus lainnya yang juga bisa kita gunakan, seperti: membuat personalized feed timeline seperti Twitter Timeline, membuat leaderboard, menyimpan session login, sebagai message broker, menghitung jarak geografi dalam radius, atau sebagai queue.

    Yuk kita bahas cases umum tersebut dan struktur data apa yang biasa digunakan.

    Redis sebagai Cache Storage

    Struktur data yang digunakan disini adalah String. Biasanya ketika servis backend melakukan proses yang memakan resource(komputasi) yang besar, ada baiknya proses tersebut dibuatkan mekanisme caching agar pada proses berikutnya tidak perlu melakukan komputasi lagi. Contoh:
    PS: kita akan menggunakan ioredis dalam contoh code

    async function getUser(req, res) {
        const userID = req.params.id;
        const CACHE_KEY = `get:user:${userID}`;
        const cache = await redis.get(CACHE_KEY)
    
        if (cache) {
            return res.json({
                success: true,
                data: JSON.parse(getCache)
            })
        }
    
        const user = await User.findBy(userID).get();
        
        await redis.set(CACHE_KEY, JSON.stringify(user))
    
        return res.json({
            success: true,
            data: user
        })
    }
    
    

    Redis sebagai Queue

    Biasanya dalam membuat program kita pasti menemukan sebuah proses membutuhkan waktu yang lama untuk diselesaikan. Contohnya pada kehidupan sehari-hari: Transcoding video pada youtube (setelah upload video di youtube tidak langsung terpublish), mengirim ribuan email newsletter, dan banyak lagi proses-proses yang biasa disebut blocking process.

    Nah, bagaimana cara agar proses tersebut tidak ngeblok proses lainnya? Dengan melempar proses tersebut ke thread yang berbeda dan dikerjakan dibelakang layar secara asynchronous (tidak blocking lagi deh 🐷 ). Di NodeJS queue favorit saya adalah Bull.(*saya enggak lagi promosi)

    Untuk contoh penggunaan code nya saya copas langsung dari README file Bull.

    var Queue = require('bull');
    
    var videoQueue = new Queue('video transcoding', 'redis://127.0.0.1:6379');
    videoQueue.process(function(job, done){
    
      // job.data contains the custom data passed when the job was created
      // job.id contains id of this job.
    
      // transcode video asynchronously and report progress
      job.progress(42);
    
      // call done when finished
      done();
    
      // or give a error if error
      done(new Error('error transcoding'));
    
      // or pass it a result
      done(null, { framerate: 29.5 /* etc... */ });
    
      // If the job throws an unhandled exception it is also handled correctly
      throw new Error('some unexpected error');
    });
    

    Redis sebagai Message Broker

    Kadang ketika kita memiliki service yang begitu banyak (microservice), kita membutuhkan sebuah perantara untuk memberitahu event yang sedang terjadi? Apa maksudnya? Misal kasusnya kaya gini:

    Ketika seorang pelanggan melakukan order,

    1. service order perlu memberitahu service notifikasi untuk mengirim notifikasi ke merchant
    2. service order perlu memberitahu service products untuk mengurangi jumlah stock nya
    3. service order juga perlu memberitahu service payment untuk melakukan pengurangan saldo

    Secara tradisional mungkin kita tinggal hit API dari tiap service, tapi lama-lama terlalu banyak API yang harus di-manage hanya untuk memberitahu user lain untuk melakukan A dan B, belum lagi kita perlu handle untuk failure case misal salah satu server tidak bisa diakses dan sebagainya.

    Saat itulah kita perlu sebuah message-broker atau bahasa sehari-harinya makelar pesan yang bertugas mengirimkan event. Langsung aja ke contoh ya wkwkkwk 😢

    const Redis = require("ioredis");
    const redis = new Redis();
    const pub = new Redis();
    
    const payload = JSON.stringify({
        orderID: 1,
        productIDs: [45,32],
        amount: 425000
    })
    
    pub.publish("order", payload);
    
    // di service backend lainnya
    redis.on("message", function (channel, message) {
        if(channel === "order") {
            console.log(message)
        }
    });
    

    Redis sebagai penghitung jarak Geospatial

    Bagaimana ojek online menentukan hanya driver dalam radius sekian yang boleh mengambil order kita? Ya, kita bisa menggunakan redis untuk menghitung jarak radius posisi driver dengan posisi restaurant atau posisi kita. Langsung ke contoh kode aja yuk.

    // dummy long lat ya guys
    const address = {
        id: 3,
        name: 'Rumah Osby',
        longitude: 0.0, 
        latitude: 0.0,
    }
    
    const store = {
        id: 1,
        name: 'Martabak Ena',
        longitude: 0.0,
        latitude: 0.0,
    }
    
    const geoKey = 'store_distance'
    const sourceMemberName = `${paramCase(store.name)}_${store.id}`
    const targetMemberName = `${paramCase(addr.name)}_${addr.id}`
    
    redis.geoadd(geoKey, store.longitude, store.latitude, sourceMemberName)
    redis.geoadd(geoKey, addr.longitude, addr.latitude, targetMemberName)
    
    const distance = await redis.geodist(geoKey, sourceMemberName, targetMemberName, 'km')
    
    console.log(distance) // 1.3
    

    Akhir kata

    Masih banyak kasus yang bisa kita selesaikan dengan memanfaatkan redis, beberapa yang kita baca diatas barusan adalah beberapa case yang super umum digunakan.

    Pemahaman struktur data sangat penting ketika menggunakan redis agar kita dapat menggunakan redis secara tepat guna. Di dalam dokumentasi redis juga sudah terdapat time-complexity dari setiap operasi redis. Contoh gambar dibawah ini:
    Screen Shot 2020-07-04 at 05.50.19.png

    Dan selalu ingat, redis sangat bagus digunakan untuk leaderboard dan menghitung, serta menyimpan cache. Mari kita belajar mengeksploitasi manfaatkan setiap struktur data yang ada di redis.

    Link terkait:

Log in to reply
 

Pengumuman!

Untuk yang baru join, jangan lupa perkenalkan dirimu disini ya

Juga jangan lupa baca ketentuan penggunaan di forum ini. Rekan-rekan bisa lihat disini.

Buat yang penasaran alasan dibuatnya forum BaliJS ini silakan baca disini.

Utas Populer Bulan Ini

Semeton Online

Forum Stats

0
Online

123
Users

91
Topics

453
Posts