Jika Anda ingin mengimplementasikan penghitung untuk aplikasi online Anda, gunakan fitur atomic counter. Untuk menggunakannya, tetapkan sebuah kolom sebagai atomic counter dan lakukan operasi atomic counter pada kolom tersebut.
Scenarios
Atomic counter cocok untuk skenario yang memerlukan operasi penghitungan cepat, seperti menghitung jumlah tampilan halaman (PV) secara real-time pada berbagai topik, menghitung jumlah pesan di beberapa aplikasi online, serta menambah nilai kolom tertentu sebesar 1.
Ikhtisar
Atomic counter mengurangi overhead performa write yang disebabkan oleh konsistensi kuat. Saat Anda mengirim permintaan ke server untuk melakukan operasi read, modify, dan write (RMW), server menjalankan operasi tersebut pada suatu baris dengan mengunci baris tersebut. Untuk memastikan konsistensi data yang kuat, Anda dapat memperbarui atomic counter di server database guna meningkatkan performa write.
Kesalahan dapat terjadi ketika operasi atomic counter mengalami timeout jaringan atau kegagalan sistem. Dalam kasus ini, Anda dapat mencoba ulang operasi tersebut. Namun, atomic counter mungkin diperbarui dua kali, sehingga menghasilkan nilai yang lebih kecil atau lebih besar dari yang diharapkan. Kami menyarankan agar Anda menggunakan fitur conditional update untuk memperbarui nilai atomic counter secara tepat. Untuk informasi selengkapnya, lihat Conditional updates.
Anda dapat menggunakan fitur atomic counter untuk mengumpulkan statistik real-time atas data dalam suatu baris. Untuk mengimplementasikannya, panggil operasi UpdateRow guna menjalankan operasi pada atomic counter, seperti menambah atau mengurangi nilainya serta mengembalikan nilai yang telah diperbarui.
Sebagai contoh, Anda membuat tabel Tablestore untuk menyimpan metadata gambar dan menghitung jumlah gambar tersebut. Setiap baris dalam tabel memiliki ID pengguna. Satu kolom pada baris digunakan untuk menyimpan metadata gambar, sedangkan kolom lain berfungsi sebagai atomic counter untuk menghitung jumlah real-time gambar yang metadatanya disimpan dalam baris tersebut.
-
Saat Anda memanggil operasi UpdateRow untuk menambahkan metadata gambar ke suatu baris, nilai atomic counter akan bertambah 1.
-
Saat Anda memanggil operasi UpdateRow untuk menghapus metadata gambar dari suatu baris, nilai atomic counter akan berkurang 1.
-
Anda dapat memanggil operasi GetRow untuk membaca nilai atomic counter guna mendapatkan jumlah gambar yang metadatanya disimpan dalam baris tersebut.
Hal ini menjamin konsistensi database yang kuat. Saat Anda menambahkan metadata gambar ke suatu baris, nilai atomic counter baris tersebut akan bertambah 1, bukan berkurang 1.
Catatan Penggunaan
-
Anda hanya dapat mengimplementasikan atomic counter pada kolom bertipe INTEGER.
-
Jika kolom yang ditetapkan sebagai atomic counter belum ada sebelum Anda menulis data, nilai default-nya adalah 0. Jika kolom tersebut bukan bertipe INTEGER, kesalahan OTSParameterInvalid akan terjadi.
-
Anda dapat memperbarui atomic counter menggunakan angka positif atau negatif, tetapi harus menghindari integer overflow. Jika terjadi integer overflow, kesalahan OTSParameterInvalid akan dikembalikan.
-
Secara default, nilai atomic counter tidak dikembalikan dalam respons terhadap permintaan update row. Anda dapat menentukan agar nilai atomic counter yang diperbarui dikembalikan.
-
Anda tidak dapat menetapkan suatu kolom sebagai atomic counter sekaligus memperbarui kolom tersebut dalam satu permintaan update. Misalnya, jika Anda menetapkan Kolom A sebagai atomic counter, Anda tidak dapat melakukan operasi lain seperti overwrite atau delete pada kolom tersebut secara bersamaan.
-
Anda dapat melakukan beberapa operasi update pada baris yang sama dengan mengirim permintaan BatchWriteRow. Namun, jika Anda melakukan operasi atomic counter pada suatu baris, Anda hanya dapat melakukan satu operasi update pada baris tersebut dalam satu permintaan BatchWriteRow.
-
Hanya nilai versi terbaru dari atomic counter yang dapat diperbarui. Anda tidak dapat memperbarui nilai versi tertentu dari atomic counter. Setelah operasi update selesai, data versi baru dimasukkan ke dalam atomic counter pada baris tersebut.
Metode
Anda hanya dapat menggunakan fitur atomic counter melalui SDK Tablestore.
Anda dapat menggunakan fitur atomic counter dengan Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET, dan Tablestore SDK for PHP. Pada contoh ini, digunakan Tablestore SDK for Java.
Kode berikut memberikan contoh cara menggunakan rowUpdateChange untuk menambah nilai atomic counter dan mengembalikan nilai yang telah ditambahkan:
private static void incrementByUpdateRowApi(SyncClient client) {
// Specify the primary key.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk0"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// Specify the table.
RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey);
// Set the price column as an atomic counter and increase the value of the atomic counter by 10. You cannot specify the timestamp.
rowUpdateChange.increment(new Column("price", ColumnValue.fromLong(10)));
// Set the data type of the value to return to ReturnType.RT_AFTER_MODIFY and return the value of the atomic counter.
rowUpdateChange.addReturnColumn("price");
rowUpdateChange.setReturnType(ReturnType.RT_AFTER_MODIFY);
// Initiate a request to update the row.
UpdateRowResponse response = client.updateRow(new UpdateRowRequest(rowUpdateChange));
// Display the updated values.
Row row = response.getRow();
System.out.println(row);
}
Penagihan
Pengimplementasian atomic counter tidak memengaruhi aturan penagihan yang berlaku. Untuk informasi selengkapnya tentang penagihan, lihat Billing overview.