Bagaimanakah kunci di KV Store dikunci?

WBOY
Lepaskan: 2024-02-09 13:20:09
ke hadapan
911 orang telah melayarinya

KV Store 中的密钥是如何锁定的?

editor php Zimo akan mendedahkan rahsia kunci kunci di KV Store untuk anda. Di Kedai KV, penguncian kunci dicapai melalui satu siri algoritma dan teknologi yang kompleks. Pertama, sistem menjana pengecam unik untuk setiap kunci dan menyimpannya dengan nilai yang sepadan dalam pangkalan data. Pada masa yang sama, sistem juga akan menggunakan fungsi cincang untuk menyulitkan kunci bagi memastikan keselamatannya. Selain itu, sistem juga menggunakan senarai kawalan capaian (ACL) untuk menyekat akses kepada kunci supaya hanya pengguna yang diberi kuasa boleh melakukan operasi baca dan tulis. Melalui langkah keselamatan ini, KV Store memastikan keselamatan dan kebolehpercayaan kunci serta menyediakan perkhidmatan penyimpanan data yang selamat dan boleh dipercayai kepada pengguna.

Kandungan soalan

Saya sedang membina kedai kv teragih hanya untuk mengetahui lebih lanjut tentang sistem teragih dan konkurensi. Pelaksanaan storan kv yang saya bina adalah transaksional sepenuhnya, dengan log transaksi dalam ingatan. Untuk memastikan perkara mudah, storan juga berada dalam ingatan sepenuhnya. Api adalah awam getinsertupdateremove. Ambil perhatian bahawa semua titik akhir beroperasi pada satu kunci, bukan julat kunci.

Saya menguruskan konkurensi melalui kunci. Walau bagaimanapun, saya mempunyai kunci global yang mengunci keseluruhan stor data. Bunyi ini sangat tidak cekap, kerana jika saya ingin mengemas kini nilai k2 时读取 k1 , saya perlu menunggu sehingga k2 selesai mengemas kini, walaupun itu tidak relevan.

Saya tahu sesetengah pangkalan data menggunakan penguncian yang lebih halus. Sebagai contoh, dalam pelayan mysql terdapat kunci peringkat baris. Bagaimana untuk melaksanakan penguncian peringkat kunci?

Saya ada

type storage struct {
  store map[string]int32
}
Salin selepas log masuk

Perlukah saya menambah sesuatu seperti ini? :

type Storage struct {
  store map[string]int32
  locks map[string]mutex.Lock
}
Salin selepas log masuk

Jika saya melakukan ini, masalahnya ialah locks 必须与 store 保持同步。另一种选择是合并两个映射,但即便如此,如果 remove 请求出现在 get sebelum ini, saya juga mengalami masalah memadamkan entri dalam peta pada kunci.

Penyelesaian

Bahagian konsep

Berdagang

Pertama sekali, konsistensi yang kuat tidak memerlukan log transaksi. Log transaksi berguna untuk mengekalkan sifat asid.

Transaksi juga bukan satu keperluan yang ketat untuk konsistensi yang kukuh dalam pangkalan data, tetapi ia boleh menjadi alat yang berguna untuk memastikan konsistensi dalam banyak situasi.

Konsistensi yang kukuh merujuk kepada sifat yang memastikan bahawa semua bacaan daripada pangkalan data akan mengembalikan penulisan terkini, tidak kira di mana operasi baca dilakukan. Dalam erti kata lain, konsistensi yang kukuh menjamin bahawa semua pelanggan akan melihat data yang sama dan bahawa data itu akan dikemas kini dan konsisten di seluruh sistem.

Anda boleh menggunakan algoritma konsensus seperti paxos atau raft untuk memastikan konsistensi yang kukuh. Apabila menyimpan data, anda boleh menyimpan versi data dan menggunakannya sebagai id dalam paxos.

Kunci storan kv

Dalam stor nilai kunci (kv), kunci biasanya dikunci menggunakan beberapa jenis mekanisme penguncian, seperti kunci mutex atau pembaca-penulis (seperti yang dicadangkan @paulsm4). Ini membolehkan berbilang rangkaian atau proses mengakses dan mengubah suai data dalam stor kv secara serentak sambil memastikan data kekal konsisten dan betul.

Sebagai contoh, apabila benang atau proses ingin membaca atau mengubah suai kunci tertentu dalam kedai kv, ia boleh memperoleh kunci pada kunci itu. Ini menghalang urutan atau proses lain daripada mengubah suai kunci yang sama pada masa yang sama, menyebabkan keadaan perlumbaan dan masalah lain. Setelah utas atau proses selesai membaca atau mengubah suai kunci, kunci boleh dilepaskan, membenarkan utas atau proses lain mengakses kunci.

Butiran khusus tentang cara mengunci kunci dalam storan kv mungkin berbeza-beza bergantung pada pelaksanaan storan kv. Sesetengah kedai kv mungkin menggunakan kunci global (seperti yang anda sudah lakukan, yang kadangkala tidak cekap) untuk mengunci keseluruhan stor data, manakala kedai kv lain mungkin menggunakan mekanisme penguncian yang lebih halus seperti kunci peringkat baris atau Kunci peringkat kunci untuk membenarkan lebih banyak operasi. Akses serentak kepada data.

Jadi, tldr; secara konsep, anda betul. Masalahnya terletak pada butiran pelaksanaan penguncian.

Pengekodan

Untuk menjawab soalan tentang penguncian dengan tegas, pertimbangkan Kunci Pembaca seperti yang dicadangkan @paulsm4. Dalam golang, kunci yang serupa ialah rwmutexrwmutex。它用于 sync。 map. Ia digunakan untuk sync. peta.

Berikut adalah contoh ringkas:

type Storage struct {
  store sync.Map // a concurrent map
}

// GET retrieves the value for the given key.
func (s *Storage) GET(key string) (int32, error) {
  // Acquire a read lock for the key.
  v, ok := s.store.Load(key)
  if !ok {
    return 0, fmt.Errorf("key not found: %s", key)
  }

  // Return the value.
  return v.(int32), nil
}

// INSERT inserts the given key-value pair into the data store.
func (s *Storage) INSERT(key string, value int32) error {
  // Acquire a write lock for the key.
  s.store.Store(key, value)
  return nil
}

// UPDATE updates the value for the given key.
func (s *Storage) UPDATE(key string, value int32) error {
  // Acquire a write lock for the key.
  s.store.Store(key, value)
  return nil
}

// REMOVE removes the key-value pair for the given key from the data store.
func (s *Storage) REMOVE(key string) error {
  // Acquire a write lock for the key.
  s.store.Delete(key)
  return nil
}
Salin selepas log masuk

Selain itu, anda memerlukan paxos untuk memastikan konsistensi antara replika.

Atas ialah kandungan terperinci Bagaimanakah kunci di KV Store dikunci?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!