از Pista Academy حمایت کنید
خلاصه آموزشی
مرور سریع مفاهیم اصلی پیش از تماشای کامل یا برای جمعبندی بعد از آموزش.
در جلسه 33 آموزش Redis از صفر تا حرفهای، مدرس به بررسی یک مشکل در عملیات حذف (دیلیت) در Redis میپردازد. این مشکل به دلیل عدم وجود مکانیسم ارور هندلینگ و مدیریت نادرست لاک آیتم در زمان اکسپایر ایجاد میشود. در ادامه، راهحلی ارائه میشود که شامل استفاده از اسکریپت در Redis برای اطمینان از اجرای صحیح عملیات حذف و جلوگیری از تداخل بین پروسهها است.
نکات کلیدی
عدم وجود مکانیزم ارور هندلینگ در عملیات دیلیت میتواند باعث مشکلاتی در Redis شود.
مدیریت صحیح لاک آیتم در زمان اکسپایر ضروری است تا تداخل بین پروسهها جلوگیری شود.
استفاده از اسکریپت در Redis میتواند به اجرای صحیح عملیات حذف کمک کند.
راهحل ارائه شده برای حل مشکل دیلیت شامل افزودن مکانیسم ارور هندلینگ است.
متن ویدیو
متن زمانبندیشده این جلسه برای مرور، جستجو و دسترسی سریعتر.
سلام عرض میکنم خدمت دوستان عزیز بریم سراغ
ادامه بحثمون و میخوایم بریم جلسه قبلی ما
اون ویتلاکو درست کردیم بریم ازش استفاده
بکنیم
خب بیایم اینجا ما این ویتلاکو نوشتیم
بیایم توی بیت اول اینو ایمپورتش بکنید که
باشه بعد بیایم استپ به استپ اینا رو
پیاده سازی بکنیم خب
میایم زیر این شروع میکنیم میگم که کانست
اول بریم آیتمو فچ بکنیم
البته بچهها
میشه ننوشت اینجا هست اینا
کل اینو کپی کنید
تا اینجا
بیارید اینجا حالا بریم یه تغییرات بدیم دیگه اینم بچهها نیاز ندارید اینا ارم
میتونید
تا اینجا رو کامنت کنید
درسته خب حالا بریم اینو درستش بکنیم
اینا که باشه سر جاش فقط اینکه اینو دیگه لازم ندارید به جاش
به جاش این مولتیلم لازم ندارید همون
پرامس.آ آل استفاده میکنید. یه کلاینت
پشت اینو میذارید
یه ویرگولم پشت میذارید بعد اینجا میویسید
یه پرامس آل میزنید که در حقیقت اینا به
صورت پایپلان رو اجرا بکنه یعنی دیگه
درگیر چیز نشیم خب
اینو میاریم میذاریم اینجا فکر کنم. خب این ویر یادتون نره
بعد اینم اگه بذاریدم نذارید خیلی فرقی
نمیکنه کار. خب
یه چک بکنم که ایرادی چیزی تو کار نباشه.
خب این اوکیه. الان در حقیقت ما اومدیم ویتلاکو اینجا
پیادهسازی کردیم که ازش استفاده بکنیم.
ببین این ویتلاک کی اجرا میشد؟ یادتون
باشه؟ این یه کالبک فانکشن بود دیگه
میومد اینجا اگر
این مرحله رو رد میکرد میرسید به این
کالبکی اجرا میشد
خب
اینا ارم بذارید باش حالا فعلاً مهم نیست
میتونید پاک کنید مسئلهای نداره
خب بریم یه بار اینو ران کنیم من یه چیزی
نشونتون بدم
الان مشکل کانکارنسی بچهها حل شد خب ولی
یه مشکل دیگه درست کرده
من یه آیتم جدید اضافه کنم یه مشکلی اضافه کرده این قضیه
خب اینجا نگاه کنید یه آیتم جدید اضافه میکنم همین باشه همین باشه مثلاً یک روز
خب
اینجا نگاه کنید مثلاً من اینو میزنم ۵ دلار
الان اینا درسته خب حالا بزنم ۲ دلار بعد خطا بده دیگه بگه
این کمه درسته حالا بزنم ۱۰ دلار
هیچ اتفاقی نیفتاد نگاه کنید اینا پیغامه رو داد ولی اینا آپدیت نشد
خب اینجام همچنان همون ۵ دلار مونده چرا
اینجوری شد برگردیم تو این سناریومون
اینجا رو نگاه کنید بچهها اینو یادتونم پروسه اول میاد کارشو انجام بده یه دونه
چی درست میکرد اینو رو درست میکرد. خب
این یه تیکه رو درست میکرد.
بعد از اینکه کارش تموم میشد اینو باید
دیلیت میکرد اینجا. بعد از اینکه کارش
تموم میشد باید میومد دیلیت میکرد. این
شیشه. مشکلی که ایجاد شد اینه که اگر
پروسه بالایی خطایی بده
ما هیچ مکانیزمی نداریم که بیاد اینو
انجام بده. این اگه این کالبک فانکشن
خطایی بده کرش میکنه برنامهمون و این
دیلیته اجرا نمیشه.
پس من باید د تا کار بکنم. یک یه مکانیزم
ارور هندلینگ اضافه کنم به این اینجا که
در هر حالت هر خطایی اتفاق افتاد تو باید
اینو ران کنی مهم نیست چه خطایی اتفاق
افتاده
و دو برای اینکه مطمئنم بشیم یه مکانیسم
دیگه هم اینجا انجام میدیم اینجا میام یه
پارامتر دیگهای اضافه میکنم به نام پی
ایکس پی ایکسو یادتونه دیگه یه اکسپایر
تایم مشخص میکردیم میگم آقا جان ۲ میلیان
۲ ثانیه تو اکسپیر تایمته بعد از ۲ ثانیه
باید تو اون قضیه اینو اون این چیزی که
درست کردیو ورش داری بعد از ۲ ثانیه فقط ۲
ثانیه میتونی نگهش داری پس ما اینجا د تا
مکانیزم حل مشکل میذاریم یکی اینکه میایم
اینو میبریم توی ارور هندلینگ بذارید اینم
ببرم تو ارور هندلینگ
یه ترای میذارید
اینو میبرید داخل ترایو فای این و این
پشت سرش یه فاینالی میذارید. میگید آقا در هر حالت در انتهای قضیه تو
اینو دیلیت کن. کاری نداشته باش خطا داده
خطا نداده
این د تا مکانیسم یعنی این و این خیالمونو دیگه راحت میکنه بریم یه تست بکنیم
خب اینجا مثلاً میزنم ۵
خب د که بگیم باید خطا بده الان ۱۰ که بگم باید کار بکنیم
درست شد پس این مشکلمونم حل شد
خب ما یه مشکل دیگه هم داریم بچهها بیا مشکل
من تصویر باید بهتون بگم چی میشه
اینجا بچهها همین عکسو تصور کنید که من پروسه اولم رفته داره کارشو انجام میده
کارش تموم میشه میخواد بره اون آیتم رو
دیلیت بکنه این لاک آیتمو دیلیت بکنه فرض
کنید اون ریکوست دیلیتی که قراره بره به
هر دلیلی طول بکشه بره به هر دلیلی چه
اتفاقی میفته بچهها
مثلاً فرض کنید که ۵ ثانیه طول بکشه تا این دیلیته بره. اتفاقی که میفته اینه که
تو اون ۵ ثانیه چون ما اکسپیر تایمو
گذاشتیم ۲ ثانیه این لاک آیتمه چی میشه؟
اکسپایر میشه. وقتی لاک آیتم اکسپایر بشه
پروسه دوم وقتی بیاد میره برای خودش یه
لاک آیتم ست میکنه بعد اون دیلیت قبلیه
که برسه لاک آیتم پروسه د رو میزنه حذف
میکنه بعد چون لاک آیتم پروسه د حذف شده
پروسه سوم که بیاد برای خودشونو ست میکنه
یه ولو شویی میشه قشنگ خب من یه بار دیگه
بگم سناریوشو
پروسه اول میاد یه لاک آیتم ست میکنه بعد
۲ ثانیه اکسپایر میشه دیلیت
عذر میخوام یه بار دیگه پروسه اول میاد
لاک آیتمو ست میکنه د ثانیه طول میکشه
اکسپایر تایم میاد اکسپایرش میکنه بعدش
پروسه د میاد چون اکسپیر تایمر اومده بوده
لاک آیتمو برداشته بود پروسه د وقتی بیاد
میتونه کارشو شروع بکنه میاد یک لاک آیتم
برای خودش ست میکنه
متأسفانه اتفاقی که میفته اینه که دیلیت
این بعد از یه تایمی میرسه به یه دیلی
میرسه این که میاد میاد میزنه لاک آیتم
د رو پاک میکنه
و پروسه د عملاً از مدار خارج میشه. بعد
اگه پروسه بیاد چون این پاک شده برای
دومیه میاد لاک آیتم خودشو ست میکنه.
چهجوری جلوی مشکلو بگیریم؟
چیکار باید بکنیم؟ باید بگم زمانی که
دیلیت داره میاد به شرطی دیلیت بکنه که
این لاک آیتم خودش باشه. یعنی اگه مثلاً
پروسه یک داره ریکوست دیلیت میفرسته چک
بکنه آیا این لاک آیتم من هست یا نه. اگه
مال منه دیلیت بکن.
این کارم بچهها میایم با اسکریپت انجام
میدیم یعنی میایم یه اسکریپت براش
مینویسیم مثل اون اسکریپته که قبلاً
نوشته بودیم تو
مثل این اسکریپته ایناها
اسکریپت خاصیتش چیه؟ خاصش اینه که زمانی که یک اسکریپتی سمت ردیس داره ران میشه
ردیس بقیه ریکوستها رو دیگه انجام نمیده
تا موقعی که تکلیف اسکریپت معلوم بشه این
خوبیش اینه یعنی ما اینجا دیلیته این ردیس
وایمیسته اول تکلیف دیلیت معلوم بشه بعد
بره سراغ بعدی
خب بریم اسکریپتشو بنویسیم
و مشکلمون در حقیقت حل بشه
خب میام اینجا
میگم که
اسمشو میذاریم آنلاک دو نقطه
دیفاین اسکریپت
یه ویلگولن پشتش بذارید از همین الان خب تعداد کلیدام چند تاست یه دونه
نامبر آف کیز یه دونه یه ترنسفورم میخوایم مثل پایینیه
کلید دو نقطه استرینگ توکن دو نقطه استرینگ
کر ریتر میکنم کلید و توکن
تن رپلای خب خود اسکریپته چیه؟
خیلی ساده است اسکریپته میره اون چیزه رو میگیره اون لاک آیتمه رو میگیره خب بعد
چک میکنه که آیا با این برابره یا نه اگه
با این برابر باشه این مال خودشه
ایف
ردیس
مساوی آر گمان وی ی دن
هیز یه اندم اینجا باید بذاریم
پس میره
در حقیقت اینو میخونه از دیتابیس
بعد میاد چک میکنه آیا آیا مقدارش برابر
این آرگومانی که من پاس دادم هست یا نه؟
اگر پاس داده باشم دیلیتش میکنم.
یه تغییر دیگه هم باید بدیم اونم اینه که باید بریم
توی
لاک اینجا که دیلیت داره اجرا میشه به جای
دیلیت بگم آنلاک اسکریپت آنلاکو اجرا کن
و د تا پارامتر بهت پاس میدم یک کلیده اینم آرگومانه
تو پروسه اپون نباید خلل ایجاد بکنه بچهها یه رفرش بدم اینو
یه ۵ بدیم خطا بده یه ۲۰ بدیم قبول بکنه
اوکیه این کار میکنه مشکلی نداره پس جلوی مشکل چیزم م اینجوری میتونیم بگیریم اگر
دیلی ما با تأخیر در حقیقت اعمال بشه جلو
اونم میگیریم
خب
یه مشکل دیگه هم میمونه که جلسه بعدی بیایم صحبت کنیم چون ویدیومون خیلی طولانی
میشه فعلاً خداحافظ
پرسشهای رایج
پاسخ کوتاه و مستقیم به پرسشهایی که معمولاً هنگام یادگیری این موضوع مطرح میشوند.
به دلیل عدم وجود مکانیزم ارور هندلینگ و مدیریت نادرست لاک آیتم در زمان اکسپایر، عملیات دیلیت ممکن است به درستی اجرا نشود.
راهحل پیشنهادی شامل استفاده از اسکریپت در Redis برای اطمینان از اجرای صحیح عملیات دیلیت و جلوگیری از تداخل بین پروسهها است.
آخرین بهروزرسانی محتوای متنی:
آموزش جامع و کاملاً عملی 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 را بهصورت کاربردی و پروژهمحور یاد بگیرد.