هر آنچه که باید از Redis بدونیم (۲)

Redis data types در قسمت قبلی این سری آموزشی با Redis آشنا شدیم، در این قسمت می خواهیم انواع data type های Redis رو باهم ببینیم و البته دستورات مهم هر کدوم رو بررسی کنیم. همان طور که در پست قبل گفته شد داشتن Data Type های مختلف یکی از مهمترین و متمایز ترین ویژگی های Redis می باشد و یادگیری اون ها یک جوری یادگیری عملی Redis هست پس امیدوارم در پایان این پست بتوانید از Redis به صورت عملی در پروژه خود استفاده کنید:)اگر پست اول این سری آموزشی را نخواندید پیشنهاد می کنم از لینک زیر ابتدا آن را بخوانید: https://virgool.io/@vahiiiid/%D9%87%D8%B1-%D8%A2%D9%86%DA%86%D9%87-%DA%A9%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A7%D8%B2-redis-%D8%A8%D8%AF%D9%88%D9%86%DB%8C%D9%85-%DB%B1-gyhxrnxtcju5 شما بعد از خواندن مجموعه پست های Redis موارد زیر را یاد خواهید گرفت:آشنایی با Redis و موارد کاربرد آننصب و راه اندازی Redis و معرفی رابط های برنامه نویسی اون در زبان های مختلفاستفاده از Redis-cliپیکربندی Redisمقایسه Redis با Memcachedآشنایی با Data Type های اصلی Redisتمرین دستورات مهم هر کدام از Data Type های Redisبررسی نکات پیشرفته تر در Redisپیاده سازی آمار بازدید کاربران در ‌ Redis و Laravelدر ادامه این پست به ۲ مورد آشنایی با Data Type های اصلی Redis و تمرین دستورات مهم هر کدام از Data Type ها می پردازیم.خوب همانطور که در پست قبل هم گفته شد Redis تنها یک دیتا بیس ذخیره کننده ی key value به صورت ساده نیست بلکه می تواند انواع مختلفی از ساختار های داده ای را به عنوان value در خود ذخیره کند که از این رو می توان Redis را یک data structures server نیز نامگذاری کرد.منظور از value ساده این هست که علاوه بر داده های رشته ای (string) می توان ساختار های داده ای پیچیده تری را هم در آن نگه داشت، این ساختار های پیچیده در ۵ دسته ی اصلی در Redis پشتیبانی می شوند:stringsListsSetsSorted setsHashesدر ادامه هر کدام از این ۵ مورد را بررسی می کنیم و با دستورات اختصاصی آن ها آشنا می شویم.برای اجرای هر کدام از دستوراتی که در ادامه می آید، باید ابتدا وارد redis cli شوید و این کار را با دستور زیر در ترمینال خود انجام دهید:$ redis-cli۱. نوع Stringsدر واقع ساده ترین نوع داده ای هست که Memcached نیز تنها از آن پشتیبانی می کند. در واقع وقتی string را به عنوان value ذخیره می کنید یک map بین string و string دارید.برای ساخت و یا در یافت string در ‌Redis کافی هست از ۲ دستور زیر استفاده نمایید:> set mykey somevalue OK > get mykey "somevalue"اگر یک key از قبل تعریف شده باشد و مجدد آن را set کنید برروی اولی تنها value را جایگزین می کند.از موارد استفاده این نوع داده ای شاید بتوان ذخیره فایل های html را مثال زد تا با cache کردن آنها بتوان مجدد به آنها دسترسی داشت و دوباره render نشوند.جالب هست که Redis می تواند تا مقدار 512 مگابایت به ازای هر یک string ذخیره کند.۲. نوع Listsاین نوع برای داشتن لیستی از رشته ها هست. دقیقا لیستی که شما بتوانید از ابتدا یا انتهای آن مقادیر خود را اضافه و یا کم کنید.برای مثالی از کاربرد آن و وضوح بیشتر، یک timeline و یا یک تاریخچه چت رو در نظر بگیرید. باید به تریتب پیام ها ی رد و بدل شده بین ۲ کاربر را نگه دارید و یا برای timeline پست های منتشر شده مثل همین پست های ویرگول که یک ترتیبی بر اساس تاریخ وجود دارد.این نوع لیست را در Redis می توان با نوع Lists و با کمک دستورات زیر ایجاد کرد:LPUSH mylist aیک لیست به نام mylist ساختیم و مقدار a را به ابتدای آن اضافه کردیم. حالا میخواهیم به انتهای لیست هم مقداری اضافه کنیم: RPUSH mylist cالان یک لیست داریم که ۲ تا مقدار داخل آن هست و می توان با همین ۲ دستور مقادیر دیگری را هم اضافه کرد:LPUSH mylist b LPUSH mylist dبعد از اجرای ۴ دستور بالا هم اکنون به ترتیب زیر لیستی به نام mylist داریم:1) "d" 2) "b" 3) "a" 4) "c" از آنجایی که LPUSH به ابتدای لیست اضافه می کند، در لیست بالا مشخص هست که مقدار ابتدایی لیست چرا "d" هست.خوب حالا می خواهیم با دستور زیر مقدار ابتدای لیست را بگیریم:> LRANGE mylist 0 0 1) "d"دستور LRANGE می تواند با توجه به مقدار ابتدایی و انتهایی که به آن می دهیم به ترتیب مقادیر داخل List را به ما برگرداند. در مثال بالا از خانه 0 تا 0 یعنی تنها اولین مقدار لیست و در مثال پایین می توانیم تمام ۴ مورد رو بگیریم:> LRANGE mylist 0 3 1) "d" 2) "b" 3) "a" 4) "c"برای گرفتن یک مقدار از ابتدا و یا انتهای لیست و حذف آن باید به صورت زیر با دستورات POP کار کنیم:> LPOP mylist "d" > LRANGE mylist 0 3 1) "b" 2) "a" 3) "c"در ابتدا با LPOP مقدار ابتدای لیست را که "d" بود را گرفتیم و آن از لیست حذف شد. همین کار با دستور RPOP برای انتهای لیست قابل انجام هست:> RPOP mylist "c" > LRANGE mylist 0 3 1) "b" 2) "a"توی این لیست تا دلتان می خواهد می تونید مقدار اضافه کنید چون Redis می تواند بیش از ۴ میلیارد المان در هر لیست نگه داری کند. ۳. نوع Setsشاید اگر لیستی از رشته ها را بخواهید بسازید از List استفاده کنید ولی اگر لیستی بخواهید که ترتیب در آن مهم نباشدبخواهید که مقادیر تکراری وارد لیست شما نشوند از هر کجای لیست که خواستید با سرعت خیلی بالا مقادیر را بگیرید بررسی کنید که آیا مقداری که دنبال آن هستید در این لیست هست یا خیر باید از Sets استفاده کنید.در واقع نوع داده ای Sets در Redis برای داشتن یک collection از رشته ها به عنوان مقادیر هست با این ویژگی مهم که دیگر نیاز به بررسی وجود این مقدار در collection نیست و هر چند بار که یک مقدار تکراری را به Set اضافه کنیم همان یک مقدار را در collection خودمون داریم.یکی دیگه از ویژگی های جالب Set این هست که شما می توانید چند تا Set را در Redis باهم Union کنید و از اونها استفاده کنید. از موارد پر کاربرد Set می توان به محاسبه ی تعداد کاربران یکتای بازدید کننده از سایت اشاره کرد به این صورت که یک Set از مقادیر ip تمام کاربران بازدید کننده داریم و از آنجایی که این مقادیر تکراری نمی باشد می توان با محاسبه تعداد آنها به بازدید یکتای سایت خود برسیم.پس با دستورات زیر می توانیم بیش از ۴ میلیارد مقدار متفاوت را در یک ‌Set اضافه کنیم:> SADD myset "Hello" 1 > SADD myset "World" 1 > SADD myset "World" 0در مثال بالا با دستور SADD یک Set به نام myset ساختیم و مقدار "Hello" و "World" رو ابتدا به آن اضافه کردیم و مقدار 1 را به صورت integer دریافت کردیم که نشان می دهد مقادیر به Set اضافه شد اما در دستور بعدی مجدد مقدار "World" را اضافه کردیم که مقدار 0 را بر گرداند که چون مقداری تکراری بود.با دستور SCARD می تونیم از تعداد مقادیر موجود در Set ساخته شده آگاه شویم:> SCARD myset 2همان طور که انتظار داشتیم مقدار ۲ را برگرداند و "World" تنها یک بار وارد شده بود.با دستور SMEMBERS می تونیم تمام مقادیر داخل Set را بگیریم:> SMEMBERS myset 1) "World" 2) "Hello"بررسی وجود یک مقدار در داخل Set با دستور SISMEMEBER انجام میشه:> SISMEMBER myset "one" 0 > SISMEMBER myset "World" 1همان طور که مشخص هست باز هم مقدار 1 و یا 0 به ترتیب برای وجود داشتن و یا وجود نداشتن مقدار داده شده در Set بر می گرداند.برای حذف یک مقدار هم از دستور SREM استفاده می کنیم:> SREM myset "World" 1 توجه داشته باشید که برای دستورات SADD و SREM به جای دادن یک مقدار می توانید هم زمان در یک دستور چند مقدار را حذف و یا اضافه کنید.۴. نوع Sorted Setsهمان طور که از اسم این نوع داده مشخص هست شبیه Sets هست یعنی یک collection از مقادیر رشته ای بدون تکرار، اما بر خلاف Set می توان در Sorted Set یک مقدار به عنوان Score به هر المان داد.با این مقدار می توانیم از کمترین به بیشترین score المان های خودمون رو مرتب کنیم و این نکته را هم باید بدونیم که بر خلاف مقادیر المان ها، score ها می توانند تکراری هم باشند.برای مثالی از کاربرد این نوع داده می توانیم لیستی از task ها را در نظر بگیریم که تکراری نیستند و هر کدام یک درجه اهمیتی دارند. حالا می توانیم این لیست را از هر کجایی که نیاز داریم مرتب کنیم.ساخت یک Sorted Set با دستور ZADD قابل انجام هست:>ZADD myzset 1 "one" 1 > ZADD myzset 2 "two" 1 > ZADD myzset 3 "three" 1خوب یک Sorted Set با نام myzset ساختیم و ۳ تا مقدار one, two, three رو با socre هایی به ترتیب 1,2,3 به آن اضافه کردیم.حالا اگر بخواهیم score مقدار two را ببینیم با دستور ZSCORE خواهیم داشت:> ZSCORE myzset "two" "2"در زمان استفاده از Sorted Set، احتمالا مواقعی نیاز داریم که المان هایی را که بین ۲ تا score وجود دارند را بگیریم یعنی کاری که با دستور پایین انجام دادیم:> ZRANGE myzset 2 3 1) "two" 2) "three"بین ۲ تا مقدار 2 و 3 به عنوان score در myzset این ۲ المان وجود داشت.حذف یک مقدار از Sorted Set با دستور ZREM قابل انجام هست:> ZREM myzset "two" 1۵. نوع Hashesآخرین نوع داده ای که در Redis بررسی میکنیم بسیار می تواند پر کاربرد باشد و البته کار راه انداز!اگر می خواهید داخل هر key یک object نگه دارید Hash دقیقا پاسخ نیاز شماست.هر Hash داخل Redis این امکان رو به شما می دهد که به ازای هر key یک map از رشته هایی به صورت key value را نگه دارید یعنی دقیقا همان چیزی که از object انتظار دارید.از موارد کاربرد آن می توان به نگه داشتن اطلاعات کاربران لاگین شده به سیستم اشاره کرد. فرض کنید به ازای هر کاربری که به سیستم شما لاگین می شود یک key از نوع Hash بسازید و داخل آن اطلاعاتی مثل نام، ایمیل، تلفن و هر چیزی که نیاز دارید نگه داری کنید.بیایید همین مثال بالا را در redis cli اجرا کنیم، پس یک key به اسم user و مقدار id اون در دیتابیس که فرض می کنیم ۱۰۰۰ باشد می سازیم و مقادیری که می خواهیم را در آن نگه می داریم:> HMSET user:1000 username vahiiiid password 1234 age 26 OKخوب همان طور که دیدید این کار با دستور HMSET انجام شد و مقادیری مثل username, password و age از کاربر نگه داری شد.حالا اگر تمام این اطلاعات کابر را بخواهیم کافی هست دستور زیر را اجرا کنیم:> HGETALL user:1000 1) "username" 2) "vahiiiid" 3) "password" 4) "1234" 5) "age" 6) "26"برای تغییر یک مقدار از Hash می توانیم به صورت زیر عمل کنیم:HSET user:1000 password 12345اگر فقط مقدار یک فیلد را بخواهیم بگیریم می توانیم از HGET استفاده کنیم:> HGET user:1000 age "26"با دستور HEXISTS هم می توان از وجود یک فیلد در Hash اطلاع پیدا کنیم:> HEXISTS user:1000 age 1بررسی دستورات بیشتر هر Data Typeخوب در این پست با ۵ تا از Data Type های اصلی Redis آشنا شدیم و برخی از دستورات مهم تر هر کدوم رو به علاوه مورد کاربردی هر کدام را دیدیم اما در کنار این دستورات Redis دارای تعداد خیلی زیادی دستور دیگر برای هر نوع Data Type هست که شما می توانید آنها را در document خود Redis در اینجا بخوانید.پایان قسمت ۲همان طور که مشخص هست بخش خیلی مهمی از یادگیری Redis دانستن Data Type ها و نحوه ی استفاده از اونها هست که امیدوارم تو این پست تونسته باشم خوب بیانشون کرده باشم و قطعا با تمرین زیاد و استفاده از اونها می توان دانش بسیار بهتری از تجربه کار با هر کدوم به دست آورد.در پست بعدی و آخرین پست این سری سعی می کنم به یک سری موضوعات پیشرفته تر در Redis بپردازم و یک پیاده سازی آمار بازدید با Redis در لاراول داشته باشیم.