全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Implementasi pencacah terbatas menggunakan TairString

更新时间:Jul 02, 2025

Dalam skenario penjualan kilat atau penawaran terbatas, Anda harus menangani puncak lalu lintas sebelum, selama, dan setelah periode penjualan. Pastikan juga jumlah pesanan yang diterima tidak melebihi stok produk yang tersedia. Untuk mengatasi tantangan ini, struktur data TairString dari Tair (Enterprise Edition) menyediakan cara sederhana dan efisien untuk mengimplementasikan pencacah terbatas, membantu menjaga jumlah pesanan tetap di bawah batas maksimum. Solusi ini juga berlaku untuk skenario lain yang memerlukan pembatasan laju atau pengendalian aliran.

Pencacah terbatas untuk penjualan kilat

exString adalah struktur data baru di Tair yang lebih kuat daripada Redis String asli, dengan semua fitur Redis String kecuali operasi bit.

Perintah EXINCRBY dan EXINCRBYFLOAT untuk TairStrings memiliki fungsi serupa dengan perintah INCRBY dan INCRBYFLOAT untuk string Redis asli. Perintah-perintah ini digunakan untuk menambah atau mengurangi nilai. Namun, EXINCRBY dan EXINCRBYFLOAT mendukung lebih banyak opsi, termasuk EX, NX, VER, MIN, dan MAX. Untuk informasi lebih lanjut, lihat exString. Solusi yang dijelaskan dalam topik ini menggunakan opsi MIN dan MAX. Tabel berikut menjelaskan kedua opsi tersebut.

Parameter

Deskripsi

MIN

Menentukan nilai minimum TairString.

MAX

Menentukan nilai maksimum TairString.

Menggunakan Redis String asli untuk menangani penjualan kilat membutuhkan kode yang kompleks dan sulit dikelola, berpotensi menyebabkan pesanan berlebih meskipun barang sudah habis terjual. Dengan TairString, Anda dapat menyusun dan menjalankan kode sederhana untuk membatasi jumlah pesanan secara akurat. Contoh pseudocode:

if(EXINCRBY(key_iphone, -1, MIN:0) == "would overflow")
    run_out();

Pencacah terbatas untuk pengendalian aliran

Seperti halnya pencacah terbatas untuk penjualan kilat, Anda dapat menggunakan opsi MAX dari perintah EXINCRBY untuk mengimplementasikan pencacah terbatas dalam pengendalian aliran. Contoh pseudocode:

if(EXINCRBY(rate_limitor, 1, MAX:1000) == "would overflow")
    traffic_control();

Pencacah terbatas untuk pengendalian aliran dapat digunakan untuk berbagai tujuan, seperti membatasi jumlah permintaan bersamaan, frekuensi akses, dan jumlah perubahan kata sandi. Misalnya, dalam skenario pembatasan konkurensi, lonjakan permintaan bersamaan dapat melebihi ambang kinerja sistem. Untuk mencegah kegagalan layanan, Anda dapat menggunakan pencacah terbatas sebagai solusi sementara untuk mengontrol jumlah permintaan bersamaan secara real-time. Jika ingin membatasi jumlah permintaan per detik (QPS), Anda dapat menggunakan perintah EXINCRBY pada TairStrings untuk menetapkan pencacah terbatas bagi permintaan bersamaan.

/**
 * tryAcquire bersifat thread-safe dan akan menambah kunci dari 0 hingga batas atas dalam interval waktu tertentu,
 * dan mengembalikan kegagalan begitu melebihi
 * @param key kunci
 * @param upperBound nilai maksimum
 * @param interval interval waktu
 * @return berhasil: true; gagal: false
 */
public static boolean tryAcquire(String key, int upperBound, int interval) {
    try (Jedis jedis = jedisPool.getResource()) {
        jedis.eval("if redis.call('exists', KEYS[1]) == 1 "
                + "then return redis.call('EXINCRBY', KEYS[1], '1', 'MAX', ARGV[1], 'KEEPTTL') "
                + "else return redis.call('EXSET', KEYS[1], 0, 'EX', ARGV[2]) end",
            Arrays.asList(key), Arrays.asList(String.valueOf(upperBound), String.valueOf(interval)));
        return true;
    } catch (Exception e) {
        if (e.getMessage().contains("increment or decrement would overflow")) {
            return false;
        }
        e.printStackTrace();
    }
    return false;
}