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.
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 get
、insert
、update
、remove
. 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 }
Perlukah saya menambah sesuatu seperti ini? :
type Storage struct { store map[string]int32 locks map[string]mutex.Lock }
Jika saya melakukan ini, masalahnya ialah locks
必须与 store
保持同步。另一种选择是合并两个映射,但即便如此,如果 remove
请求出现在 get
sebelum ini, saya juga mengalami masalah memadamkan entri dalam peta pada kunci.
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.
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.
Untuk menjawab soalan tentang penguncian dengan tegas, pertimbangkan Kunci Pembaca seperti yang dicadangkan @paulsm4. Dalam golang, kunci yang serupa ialah rwmutex
rwmutex
。它用于 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 }
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!