全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Implementasikan kunci optimis berperforma tinggi menggunakan TairString

更新时间:Jul 02, 2025

Jika sejumlah besar permintaan dikirim untuk mengakses dan memperbarui sumber daya bersama yang disimpan di dalam instance secara bersamaan, mekanisme kontrol konkurensi yang akurat dan efisien diperlukan. Mekanisme ini harus dapat membantu Anda mencegah pengecualian logika dan kesalahan data. Salah satu mekanismenya adalah kunci optimis. Dibandingkan dengan Redis sumber terbuka, struktur data TairString dari Tair (Enterprise Edition) memungkinkan Anda mengimplementasikan kunci optimis untuk memberikan performa lebih tinggi dengan biaya lebih rendah.

Konkurensi dan last-writer-wins

Gambar berikut menunjukkan skenario khas di mana permintaan bersamaan menyebabkan kondisi balapan.

  1. Pada tahap awal, nilai key_1 adalah hello. Kunci tersebut bertipe string.

  2. Pada waktu t1, aplikasi 1 membaca nilai key_1 hello.

  3. Pada waktu t2, aplikasi 2 membaca nilai key_1 hello.

  4. Pada waktu t3, aplikasi 1 mengubah nilai key_1 menjadi world.

  5. Pada waktu t4, aplikasi 2 mengubah nilai key_1 menjadi universe.

Nilai key_1 ditentukan oleh operasi penulisan terakhir. Pada waktu t4, aplikasi 1 menganggap nilai key_1 sebagai world, tetapi nilai sebenarnya adalah universe. Hal ini menyebabkan potensi masalah dalam operasi selanjutnya. Proses ini dikenal sebagai last-writer-wins. Untuk menyelesaikan masalah yang disebabkan oleh last-writer-wins, pastikan bahwa operasi mengakses dan memperbarui data string bersifat atomik. Dengan kata lain, Anda harus mengubah data string, yang berfungsi sebagai sumber daya bersama, menjadi variabel atomik. Untuk melakukannya, Anda dapat mengimplementasikan kunci optimis berperforma tinggi menggunakan struktur data exString.

Implementasikan kunci optimis menggunakan TairString

TairString, juga dikenal sebagai string yang diperluas (exString), adalah struktur data string yang membawa nomor versi. String asli Redis hanya terdiri dari kunci dan nilai. TairStrings terdiri dari kunci, nilai, dan nomor versi. Oleh karena itu, TairString sangat ideal untuk kunci optimis. Untuk informasi lebih lanjut tentang perintah TairString, lihat exString.

Catatan

TairStrings berbeda dari string asli Redis. Perintah yang didukung oleh TairStrings dan string asli Redis tidak dapat dipertukarkan.

TairString memiliki fitur-fitur berikut:

  • Nomor versi disediakan untuk setiap kunci. Nomor versi menunjukkan versi saat ini dari kunci. Jika Anda menjalankan perintah EXSET untuk membuat kunci, nomor versi default dari kunci adalah 1.

  • Jika Anda menjalankan perintah EXGET untuk menanyakan kunci, Anda dapat mengambil nilai dua bidang: value dan version.

  • Saat Anda memperbarui nilai TairString, versinya diverifikasi. Jika verifikasi gagal, pesan kesalahan berikut dikembalikan: ERR update version is stale. Jika verifikasi berhasil, nilai TairString diperbarui, dan nomor versi secara otomatis bertambah 1.

  • TairString mengintegrasikan semua fitur Redis String kecuali operasi bit.

Karena fitur-fitur ini, mekanisme penguncian adalah hal yang alami bagi data TairString. TairString memudahkan implementasi kunci optimis. Contoh:

while(true){
    {value, version} = EXGET(key);      // Ambil nilai dan nomor versi dari kunci.
    value2 = update(...);               // Simpan nilai baru sebagai nilai 2.
    ret = EXSET(key, value2, version);  // Perbarui kunci dan tetapkan nilai kembali ke variabel ret.
    if(ret == OK)
       break;                           // Jika nilai kembali adalah OK, pembaruan berhasil dan loop while keluar.
    else if (ret.contains("version is stale"))     
       continue;                        // Jika nilai kembali berisi pesan kesalahan "version is stale", pembaruan gagal dan loop while diulang.
}
Catatan
  • Jika Anda menghapus TairString dan membuat TairString baru yang memiliki kunci sama dengan TairString yang dihapus, versi kunci TairString baru adalah 1. TairString baru tidak mewarisi versi kunci dari TairString yang dihapus.

  • Anda dapat menentukan opsi ABS untuk melewati verifikasi versi dan secara paksa menimpa versi saat ini untuk memperbarui TairString. Untuk informasi lebih lanjut, lihat EXSET.

Mengurangi konsumsi sumber daya untuk kunci optimis

Dalam kode sampel sebelumnya, jika klien lain memperbarui sumber daya bersama setelah Anda menjalankan perintah EXGET, Anda akan menerima pesan kegagalan pembaruan dan loop while diulang. Perintah EXGET dijalankan berulang kali untuk mengambil nilai dan nomor versi sumber daya bersama hingga pembaruan berhasil. Akibatnya, dua operasi I/O dilakukan untuk mengakses Tair dalam setiap loop while. Namun, Anda hanya perlu mengirim satu permintaan akses dalam setiap loop while dengan menggunakan perintah EXCAS dari TairString. Hal ini menghasilkan penurunan signifikan dalam konsumsi sumber daya sistem dan meningkatkan performa layanan dalam skenario konkurensi tinggi.

Saat Anda menjalankan perintah EXCAS, Anda dapat menentukan nomor versi dalam perintah untuk memverifikasi versi. Jika verifikasi berhasil, nilai TairString diperbarui. Jika verifikasi gagal, elemen-elemen berikut dikembalikan:

  • "ERR update version is stale"

  • Value

  • Version

Jika pembaruan gagal, perintah mengembalikan nomor versi saat ini dari TairString. Anda tidak perlu menjalankan query lain untuk mengambil nomor versi saat ini, dan hanya satu permintaan akses yang diperlukan untuk setiap loop while. Contoh kode:

while(true){
    {ret, value, version} = excas(key, new_value, old_version)    // Gunakan perintah CAS untuk mengganti nilai asli dengan nilai baru.
    if(ret == OK)
       break;                                                     // Jika nilai kembali adalah OK, pembaruan berhasil dan loop while keluar.
    else (if ret.contains("update version is stale"))            // Jika nilai kembali berisi pesan kesalahan "update version is stale", pembaruan gagal. Nilai-nilai dari variabel value dan old_version diperbarui.
       update(value);
       old_version = version;
 }