Tair (Redis OSS-compatible) mendukung transaksi Redis. Gunakan perintah MULTI, EXEC, DISCARD, WATCH, dan UNWATCH untuk menjalankan operasi atomik.
Transaksi Redis berbeda dari transaksi database relasional. Jika suatu operasi gagal atau Anda menjalankan perintah DISCARD, Redis tidak melakukan rollback terhadap transaksi tersebut.
Contoh kode
Contoh 1: Dua client mengoperasikan kunci yang berbeda
Kode contoh:
package transcation.kvstore.aliyun.com;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
public class KVStoreTranscationTest {
static final String host = "xxxxxx.m.cnhza.kvstore.aliyuncs.com";
static final int port = 6379;
static final String password = "password";
// Catatan: Kedua kunci memiliki konten yang berbeda.
static String client1_key = "KVStore-Transcation-1";
static String client2_key = "KVStore-Transcation-2";
public static void main(String[] args) {
Jedis jedis = new Jedis(host, port);
String authString = jedis.auth(password); // Password instans (password)
if (!authString.equals("OK")) {
System.err.println("Autentikasi gagal: " + authString);
jedis.close();
return;
}
jedis.set(client1_key, "0");
// Mulai thread lain untuk mensimulasikan client lain.
new KVStoreTranscationTest().new OtherKVStoreClient().start();
Thread.sleep(500);
Transaction tx = jedis.multi();// Memulai transaksi.
// Operasi berikut dikirim ke server sebagai operasi atomik.
tx.incr(client1_key);
tx.incr(client1_key);
Thread.sleep(400);// Menjeda thread ini tidak memengaruhi operasi berurutan dalam transaksi. Thread lain juga tidak dapat menjalankan operasi.
tx.incr(client1_key);
Thread.sleep(300);// Menjeda thread ini tidak memengaruhi operasi berurutan dalam transaksi. Thread lain juga tidak dapat menjalankan operasi.
tx.incr(client1_key);
Thread.sleep(200);// Menjeda thread ini tidak memengaruhi operasi berurutan dalam transaksi. Thread lain juga tidak dapat menjalankan operasi.
tx.incr(client1_key);
List<Object> result = tx.exec();// Mengeksekusi transaksi.
// Mengurai dan mencetak hasilnya.
for(Object rt : result){
System.out.println("Client 1 > Dalam transaksi > "+rt.toString());
}
jedis.close();
}
class OtherKVStoreClient extends Thread{
@Override
public void run() {
Jedis jedis = new Jedis(host, port);
String authString = jedis.auth(password);// Password instans (password)
if (!authString.equals("OK")) {
System.err.println("AUTH Gagal: " + authString);
jedis.close();
return;
}
jedis.set(client2_key, "100");
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Client 2 > "+jedis.incr(client2_key));
}
jedis.close();
}
}
}
Jalankan program dengan endpoint dan kata sandi yang benar untuk instans Tair (Redis OSS-compatible) Anda. Pada keluaran, operasi transaksi client1 dieksekusi sebagai satu blok atomik. Client2 diblokir hingga transaksi selesai, meskipun menggunakan kunci yang berbeda.
Keluaran yang diharapkan:
Client 2 > 101
Client 2 > 102
Client 2 > 103
Client 2 > 104
Client 1 > Dalam transaksi > 1
Client 1 > Dalam transaksi > 2
Client 1 > Dalam transaksi > 3
Client 1 > Dalam transaksi > 4
Client 1 > Dalam transaksi > 5
Client 2 > 105
Client 2 > 106
Client 2 > 107
Client 2 > 108
Client 2 > 109
Client 2 > 110
Contoh 2: Dua client mengoperasikan kunci yang sama
Contoh ini memodifikasi Contoh 1 sehingga kedua klien mengoperasikan kunci yang sama. Sisa kode tidak berubah.
... ...
// Catatan: Kedua kunci kini memiliki konten yang sama.
static String client1_key = "KVStore-Transcation-1";
static String client2_key = "KVStore-Transcation-1";
... ...
Jalankan program yang telah dimodifikasi. Saat client1 menggunakan transaksi pada kunci bersama, client2 diblokir hingga transaksi selesai.
Client 2 > 101
Client 2 > 102
Client 2 > 103
Client 2 > 104
Client 1 > Dalam transaksi > 105
Client 1 > Dalam transaksi > 106
Client 1 > Dalam transaksi > 107
Client 1 > Dalam transaksi > 108
Client 1 > Dalam transaksi > 109
Client 2 > 110
Client 2 > 111
Client 2 > 112
Client 2 > 113
Client 2 > 114
Client 2 > 115