امیرحسین امانی
امیرحسین امانی
خواندن ۱۰ دقیقه·۳ ماه پیش

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

در قسمت قبلی این سری آموزشی با Redis آشنا شدیم، در این قسمت می خواهیم انواع data type های Redis رو باهم ببینیم و البته دستورات مهم هر کدوم رو بررسی کنیم.

همان طور که در پست قبل گفته شد داشتن Data Type های مختلف یکی از مهمترین و متمایز ترین ویژگی های Redis می باشد و یادگیری اون ها یک جوری یادگیری عملی Redis هست پس امیدوارم در پایان این پست بتوانید از Redis به صورت عملی در پروژه خود استفاده کنید:)

اگر پست اول این سری آموزشی را نخواندید پیشنهاد می کنم از لینک زیر ابتدا آن را بخوانید:


شما بعد از خواندن مجموعه پست های 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 پشتیبانی می شوند:

  • strings
  • Lists
  • Sets
  • Sorted sets
  • Hashes

در ادامه هر کدام از این ۵ مورد را بررسی می کنیم و با دستورات اختصاصی آن ها آشنا می شویم.

برای اجرای هر کدام از دستوراتی که در ادامه می آید، باید ابتدا وارد redis cli شوید و این کار را با دستور زیر در ترمینال خود انجام دهید:

$ redis-cli

۱. نوع Strings

در واقع ساده ترین نوع داده ای هست که Memcached نیز تنها از آن پشتیبانی می کند. در واقع وقتی string را به عنوان value ذخیره می کنید یک map بین string و string دارید.

برای ساخت و یا در یافت string در ‌Redis کافی هست از ۲ دستور زیر استفاده نمایید:

> set mykey somevalue OK > get mykey &quotsomevalue&quot

اگر یک 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) &quotd&quot 2) &quotb&quot 3) &quota&quot 4) &quotc&quot

از آنجایی که LPUSH به ابتدای لیست اضافه می کند، در لیست بالا مشخص هست که مقدار ابتدایی لیست چرا "d" هست.

خوب حالا می خواهیم با دستور زیر مقدار ابتدای لیست را بگیریم:

> LRANGE mylist 0 0 1) &quotd&quot

دستور LRANGE می تواند با توجه به مقدار ابتدایی و انتهایی که به آن می دهیم به ترتیب مقادیر داخل List را به ما برگرداند. در مثال بالا از خانه 0 تا 0 یعنی تنها اولین مقدار لیست و در مثال پایین می توانیم تمام ۴ مورد رو بگیریم:

> LRANGE mylist 0 3 1) &quotd&quot 2) &quotb&quot 3) &quota&quot 4) &quotc&quot

برای گرفتن یک مقدار از ابتدا و یا انتهای لیست و حذف آن باید به صورت زیر با دستورات POP کار کنیم:

> LPOP mylist &quotd&quot > LRANGE mylist 0 3 1) &quotb&quot 2) &quota&quot 3) &quotc&quot

در ابتدا با LPOP مقدار ابتدای لیست را که "d" بود را گرفتیم و آن از لیست حذف شد.

همین کار با دستور RPOP برای انتهای لیست قابل انجام هست:

> RPOP mylist &quotc&quot > LRANGE mylist 0 3 1) &quotb&quot 2) &quota&quot

توی این لیست تا دلتان می خواهد می تونید مقدار اضافه کنید چون Redis می تواند بیش از ۴ میلیارد المان در هر لیست نگه داری کند.

۳. نوع Sets

شاید اگر لیستی از رشته ها را بخواهید بسازید از List استفاده کنید ولی اگر لیستی بخواهید که

  • ترتیب در آن مهم نباشد
  • بخواهید که مقادیر تکراری وارد لیست شما نشوند
  • از هر کجای لیست که خواستید با سرعت خیلی بالا مقادیر را بگیرید
  • بررسی کنید که آیا مقداری که دنبال آن هستید در این لیست هست یا خیر

باید از Sets استفاده کنید.

در واقع نوع داده ای Sets در Redis برای داشتن یک collection از رشته ها به عنوان مقادیر هست با این ویژگی مهم که دیگر نیاز به بررسی وجود این مقدار در collection نیست و هر چند بار که یک مقدار تکراری را به Set اضافه کنیم همان یک مقدار را در collection خودمون داریم.

یکی دیگه از ویژگی های جالب Set این هست که شما می توانید چند تا Set را در Redis باهم Union کنید و از اونها استفاده کنید.

از موارد پر کاربرد Set می توان به محاسبه ی تعداد کاربران یکتای بازدید کننده از سایت اشاره کرد به این صورت که یک Set از مقادیر ip تمام کاربران بازدید کننده داریم و از آنجایی که این مقادیر تکراری نمی باشد می توان با محاسبه تعداد آنها به بازدید یکتای سایت خود برسیم.

پس با دستورات زیر می توانیم بیش از ۴ میلیارد مقدار متفاوت را در یک ‌Set اضافه کنیم:

> SADD myset &quotHello&quot 1 > SADD myset &quotWorld&quot 1 > SADD myset &quotWorld&quot 0

