سلیب پس از پیدا کردن سایت موردنظر در میان انبوهی از وب‌سایت‌های خروجی مسئله‌ی قبل، به جزیره رسید و نقشه‌ی گنج را پیدا کرد. پس از باز کردن نقشه، متوجه شد که نقشه به زبان عجیب و غریبی (احتمالاً عبری) نوشته شده و قادر به ترجمه‌ی آن نیست. او که می‌دانست محال است بتواند نقشه را خودش ترجمه کند، به دنبال فردی با دانش عبری گشت. سلیب پس از پرس‌و‌جوهای فراوان با علی روبه‌رو شد که قبول کرد نقشه را برای او ترجمه کند؛ اما در ازای این کار، از او خواست تا تسک iteration فعلی او را برایش انجام دهد. سلیب هم‌اکنون از شما درخواست انجام تسک پاک‌سازی و بهینه کردن ساختار ردیس شرکت علی را دارد.

جزئیات پروژه

برای دانلود پروژه‌ی اولیه روی این لینک کلیک کنید.

برای انجام تسک شرکت علی نیاز به نوشتن یک اسکریپت به زبان bash دارید و اسکریپت شما باید ۴ سطح از پاک‌سازی که در ادامه‌ی مسئله با جزئیات بیشتری توضیحشان می‌دهیم را روی دیتای ردیس فعلی‌شان انجام دهد.

برای حل این تمرین نیاز به دانش کار با دستور redis-cli را دارید که داکیومنتیشن آن را در این لینک می‌توانید مطالعه کنید، همچنین جهت آشنایی با تمامی داده ساختار‌های موجود در ردیس هم از این لینک کمک بگیرید.

پاک‌سازی نوع اول

در این سطح، نیاز است تمامی کلید‌هایی از ردیس که شامل حداقل یک کاراکتر کوچک زبان انگلیسی است را به فرم بزرگ تغییر دهد. برای مثال اگر ردیس ما شامل کلید‌های زیر است:

redis:6379> KEYS *
...
redis-key1
Redis-Key2
Redis-KEY3
...
Bash
terminal

پس از اجرای اسکریپت شما باید به شکل زیر تغییر کنند:

redis:6379> KEYS *
...
REDIS-KEY1
REDIS-KEY2
REDIS-KEY3
...
Bash
terminal

اسکریپت شما پس از تغییر هر کلید باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

Renamed key: OLD_KEY -> NEW_KEY
Plain text
output.txt

برای مثال، پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

...
Renamed key: redis-key1 -> REDIS-KEY1
Renamed key: Redis-Key2 -> REDIS-KEY2
Renamed key: Redis-KEY3 -> REDIS-KEY3
...
Plain text
output.txt

توجه داشته باشید تحت این عملیات پاک‌سازی مقدار هیچ کلیدی از ردیس نباید تغییر کند، یعنی پاک‌سازی شما نباید به‌هیچ‌وجه باعث از دست رفتن دیتای موجود شود.

نکته پیرامون حفظ دیتا: ممکن است هنگامی‌که شما کلید را به‌صورت uppercase می‌نویسید، کلید جدید در ردیس وجود داشته باشد. در این صورت، تا زمانی که به کلیدی که در ردیس‌مان وجود نداشته باشد نرسیده‌ایم، عبارت DUPLICATE را به انتهای کلید جدید اضافه می‌کنیم. برای مثال اگر ردیس ما شامل کلید‌های زیر باشد:

redis:6379> KEYS *
...
redis-key1
REDIS-KEY1DUPLICATE
...
Bash
terminal

اسکریپت شما باید کلید redis-key1 را به REDIS-KEY1DUPLICATEDUPLICATE تغییر دهد. یعنی پس از اجرای اسکریپت شما وضعیت کلید‌های ردیس مانند زیر خواهد بود:

redis:6379> KEYS *
...
REDIS-KEY1DUPLICATE
REDIS-KEY1DUPLICATEDUPLICATE
...
Bash
terminal

