يستخدم Discourse قفل Redis على نطاق واسع كآلية للمزامنة. يمكن تحسين تنفيذ Discource لقفل Redis (كما هو موضح أدناه) لاستخدام عدد أقل من أوامر Redis، مما يقلل من وقت الذهاب والعودة والتكلفة اللازمة لتنفيذها في Redis.
كيف يمكننا تحسين ذلك
يستخدم كل من lock و unlock معاملة Redis. يمكن تبسيط عملية lock إلى الكود التالي:
WATCH key
GET key # تحديد ما إذا كان المفتاح قد انتهت صلاحيته
MULTI
SET key
EXPIRE key, expire_time + 1
السبب في استخدام معاملة Redis (كما أفترض) يبدو أنه يتحقق مما إذا كان المفتاح قد انتهت صلاحيته قبل تعيين المفتاح فعليًا.
لكن أعتقد أنه يمكننا ببساطة استخدام أمر SETEX الذي توفره Redis، والذي يقوم بتعيين مفتاح مع وقت انتهاء صلاحية. في الواقع، تستخدم وثائق Redis SETEX هذا الأمر كمثال لاستبدال SET & EXPIRE بـ SETEX.
إليك الحجج التي تدعم سبب استبدال ذلك:
- تعيين القيمة إلى وقت انتهاء الصلاحية والتحقق منها قبل تعيين المفتاح أمر غير ضروري. فآلية TTL كافية لضمان انتهاء صلاحية المفتاح بشكل صحيح.
- حتى لو قررنا استخدام وقت انتهاء الصلاحية كقيمة، فلا نحتاج إلى أي معاملة. لأن توفير الذرية بين أمر
GET(السطر 2 في الكود أعلاه) وMULTI & EXECلا يقدم أي فائدة. والسبب في ذلك أنه إذا لم يتم اكتساب القفل، سيتم إعادة المحاولة.
ملاحظة تاريخية
لقد بحثت في سجلات الترحيل git للحصول على مزيد من المعلومات. يبدو أنه عندما تم إدخال قفل Redis، لم نكن نستخدم ميزة TTL التي توفرها Redis. وقد تم تقديم ميزة TTL في وقت لاحق بكثير.
لذا، أعتقد أنه يمكننا اتخاذ خطوة إضافية وإزالة معاملة Redis تمامًا.