كيفية مزامنة الوصول إلى ehcache، أعطها وغيرها من المخازن قيمة المفتاح؟

StackOverflow https://stackoverflow.com/questions/1436483

سؤال

ومن فهمي، كل من هذه الأساليب: get() وput() هي الذري

.

ولكن، عند الوصول إلى مخابئ مثل ehcache وأعطها، بطريقة CheckThenAct، سوف تنشأ ظروف السباق.

وماذا علينا أن مزامنة على لضمان أنه إذا thread1 يقوم Get() وthread2 يقوم Get() تليها Put()، أن Get() أولا سيحصل القيمة الجديدة التي أضافها thread2؟

هل كانت مفيدة؟

المحلول

ووطريقة للتعامل مع هذا النوع من الحالات هو عدم التخزين المؤقت يكتب من أماكن متعددة أو للتحكم في الوصول بطريقة أخرى.

وهناك حل بسيط لهذه المشكلة هو عدم القيام بأي عمليات الكتابة إلى ذاكرة التخزين المؤقت من العملاء. بدلا من ذلك إذا كنت تريد تحديث قيمة على اطلاق النار من طلب الحصول على القيمة التي تم تحديثها. إذا يتم استرداد تلك القيمة من مكان آخر ثم وهذا يمكن أن تعمل بشكل جيد. إذا تم احتسابها أو تأتي من العميل على خلاف ذلك فإنه يمكن أن يكون أكثر صعوبة.

وثمة عنصر مشترك لاستخدام مع memcache على الأقل في PHP العالم، وbeanstalkd كمعالج قائمة انتظار العمل الموزعة. في هذا السيناريو يمكنك اطلاق النار قبالة "تحديث ذاكرة التخزين المؤقت" طلب كوحدة العمل.

إذا كنت تفعل عملية على الإدخال المؤقت يستخدم القيمة الموجودة كمدخل أو بطريقة أخرى من شأنه أن يعرض حالة تعارض إذا كان الحصول أولا ثم التحديث ليست عملية الذرية، والبديل هو إنشاء وحدة العمل يتضمن القيمة القديمة والقيمة الجديدة. وبهذه الطريقة، مهما كانت عملية مقابض يمكن التحديثات يبطل أو التعامل مع تلك الحالات حيث القيمة الحالية ليست هي القيمة المتوقعة.

وتزايد ويتم التعامل مع decrementing من قبل واجهة أعطها حتى إذا المداخل الخاصة بك من هذا النوع (أو يمكن خفضها الى هذا النوع من العملية) ثم أن يحل المشكلة أيضا.

نصائح أخرى

لأعطها يمكنك الاستفادة العملية الاكاديمية () للتحقق قبل القيام وضع () أن عملية أخرى قد لا يتم تحديث البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top