Rumah  >  Artikel  >  pangkalan data  >  Perbandingan penyelesaian ID meningkat sendiri yang diedarkan yang dilaksanakan oleh Redis

Perbandingan penyelesaian ID meningkat sendiri yang diedarkan yang dilaksanakan oleh Redis

PHPz
PHPzasal
2023-06-20 08:10:382108semak imbas

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:

  1. Berdasarkan arahan redis incr <.>
Kelebihan: Mudah dilaksanakan, mudah dan pantas.

Kelemahan: ID akan terus meningkat dan masalah seperti ketiadaan ID, kehilangan data atau ketaksinambungan data mungkin berlaku.

Senario yang berkenaan: senario perniagaan mudah, yang tidak memerlukan kesinambungan tinggi ID data.

    Berdasarkan skrip redis Lua skrip
Kelebihan: Julat penjanaan ID yang meningkat sendiri boleh dikawal secara fleksibel untuk memastikan kesinambungan data.

Kelemahan: Pelaksanaannya rumit dan anda perlu menggunakan arahan Redis eval untuk melaksanakan skrip Lua dan lulus parameter.

Senario yang berkenaan: Senario dengan keperluan ketat tentang kesinambungan ID data dan logik perniagaan, seperti e-dagang, kewangan, dsb.

    Berdasarkan redis Redlock
Kelebihan: Operasi mengunci memastikan keselamatan benang dan mengelakkan masalah penjanaan data berulang.

Kelemahan: Memandangkan operasi penguncian memakan banyak masa dan sumber, prestasi mungkin berkurangan dalam senario serentak tinggi.

Senario yang boleh digunakan: Keselarasan tinggi, senario diedarkan dan senario dengan keperluan tinggi untuk kesinambungan ID data.

Kesimpulan

Berdasarkan analisis perbandingan di atas, kita boleh membuat kesimpulan berikut:

    Dua penyelesaian berdasarkan arahan redis incr dan berdasarkan redis Redlock mempunyai skop aplikasi yang agak sempit. Tidak boleh digunakan untuk semua senario.
  1. Penyelesaian skrip Lua berdasarkan skrip redis secara fleksibel boleh mengawal julat penjanaan ID auto-increment dan sesuai untuk senario yang memerlukan kesinambungan ID data dan keperluan logik perniagaan yang tinggi.
Oleh itu, apabila memilih Redis untuk melaksanakan penyelesaian ID meningkat sendiri yang diedarkan, anda perlu mempertimbangkan keperluan khusus senario perniagaan dan memilih penyelesaian yang sesuai.

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!

Kenyataan:
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