Dalam pembangunan aplikasi teragih, penjanaan ID peningkatan automatik adalah keperluan biasa. Dalam persekitaran yang berdiri sendiri, anda boleh menggunakan kunci utama kenaikan automatik pangkalan data untuk melaksanakan ID kenaikan automatik Walau bagaimanapun, dalam persekitaran yang diedarkan, menggunakan kunci utama kenaikan automatik akan menyebabkan penduaan, penyelesaian lain perlu digunakan memastikan keunikan ID autokenaikan.
Redis ialah pangkalan data dalam memori berprestasi tinggi yang boleh melaksanakan penyelesaian ID peningkatan sendiri yang diedarkan. Dalam artikel ini, kami akan memperkenalkan tiga penyelesaian ID meningkat sendiri yang diedarkan Redis biasa dan membandingkannya untuk membantu pembangun memilih penyelesaian yang sesuai dengan projek mereka.
Berdasarkan arahan redis incr
Redis menyediakan perintah incr yang boleh menambah automatik kekunci yang ditentukan dan mengembalikan nilai kenaikan automatik. Apabila menggunakan perintah incr untuk menjana ID kenaikan automatik, anda boleh menetapkan kunci kepada rentetan tetap dan menambah rentetan dengan setiap operasi.
Kod utama untuk menggunakan Redis untuk menjana skim ID kenaikan automatik yang diedarkan adalah seperti berikut:
from redis import StrictRedis redis = StrictRedis(host='localhost', port=6379, db=0) def get_next_id(): return redis.incr('id_generator')
Memandangkan perintah incr Redis ialah operasi atom, ia boleh memastikan bahawa ID yang dijana akan dijana apabila berbilang pelanggan mengaksesnya pada masa yang sama adalah satu-satunya.
Penyelesaian berdasarkan perintah redis incr adalah sangat mudah, tetapi ia mempunyai kecacatan yang membawa maut: ID akan terus meningkat dengan sendirinya apabila nilai maksimum yang tersedia bagi Redis dicapai (lalai ialah 2^31-. 1), ralat akan dikembalikan . Ini bermakna jika perkhidmatan tidak dimulakan semula untuk masa yang lama selepas sistem datang dalam talian, ID tidak akan tersedia, yang boleh mengakibatkan kehilangan data atau keterhentian data.
Berdasarkan skrip redis skrip Lua
Untuk mengelakkan masalah ID peningkatan diri Redis tidak tersedia untuk jangka masa yang lama, kita boleh menggunakan skrip Lua untuk mengawal julat peningkatan sendiri ID. Skrip Lua boleh melengkapkan berbilang operasi dalam satu operasi atom, yang memungkinkan untuk menentukan julat di mana ID kenaikan automatik harus dijana berdasarkan keperluan perniagaan apabila menjana ID kenaikan automatik, dan bukannya terus menambahnya sepanjang masa .
Berikut ialah kod skim ID kenaikan automatik agihan Redis yang dilaksanakan berdasarkan skrip Lua:
from redis import StrictRedis redis = StrictRedis(host='localhost', port=6379, db=0) SCRIPT = """ local name = KEYS[1] local start = tonumber(ARGV[1]) local stop = tonumber(ARGV[2]) if redis.call('exists', name) == 0 then redis.call('set', name, start) return tonumber(start) end local id = redis.call('incr', name) if id < stop then return tonumber(id) else redis.call('set', name, start) return tonumber(start) end """ def get_next_id(start, stop): result = redis.eval(script=SCRIPT, keys=['id_generator'], args=[start, stop]) return result
Dalam skrip Lua ini, kami mentakrifkan dua parameter bermula dan berhenti untuk mengawal Peningkatan automatik julat penjanaan ID. Jika id_generator utama tidak wujud dalam Redis, mulakan ia untuk memulakan dan kembali untuk memulakan sebaliknya, gunakan perintah incr Redis untuk menambah id_generator dan tentukan sama ada nilai yang ditambah melebihi nilai berhenti. Jika melebihi, tetapkan semula nilai id_generator untuk bermula dan kembali untuk bermula jika tidak, kembalikan ID yang dijana baharu.
Pelaksanaan berasaskan skrip Lua ini secara fleksibel boleh mengawal julat penjanaan ID yang ditambah secara automatik, tetapi ia lebih rumit untuk dilaksanakan Anda perlu menggunakan arahan Redis eval untuk melaksanakan skrip Lua dan lulus parameter.
Berdasarkan redis Redlock
Redlock ialah penyelesaian kunci teragih yang disediakan oleh Redis, yang boleh memastikan bahawa sumber yang sama hanya boleh diakses oleh satu pelanggan pada masa yang sama dalam persekitaran yang diedarkan. Kami boleh menggunakan Redlock untuk melaksanakan skim ID autokenaikan yang diedarkan untuk memastikan bahawa ID autokenaikan yang dijana adalah unik.
Kod utama untuk menggunakan Redlock untuk melaksanakan skim ID meningkat sendiri yang diedarkan adalah seperti berikut:
from redis import StrictRedis from redlock import Redlock redis = StrictRedis(host='localhost', port=6379, db=0) redlock = Redlock([{"host": "localhost", "port": 6379, "db": 0}], retry_times=3) def get_next_id(): with redlock.lock('id_lock', 1000): return redis.incr('id_generator')
Dengan menggunakan Redlock untuk melaksanakan skim ID meningkat sendiri yang diedarkan, kita boleh mengelakkan keperluan untuk berbilang pelanggan mengakses ID pada masa yang sama Menjana masalah pendua dan boleh mengunci apabila menjana ID kenaikan automatik untuk mengelakkan isu keselamatan rangkaian.
Walau bagaimanapun, memandangkan operasi penguncian memakan banyak masa dan sumber, prestasi Redlock mungkin berkurangan dalam senario serentak yang tinggi.
Analisis Perbandingan
Tiga penyelesaian ID meningkat sendiri yang diedarkan oleh Redis mempunyai kelebihan dan kekurangan mereka sendiri:
Atas ialah kandungan terperinci Perbandingan penyelesaian ID meningkat sendiri yang diedarkan yang dilaksanakan oleh Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!