از Pista Academy حمایت کنید
خلاصه آموزشی
مرور سریع مفاهیم اصلی پیش از تماشای کامل یا برای جمعبندی بعد از آموزش.
در جلسه 32 آموزش Redis از صفر تا حرفهای، مدرس به بررسی محدودیتهای روش واچ در مدیریت کانکارنسی در Redis میپردازد. با ارائه یک سناریو، مشکل اصلی روش واچ در تغییرات مکرر دادهها نشان داده میشود و جایگزینی آن با استفاده از لاک معرفی میگردد. مکانیزم لاک به عنوان راه حلی برای جلوگیری از تداخل در دستکاری دادهها توضیح داده میشود. همچنین، نحوه پیادهسازی لاک در Redis با استفاده از دستورات مرتبط مانند SETNX و یک حلقه تلاش بازگشتی بررسی میشود. در این بخش، نحوه کار با لاک و نحوه اجرا فرآیند در صورت وجود یا عدم وجود لاک توضیح داده میشود و کالبک فانکشن به طور خودکار اجرا میشود.
نکات کلیدی
روش واچ در Redis دارای محدودیتهایی است که در سناریوهایی مانند تغییرات مکرر دادهها اتفاق میافتد.
لاک به عنوان راه حلی مناسب برای جلوگیری از تداخل در دستکاری دادهها معرفی میشود.
پیادهسازی لاک در Redis با استفاده از دستورات مانند SETNX و حلقه تلاش بازگشتی انجام میشود.
در صورت وجود لاک، فرآیند ادامه مییابد و در صورت عدم وجود لاک، فرآیند مجدد اجرا میشود.
متن ویدیو
متن زمانبندیشده این جلسه برای مرور، جستجو و دسترسی سریعتر.
سلام عرض میکنم خدمت دوستان عزیز. بریم سراغ ادامه بحثمون. ما جلسه قبلی خاطرتون
باشه د تا جلسه قبلی فکر کنم گفتیم که د
تا مشکل داریم. یکی بحث کانکارنسیه
و مشکل دوم که الان یهو یادم رفت.
آ دیت اور فچینگ دیتا اور فچینگو که حل کردیم جلسه قبلی. خب اما بریم س بحث
کانکارنسی.
بحث کانکارنسی رو ما باز چند تا جلسه
قبلتر با یه روشی حلش کردیم به نام واچ
یادتون باشه.
اما روش واچ یه ایرادی داره بچهها یعنی
همچنان یه مشکلی رو حل نمیکنه. اول بریم
سراغ اینکه روش واچ چهجوری کار میکرد. خب
بعد ببینیم که مشکلش چیه و بریم حلش
بکنیم. خب بیایم اینجا.
خب بذار من دوباره یه عکس بیارم از اینجا. خب بچهها این تصویرو ببینید. ادامه همون
تصویر بالاست.
میخوام این سناریو با همدیگه چک کنیم.
فرض کنید من یه آیتمی دارم با مبلغ ۵ تا ۵
دلار فرض کنید
د نفر همزمان میان ریکوست میدن که یه
مبلغی رو رو این کالا بذارن. خب به عنوان
ش به عنوان مثلاً پیشنهاد یکی با ۱۰ میاد
یکی با ۱۵ میاد
واچ چیکار میکرد؟ واچ میگفتش که خب من
جفت اینا رو میبرم جلو
اولی میره جلو پنجو میکنه مثلاً فرض کنید
۱۵
اولی میره جلو پجو میکنه ۱۵
دومی چون واچ گذاشته بودم روی این آیتمه
میبینه که اون آیتمه عوض شده چیکار
میکنه؟ ریکوست خودشو کنسل میکنه. چرا؟
چون پنجه عوض شده. من واچ گذاشته بودم
روش. خب الان اینجا اتفاقی که میفته چیه؟
۵ من میشه ۱۵
۱هم اجرا نمیشه. خب این اوکیه مشکلی نیست.
دقیقاً همون چیزی که میخواستن.
اما حالت برعکس میشو تصور کنید.
یعنی اول ریکوست ۱ دهه برهو
بکنه ۱۰ بعد اون ۱۵ی که واچ گذاشتم چون
آیتم تغییر کرده ریکوست خودشو کنسل کنه خب
اینجا بده دیگه چرا چون من ریکوست ۱۵هم
ولیدتره نسبت به ۱۰ اصلاً نباید کنسل میشد
پس ما د تا سناریو داریم که یکیش داره بد
اتفاق میفته و درست اجرا نمیشه اینجاست که
در حقیق اون واچری کارای خودشو از دست
میده حالا راهحل چیه
راه استفاده از یه چیزی به نام لاک که
الان مکانیزمشو من توی تصویر بهتون توضیح
میدم فقط این نکته رو اضافه کنم که ما تو
این
ویدیو خود لاک رو پیاده سازی میکنیم اما
شما توی پروژههاتون میتونید از
کتابخونههایی که هست استفاده کنید برای
زبانهای مختلف هم نوشته شده تو خود در
حقیقت سایت ردیسم هست حالا لینکشو بهتون
میدم
خب بریم سراغ اینکه ببینیم اصلاً مکانیزم لاک قراره چهجوری کار بکنه. خب بیایم
تصویر بعدی.
باز همون آیتم رو تصور کنید که در حقیقت د
تا ریکوست اومده که اونو آپدیتش کنه.
اتفاقی که میفته اینه که ریکوستی که زودتر
اومده
میره آیتمو میگیره. خب
بعد
یه چیزی درست میکنه به نام لاک با این
حالا اسم مثلاً فرض کنید اسمشو اینجوری
گذاشتیم اون آیدی اون آیتم رو آوردیم یه
لاک پشتش گذاشتیم یه چیز دلبخواهه
میاد یه همچین چیزی رو ست میکنه بعد
مقدار ان ایکسشو میذاره تو رو ان ایکسو
یادتونه بچهها
اگر ان ایکس روی یه دونه آیتم قبلاً ست
شده باشه. خب این سته دیگه کار نمیکنه.
اگر قبلاً ست نشده باشه اونوقت کامندا
اجرا میشه. ان ایک کاربردش این بود.
این اولی میاد اینو درست میکنه ان ایکسو
میکنه تو رو. خب و مقدارشم میذاره مثلاً
اون مقداری که اومده مثلاً های.
دومی میاد
همون آیتمو میگیره
خب میبینه ان اکسش تروئه. میفهمه که یکی
قبل از من داشته روش کار میکرده. اینجا
نمیتونه کارشو انجام بده. وایمیسته. صبر
میکنه.
صبر میکنه تا موقعی که این ان ایکسشو
بکنه فالس.
وقتی ان ایکسو بکنه فالس دوباره کارشو
انجام میده. یه لوپیه که این هی داره مدام
ریکوست میده. مثلاً تو یه فاصلههایی هی
ریکوست میده. ریکوست میده. ریکوست میده تا
این انکسش بشه تو رو. یعنی اینکه این کارش
تموم بشه با این و آپدیتو انجام بده بعد
این اجازه میده کارشو انجام میده این میشه
مکانیزم لاک خیلی ساده بخوام بگم بهتون
حالا وارد جزئیاتش بیشتر نشدم
ما قراره الان بریم اینو پیاده سازی بکنیم
گفتم باز باز بهتون هست در حقیقت
لایو که این کارو میکنه فقط یه چیزی بگم
اینکه کارش تموم میشه بچهها میاد اینو
کلاً پاکش میکنه یعنی نمیاد ان ایکسشو
تغییر بده کلاً پاکش ش میکنن که این
بتونه دوباره بره درستش بکنه و دوباره
کارشو انجام بده. خب بریم اینو پیاده سازی
بکنیم.
فقط اجازه بدید من اون
لینکو بهتون بدم.
ردیس تو داکس
رفرنس اگه لینکش عوض نشده بشه.
پترزوت
خب این که درست نوشتم پترم که درست نوشتم
خب بذار اینو گوگلش کنیم ایراد نداره
لیتست آ یه ذره عوض شده خب اعداد ند اینا بچهها این دقیقاً برای زبانهای مختلف
روبی و پایتون و پی اچ پی و دیگه جاوا و
گو و پرل و همه چی داره همه چی داره و
جاوا اسکریپتم داره میتونید استفاده
کنید. خب این بالایست البته
ولی ما اینجا قراره خودمون پیادهسازیش
بکنیم تو این پروژه.
بریم شروع بکنیم.
خب
قبل اینکه شروع بکنیم اجازه بدید من یه
گیتهاپ پروژه رو تا اینجا بهتون بدم که اگر یدرد
مشکل چیزی داشتید بتونید کدتونو چک کنید و
بذارید من لینکو بیارم
نمیدونم چرا پیست من از کار افتاده خب بذارید مینویسم اشکال نداره گitب
اسلش ردیس
استارت استارتر
اسلش
ت اس
بیفور لاک از این لینک میتونید
در حقیقت برید کدو بردارید تا اینجا رو تا
قبل از این جلسه رو
درست نوشتم همه چیو بله تری و بیفورک اوکی
بریم شروع بکنیم من اینا رو ببندم میاید
توی
بیت اینجا بود که دقیقاً ما داشتیم اینو
ایزولیت میکردیم و درست میکردیم این بالا
بالا شروع میکنم کدمو نوشتم
میگم که ریتن ما قراره بریم یه فانکشنی برای لاک
بنویسیم من فرض میکنم اینو نوشتم بیت لاک
که د تا ورودی داره یکی اون آیدی اون آیتم
است
د یه دونه کالبک فانکشنه که پاس میدم حالا بعداً جلوتر بهتون میگم چیکار میکنم
اینجا چند تا فراآیند اتفاق میفته یکی فکر میکنه
خود اون آیتمه رو
ولیدیشن انجام میده حالا میایم اینا رو جلوتر بخم
سه
رایتینگ ساین دیتا خب
این فعلاً تا اینجا باشه ما بریم این ویت
لاکو پیاده سازی بکنیم بعد برگردیم ازش
استفاده بکنیم ایمپورت شد ویتلاک آره توی
سرویس توی ردیس
اینجا من یه جا باید داشته باشم توی ردیس
لاک
اینجاست لاک
اوکی چرا خطا داره آ میگه د تا آلرگومان پاس دادی ولی صفره
آره درسته چون اینور الانو درستش نکردم خب
بریم لاک و پیادهسازی بکنیم
و کل اون ففرآیندی که تو اون تصویر هم
بهتون گفتم رو قراره اینجا بهتون بگم. اول
د تا آرگوم ورودیشو بدم. یه دونه کلید به
عنوان ورودی دریافت میکنه میشه همون آیتم
آیدی
یه دم کالبک فانکشن بود که
به این شکل اینور خطام رفته باشه. اوکی درست شد. حالا بیایم اینجا
پس باید بریم کل این فراآینده رو پیاده
سازی بکنیم که یه دونه میاد چیکار میکرد
اینو درست میکرد اینو میکرد تو رو بعد
الی آخر حالا بریم جلوتر خب
من اول مراحلو به نظرم بنویسم یا نه خب
بذار اول بریم جلو د تا متغیر اول درست
میکنم اینجا
یکی اسمشو میذارم ریترای دیلی
مثلاً ۱۰۰ میلی ثانیه خب میگم هر ۱۰۰ میلی ثانیه اون ریکوستتو تکرار بکن وقتی
میبینی ان ایکسمون تو روئه تعداد تکرار
میذارم رو ۲۰ تا خب بیایم پایین این د تا مریبون
استیپ بعدی چیه
یه دونه رندم ولیو باید درست بکن بکنه
مقدار
رندم این همین اینه اینا هم بچهها یه
مقدار رندمه خب اینو باید بتونم اینجا
درست بکنم برای درست کردن مقدار رندم باز
ما ابزار داریم براش
یه چیزی رو این بالا ایمپورت کنم ایمپورت
بایت ساجست نکرد فرانت
خب این قراره برامون کار رندمه رو انجام بده
میام میگم که
کانست
توکن مساوی
رندم اشتباه
وات
ش تایی هم باشه تو استرینگ
تکست خب
مرحله بعدی چیه اون کلیدمو درست بکنم یادتون باشه یه کلیدی داشت اینها لاک دو
نقطه آیتم آیدی
پس اینجا میام میگم که
کانس لاک
پی اسمشو میذارم مساویه
یه بک تیک میذارم لاک دو نقطه
اون کلیدی که به عنوان ورودی اومده که همون آیتم آیدیمونه
خب میایم پایین
بعد باید بریم اون لوپمونو درست بکنیم ۲۰ دفعه باید لوپمون تلاش بکنه حداکثر ۲۰
دفعه که بتونه در حقیقت کارشو انجام بده
زمانی برو که ریترای بزرگتر مساوی صفره منفی شد دیگه نمیخواد یعنی ۲۰ دفعه تلاش
کردی نشده دیگه هر دفعه هم تلاش میکنی
باید ریتا یه دونه کم بکنی درسته میگم
کانست
یه چیزی تعریف میکنم به نام اکور
درست نوشته آکورد ایت
کلاینتو ایمپورت میکنید بالا بچهها دات
ست
اون لاکی که درست کرده بودیمو
توکن
ان ایکس دقه ترو این چیکار میکنه بچهها اینجا
هر دفعه میره اون لاکیه رو که پروسه قبلیه
درست کرده میخواد بره ان ایکسشو ترو بکنه
خب یعنی چی این ان ایکس رو کرده ترو این
دومیه که میاد انکسو بکنه ترو چون قبلاً
انکس ترو بوده کار نمیتونه
میره ۲۰ میلی ۱۰۰ میلی ثانیه دیگه میاد
دوباره میبینه اینکس این تروه میره ۱۰۰
تا دیگه میاد میبینه تروه تا موقع این
کارو میکنه که این اینو دیلیت کرده باشه
بعد از کارش وقتی اینو دیلیت کرده باشه
این میتونه انکسو بکنه تو رو وقتی انکسو
بکنه تو رو میتونه کارشو انجام بده.
بریم ادامه فرمده بنویسیم.
پس اینجا من میگم که
اگر بعد از این
اویت پاز
این پازم که این پایین نوشتم دیگه به اندازه ۱۰۰ میلی ثانیه صبر میکنه.
به اندازه ۱۰۰ میلی ثانیه صبر میکنه. پس
اگر اکرد بشه فارس معنیش اینه که اون آیتم
از قبل وجود داشته لاکیه و انکسشم تو روئه
یعنی یکی داره روش کار میکنه پس اینجا
میره ۱۰۰ میلی سنی صبر میکنه
و
کانتینیو
کانتینیو چیکار میکنه؟ میاره اول حلقه
میاره اینجا دیگه برقه رو اجرا نمیکنه
میره یه بار دیگه تلاششو بکنه ۱۰۰
میلیثانی دیگه
اما اگر
اکر تو رو بود اگه اکویر تو رو بود اینو
بی اینو رد میکنه معنیش اینه که هیچکس رو
اون لاکیه کار نمیکنه اینجا چیکار میکنه
کانست
ریزالت مساوی اوکیت
اون کالبک فانکشنی که پاس دادمو ران
میکنه.
کالبک فانکشنمون چیه؟ ایناست. این کالبک فانکشنمونه. اینو ران میکنه.
چرا؟ چون مطمئن میشه که کسی رو اون لایکیه
کار نمیکنه. میره آیتمو میگیره کارشو
انجام میده.
من یه بار دیگه خیلی سریع بگم ویدیومون
طولانی نشه. ریکوست اول میاد با این کار
داره. خب میاد یه دونه آیتمی رو درست
میکنه. یه ست میکنه لاک آیتم مثلاً A1
فرض کنید یه مقدار رندمی هم میندازه
داخلش مثلاً اینجا زدم های بعد میاد ان
ایکسشو ترو میکنه خب بعد میره چیکار
میکنه میره رو این آیتمه کارشو انجام
میده اوکی چون ان ایکس ترو شده میاد رو
این کارشو انجام میده ریکوست دوم که میاد
میخواد دقیقاً همین لاکی رو درست بکنه
چون آی هم با همون آیتم کار داره دیگه
میبینه ا یکی قبلاً این لاکیو درست کرده
پس میفهمه که یکی قراره رو این آیتمه کار
بکنه میگه خیلی خب من وایمیستم به اندازه
۱۰۰ میلیثانیه بعد دوباره میام خب ۱۰۰
میلیثانی دیگه میاد اگر اون لاک آیتمه پاک
شده باشه معنیش اینه که پروسه قبلی کارش
با این آیتمه تموم شده عملاً بچهها ما به
ازای هر آیتمی که میخوایم روش کار بکنیم
داریم یه آیتم کمکی هم کنارش درست میکنیم
که این آیتم کمکیه به من میفهمونه که کسی
رو این کار میکنه یا کار نمیکنه با این
پروسهای که اینجا دیدید
و اون لایبریا رو که بهتون گفتم کجا رفت؟ این اینا همین کارو انجام میدم کامل
پیادهسازی میکنم نیاز شما کدشو بنویسید
ولی ما اونجا نوشتیم بریم بیایم ادامهشو
جلسه بعدی صحبت بکنیم طولانی نشه ویدیومون
فقط یه لحظه من فک کنم یه چیزی جا انداختم آها دیلیتو یادم رفت بنویسیم من وقتی کارم
تموم شد کالبکه ران شد باید بتونم اونو
دیلیت کنم اون در حقیقت چیز دیگه
اینجا اینجا
ریزالو که اجرا شد
قبل از ریتن ریز میگم او کلادی
میگم اون لاکی رو پاک کن لطفاً من کارم
تموم شد تغییررو تو آیتم دادم دیلیت کن که
نفر بعدی بتونه کار بکنه روش.
خب
بریم بیایم اداش جلسه آینده.
پرسشهای رایج
پاسخ کوتاه و مستقیم به پرسشهایی که معمولاً هنگام یادگیری این موضوع مطرح میشوند.
روش واچ در Redis دارای محدودیتهایی است که در سناریوهایی مانند تغییرات مکرر دادهها اتفاق میافتد.
لاک در Redis با استفاده از دستورات مانند SETNX و یک حلقه تلاش بازگشتی پیادهسازی میشود.
در صورت وجود لاک، فرآیند ادامه مییابد و در صورت عدم وجود لاک، فرآیند مجدد اجرا میشود.
آخرین بهروزرسانی محتوای متنی:
آموزش جامع و کاملاً عملی Redis به زبان فارسی؛ از نصب و راهاندازی تا پیادهسازی الگوهای حرفهای. در طول این دوره تمرینمحور، یک اپلیکیشن فروشگاه اینترنتی میسازیم و با مفاهیمی مثل مدلسازی داده، جستجو، همزمانی و ارتباط سرویسها در دنیای واقعی کار میکنیم. در این دوره چه یاد میگیرید؟ راهاندازی Redis بهصورت لوکال و کار با CLI دستورات افزودن و Query گرفتن از دادهها کار با Hashها، Listها، Setها و Sorted Setها (رتبهبندی و امتیازدهی) ایجاد یکتایی داده با Setها + تمرینهای عملی Pipelining برای بهینهسازی کارایی Design Patterns قدرتمند مخصوص Redis و نکات و Gotchaهای مهم تبدیل مدلهای رابطهای به مدل Redis (Data Modeling) HyperLogLog برای شمارش تقریبی توسعه قابلیتها با Scripting مدیریت Concurrency و حل مسائل همزمانی جستجو و فیلتر پیشرفته با RediSearch (Querying & Search in Action) ارتباط بین سرویسها با Streams پیادهسازی و تمرین مستمر روی پروژه E-Commerce مخاطبان برنامهنویسان بکاند و فولاستک، مهندسان داده و هرکسی که میخواهد Redis را بهصورت کاربردی و پروژهمحور یاد بگیرد.