Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Redis:Kondisi Balap dan Ulir Tunggal

Jika Redis Berulir Tunggal, lalu mengapa perlu mekanisme Penguncian sama sekali.

Redis memang (kebanyakan) berulir tunggal tetapi penguncian diperlukan ketika banyak klien mencoba melakukan hal yang berbeda pada kedekatan temporal yang berdekatan. Penguncian yang dibahas di RiA adalah persis seperti itu - memastikan bahwa hanya satu klien/utas yang melakukan tugas tertentu, atau memastikan pembaruan tidak salah.

Berikut adalah contoh mengapa Anda perlu mengunci meskipun Redis 'tunggal-threadedness:anggap Anda memiliki nilai di Redis, nomor misalnya disimpan di bawah kunci bernama foo . Kode aplikasi Anda membaca nomor itu (GET foo ), melakukan sesuatu (mis. menambahkan 1) dan menulisnya kembali (SET ). Saat Anda menjalankan kode dalam satu utas, beginilah tampilannya:

App               Redis
 |---- GET foo ---->|
 |<------ 1 --------|
 |                  |
 | thinking...      |
 |                  |
 |--- SET foo 2 --->|
 |<----- OK --------|

Sekarang mari kita lihat apa yang terjadi ketika dua klien aplikasi mencoba melakukan ini:

App 1             Redis              App 2
 |---- GET foo ---->|                  |
 |<------ 1 --------|<--- GET foo -----|
 |                  |------- 1 ------->|
 | thinking...      |                  |
 |                  |       thinking...|
 |--- SET foo 2 --->|                  |
 |<----- OK --------|<--- SET foo 2 ---|
 |                  |------ OK ------->|

Di sini Anda dapat langsung melihat apa yang terjadi tanpa mengunci, meskipun server (kebanyakan) berulir tunggal - alih-alih 3, foo 's value adalah 2. Saat Anda menambahkan lebih banyak utas/klien/aplikasi, banyak hal bisa menjadi salah dan sangat salah ketika banyak penulis mencoba memodifikasi data tanpa koordinasi (mis. mengunci).

Penguncian yang optimis hanyalah salah satu cara untuk melakukannya, yang ditawarkan Redis bawaan melalui WATCH mekanisme. Namun, terkadang optimisme - meskipun sifatnya santai dan bahagia - bukanlah solusi yang tepat sehingga Anda perlu menerapkan mekanisme yang lebih baik/maju/berbeda untuk mencegah kondisi balapan. Kunci seperti itu, bisa dibilang, dapat diterapkan bahkan di luar Redis, tetapi jika Anda sudah menggunakannya maka masuk akal untuk mengelola kunci Anda di dalamnya juga.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis dan Memcache atau hanya Redis?

  2. Apa struktur data dasar yang digunakan untuk Redis?

  3. Apa keuntungan menggunakan backend kustom sesi Gorilla?

  4. Mencari solusi antara menyetel banyak penghitung waktu atau menggunakan antrian tugas terjadwal

  5. PooledRedisClientManager tidak melepaskan koneksi