و همچنین محتوای فایل output.txt شامل محتوای زیر باشد:

...
Renamed key: redis-key1 -> REDIS-KEY1DUPLICATEDUPLICATE
...
Plain text
output.txt

پاک‌سازی نوع دوم

در این سطح، نیاز است تا تمامی مقادیری از ردیس که به‌صورت رشته هستند و با کاراکتر [ شروع و با کاراکتر ] تمام می‌شوند را به‌صورت لیست در ردیس ذخیره کند. همچنین پس از تغییر هر مقدار باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

Parsed list for key: KEY
Plain text
output.txt

برای مثال، اگر ردیس ما شامل مقداری مانند زیر است:

redis:6379> GET TEST_KEY
"[a, b, c]"
Bash
terminal

پس از اجرای اسکریپت شما باید مقدار کلید مذکور به‌صورت داده‌ساختار لیست پیاده‌سازی‌شده در ردیس ذخیره شده باشد و بتوانیم مانند دستور زیر به محتوای آن دسترسی داشته باشیم:

redis:6379> LRANGE TEST_KEY 0 -1
1) "a"
2) "b"
3) "c"
Bash
terminal

برای مثال پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

...
Parsed list for key: TEST_KEY
...
Plain text
output.txt

توجه داشته باشید که اسکریپت شما باید ترتیب لیست را حفظ کند و تغییر در ترتیب مقدار مجاز نیست.

توجه داشته باشید که اگر درون مقدار کاراکتر گیومه (") وجود داشت، این کاراکتر باید از مقدار جدید حذف شود.

پاک‌سازی نوع سوم

در این سطح، نیاز است تا تمامی مقادیری از ردیس که به‌صورت رشته هستند و با کاراکتر ( شروع و با کاراکتر ) تمام می‌شوند را به‌صورت ست در ردیس ذخیره کند. همچنین پس از تغییر هر مقدار باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

Parsed set for key: KEY
Plain text
output.txt

برای مثال اگر ردیس ما شامل مقداری مانند زیر است:

redis:6379> GET TEST_KEY
"(a, b, c)"
Bash
terminal

پس از اجرای اسکریپت شما باید مقدار کلید مذکور به‌صورت داده‌ساختار ست پیاده‌سازی‌شده در ردیس ذخیره شده باشد و بتوانیم مانند دستور زیر به محتوای آن دسترسی داشته باشیم:

redis:6379> SMEMBERS TEST_KEY
1) "a"
2) "b"
3) "c"
Bash
terminal

برای مثال، پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

...
Parsed set for key: TEST_KEY
...
Plain text
output.txt