در مثال بالا با دستور SADD یک Set به نام myset ساختیم و مقدار "Hello" و "World" رو ابتدا به آن اضافه کردیم و مقدار 1 را به صورت integer دریافت کردیم که نشان می دهد مقادیر به Set اضافه شد اما در دستور بعدی مجدد مقدار "World" را اضافه کردیم که مقدار 0 را بر گرداند که چون مقداری تکراری بود.

با دستور SCARD می تونیم از تعداد مقادیر موجود در Set ساخته شده آگاه شویم:

> SCARD myset 2

همان طور که انتظار داشتیم مقدار ۲ را برگرداند و "World" تنها یک بار وارد شده بود.

با دستور SMEMBERS می تونیم تمام مقادیر داخل Set را بگیریم:

> SMEMBERS myset 1) &quotWorld&quot 2) &quotHello&quot

بررسی وجود یک مقدار در داخل Set با دستور SISMEMEBER انجام میشه:

> SISMEMBER myset &quotone&quot 0 > SISMEMBER myset &quotWorld&quot 1

همان طور که مشخص هست باز هم مقدار 1 و یا 0 به ترتیب برای وجود داشتن و یا وجود نداشتن مقدار داده شده در Set بر می گرداند.

برای حذف یک مقدار هم از دستور SREM استفاده می کنیم:

> SREM myset &quotWorld&quot 1

توجه داشته باشید که برای دستورات SADD و SREM به جای دادن یک مقدار می توانید هم زمان در یک دستور چند مقدار را حذف و یا اضافه کنید.

۴. نوع Sorted Sets
همان طور که از اسم این نوع داده مشخص هست شبیه Sets هست یعنی یک collection از مقادیر رشته ای بدون تکرار، اما بر خلاف Set می توان در Sorted Set یک مقدار به عنوان Score به هر المان داد.

با این مقدار می توانیم از کمترین به بیشترین score المان های خودمون رو مرتب کنیم و این نکته را هم باید بدونیم که بر خلاف مقادیر المان ها، score ها می توانند تکراری هم باشند.

برای مثالی از کاربرد این نوع داده می توانیم لیستی از task ها را در نظر بگیریم که تکراری نیستند و هر کدام یک درجه اهمیتی دارند. حالا می توانیم این لیست را از هر کجایی که نیاز داریم مرتب کنیم.

ساخت یک Sorted Set با دستور ZADD قابل انجام هست:

>ZADD myzset 1 &quotone&quot 1 > ZADD myzset 2 &quottwo&quot 1 > ZADD myzset 3 &quotthree&quot 1

خوب یک Sorted Set با نام myzset ساختیم و ۳ تا مقدار one, two, three رو با socre هایی به ترتیب 1,2,3 به آن اضافه کردیم.

حالا اگر بخواهیم score مقدار two را ببینیم با دستور ZSCORE خواهیم داشت:

> ZSCORE myzset &quottwo&quot &quot2&quot

در زمان استفاده از Sorted Set، احتمالا مواقعی نیاز داریم که المان هایی را که بین ۲ تا score وجود دارند را بگیریم یعنی کاری که با دستور پایین انجام دادیم:

> ZRANGE myzset 2 3 1) &quottwo&quot 2) &quotthree&quot

بین ۲ تا مقدار 2 و 3 به عنوان score در myzset این ۲ المان وجود داشت.

حذف یک مقدار از Sorted Set با دستور ZREM قابل انجام هست:

> ZREM myzset &quottwo&quot 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) &quotusername&quot 2) &quotvahiiiid&quot 3) &quotpassword&quot 4) &quot1234&quot 5) &quotage&quot 6) &quot26&quot

برای تغییر یک مقدار از Hash می توانیم به صورت زیر عمل کنیم:

HSET user:1000 password 12345

اگر فقط مقدار یک فیلد را بخواهیم بگیریم می توانیم از HGET استفاده کنیم:

> HGET user:1000 age &quot26&quot

با دستور HEXISTS هم می توان از وجود یک فیلد در Hash اطلاع پیدا کنیم:

> HEXISTS user:1000 age 1

بررسی دستورات بیشتر هر Data Type

خوب در این پست با ۵ تا از Data Type های اصلی Redis آشنا شدیم و برخی از دستورات مهم تر هر کدوم رو به علاوه مورد کاربردی هر کدام را دیدیم اما در کنار این دستورات Redis دارای تعداد خیلی زیادی دستور دیگر برای هر نوع Data Type هست که شما می توانید آنها را در document خود Redis در اینجا بخوانید.

پایان قسمت ۲

همان طور که مشخص هست بخش خیلی مهمی از یادگیری Redis دانستن Data Type ها و نحوه ی استفاده از اونها هست که امیدوارم تو این پست تونسته باشم خوب بیانشون کرده باشم و قطعا با تمرین زیاد و استفاده از اونها می توان دانش بسیار بهتری از تجربه کار با هر کدوم به دست آورد.

در پست بعدی و آخرین پست این سری سعی می کنم به یک سری موضوعات پیشرفته تر در Redis بپردازم و یک پیاده سازی آمار بازدید با Redis در لاراول داشته باشیم.

redis
سلام به همه رفقا من قصد دارم تجربیات چند سال گذشتم رو در خدمت شما بزارم #با_هم_پیشرفت_کنیم
شاید از این پست‌ها خوشتان بیاید