توجه داشته باشید که اگر درون مقدار کاراکتر گیومه (") وجود داشت، این کاراکتر باید از مقدار جدید حذف شود.

پاک‌سازی نوع چهارم

در این سطح، نیاز است تمامی مقادیری از ردیس که به‌صورت رشته هستند و با کاراکتر { شروع و با کاراکتر } تمام می‌شوند را به‌صورت هش در ردیس ذخیره کند. همچنین پس از تغییر هر مقدار باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

Parsed map for key: KEY
Plain text
output.txt

برای مثال اگر ردیس ما شامل مقداری مانند زیر است:

redis:6379> GET TEST_KEY
"{a:b, c:d, e:f}"
Bash
terminal

پس از اجرای اسکریپت شما باید مقدار کلید مذکور به‌صورت داده‌ساختار لیست پیاده‌سازی‌شده در ردیس ذخیره شده باشد و بتوانیم مانند دستور زیر به محتوای آن دسترسی داشته باشیم:

redis:6379> HGETALL TEST_KEY
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
redis:6379> HGET TEST_KEY a
"b"
Bash
terminal

برای مثال پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

...
Parsed map for key: TEST_KEY
...
Plain text
output.txt

توجه داشته باشید که اسکریپت شما باید ترتیب لیست را حفظ کند و تغییر در ترتیب مقدار مجاز نیست.

توجه داشته باشید که اگر درون مقدار کاراکتر گیومه (") وجود داشت، این کاراکتر باید از مقدار جدید حذف شود.

نمونه خروجی

برای اجرای نمونه نیاز به نصب داکر در سیستم خود دارید. نیازی نیست تا شما درون محتوای فایل‌های داکر پروژه هیچ تغییری ایجاد کنید.

درون پروژه اولیه فایل‌هایی جهت تست اسکریپت شما تهیه شده که در ادامه نحوه کار با هرکدام را بررسی می‌کنیم. ابتدا اسکریپت خود را در فایل fixer.sh پیاده‌سازی کنید. سپس با استفاده از دستور زیر کانتینرهای پروژه اولیه را بالا بیاورید:

$ docker-compose up --build -d
Terminal
Terminal

پس از اتمام اجرای دستور بالا، دستور زیر را اجرا کنید. این دستور محتوای موجود در فایل redis-data.txt را به درون ردیس در حال اجرا می‌ریزد.

$ pip install redis
$ python redis-filler.py
Terminal
Terminal

نام کلید و مقدار هر کلید در ردیس نمونه

ساختار زیر به صورت "key":"value" است:

test1:1
test2:2
TEST1:TEST1
12345:12345
Test6:Test6
tEsT7:tEsT7
test8:[a,b,c]
test9:(a,b,c)
test10:{a:b,c:d}
Plain text

یعنی مقدار کلید test1 برابر با 1 است.

پس از اتمام اجرای دستور بالا، باید اسکریپت خود را اجرا کنید. برای این کار از دستور زیر استفاده کنید:

$ docker exec -it fixer ./fixer.sh
Terminal
Terminal

حال باید اسکریپت شما اجرا شده باشد و در فایل output.txt محتوای زیر قابل مشاهده باشد:

Renamed key: test10 -> TEST10
Parsed map for key: TEST10
Renamed key: test8 -> TEST8
Parsed list for key: TEST8
Renamed key: test2 -> TEST2
Renamed key: test9 -> TEST9
Parsed set for key: TEST9
Renamed key: Test6 -> TEST6
Renamed key: tEsT7 -> TEST7
Renamed key: test1 -> TEST1DUPLICATE
Plain text
output.txt

توجه داشته باشید که ترتیب خروجی برای سیستم داوری اهمیتی ندارد و تنها نیاز است تا تمامی موارد به هر ترتیب دلخواهی حتما در خروجی وجود داشته باشند.

پس از اتمام اجرای تست، حتما دستور زیر را اجرا کنید تا تمامی کانتینرها متوقف شوند:

$ docker-compose down
Terminal
Terminal

نکات تکمیلی

  • فراموش نکنید که در تمامی تمرین‌ها نیاز است تا تمام کاراکتر‌های " از مقدار‌هایی که توسط اسکریپت شما تغییر می‌کنند، حذف شود.
  • اولویت اجرا از پاک‌سازی نوع اول به چهارم است، یعنی ممکن است که ابتدا کلید را به صورت uppercase تغییر بدهیم (پاک‌سازی نوع اول) و سپس بفهمیم که مقدار کلید جدیدی که به صورت uppercase ذخیره کرده‌ایم نیاز به ذخیره‌سازی به‌صورت لیست در ردیس را داشته باشد.
  • باقی کلید‌های موجود در ردیس نباید توسط اسکریپت شما تغییری کنند.
  • برای اتصال به ردیس در اسکریپت خود باید به هاست redis وصل شوید.

نکات مهم

  • فراموش نکنید که اسکریپتی کامل را در پاسختان تحویل دهید.
  • فراموش نکنید که اسکریپت خود را درون فایلی با نام fixer.sh وارد نمایید.
  • برای ارسال پاسخ خود کافی‌ست فایل fixer.sh را آپلود کنید.

ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.