با عرض سلام و وقت بخیر خدمت کاربران محترم سایت ویرگول، در این مقاله آموزشی که چکیده آموزش Redis از سایت tutorialspoint بهمراه مطالب تکمیلی تر , سعی شده یک آموزش کاربردی و پروژه محور از دیتابیس Redis ارایه گردد.ایده این سری مقاله های آموزشی از این موضوع سرچشمه می گیرد که بخشی از خوانندگان وجود دارد که به محتوای نوشتاری آنلاین بهتر پاسخ می دهند و ترجیج می دهند مهارت های جدید را به سرعت از طریق خواندن افزایش دهند.این سری اموزش ها با ارایه اولین پکیج آموزشی در خصوص Redis آغاز می شود که انتظار می رود با واکنش مثبت کاربران همراه شود.
توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل میشود!
تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا میکنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم.
با کمال تشکر جواد جهانگیری
شماره تلفن همراه: 09149431772
نشانی پست الکترونیکی: javad.jahangiri.niopdc@gmail.com
فیلمهای آموزشی در آپارات:جواد جهانگیری (CTO) - آپارات
فیلم آموزشی در یوتویب: javad jahangiri - YouTube
نسخه مقاله: 2.3 - تاریخ بروزرسانی: 1400/11/04
در ابتدای اموزش می خواهیم نحوه نصب Redis را آموزش دهیم با توجه به اینکه دیتابیس Redis بر روی لینوکس می باشد و با مراجعه به سایت Redis مشاهده می کنید که نسخه رسمی برای ویندوز ارایه نشده است
برای نصب Redis در ویندوز سه روش وجود دارد که با هم بررسی می کنیم
با مراجعه به سایت گیت از این قسمت نسخه نصبی Redis را دانلود و نصب کنید
و از اخر این صفحه نسخه msi ان را دانلود و نصب می کنیم
بعد از نصب Redis بصورت یک سرویس به ویندوز اضافه می شود
در نهایت می توانید وارد Command Prompt ویندوز شده و از طریق دستور Redis-cli وارد کنسول Redis شویم:
ابتدا بایستی windows subsystem for Linux و Virtual Machine platform از قسمت windows Features فعال می کنیم
سپس از طریق لینک زیر نسبت به نصب WSL2 با دستور زیر اقدام می کنید:
wsl --install
سپس از طریق Microsoft Store نسبت به نصب Ubuntu در ویندوز اقدام می کنیم:
سپس از طریق Microsoft Store نسبت به نصب Windows Terminalدر ویندوز اقدام می کنیم:
در نهایت بعد از اتمام مراحل بایستی مطمن شوید که نسخه WSL2 در سیستم شما فعال شده است که برای این کار مطابق تصویر عمل کنید:
در نهایت وارد کنسول لینوکس ابونتو در محیط ویندوز می شویم :
sudo apt update && apt upgrade
بعد از اتمام بروزرسانی لینوکس برای نصب Redis دستور زیر را در ترمینال وارد می کنیم :
sudo apt install redis-server
ودر پاسخ جواب yes راصادر می کنیم تا Redis در لینوکس اوبنتور در wsl2 ویندوز نصب شود و بعد از اتمام نصب می توانیم از دستور زیر سرور Redis را راه اندازی کنیم:
redis-server
و در نهایت یک تب جدید در ترمینال ابونتو باز می کنیم و از طریق دستور Redis-Cli وارد کنسول Redis می شویم :
نکته :
اگر بخواهیم دیتابیس Redis در لینوکس ابونتو بصورت سرویس در پس زمینه اجرا شود از طریق دستور زیر عمل می کنیم:
sudo service redis-server start
روش نصب با داکر برای برنامه نویس توصیه می شود ابتدا وارد سایت docker hub مطابق شکل زیر می شویم و Redis را جستجو می کنیم و از نتایج نسخه official image را پیدا کرده و مطابق مستندات شروع به نصب می کنیم
مطابق اموزش های قبلی برنامه Docker Desktop را اجرا کرده وارد ترمینال ویندوز شده و ایمیج مربوط را pull می کنیم
بعداز پول شده ایمیج می بایستی در لیست ایمیج های داکردسکتاپ ردیس اضافه شده باشد
سپس از روی مستندات ایمیج Redis مطابق دستور زیر عمل می کنیم
docker run -d -p 6379:6379 --name aspnetrun-redis redis
حالا می توانید از طریق دستور زیر چک کنید که Redis بدرستی اجرا شده است
همچنین می توانید از طریق Docker Desktop نیز اجرا شدن صحیح Redis مطمن شوید
از طریق دستور زیر می توایند به محیط اینتر اکتیو مربوط به شل Redis وارد شوید:
docker exec -it aspnetrun-redis /bin/bash
سپس با وارد کردن Redis-cli وارد خط دستورات Redis می شویم و ادامه اموزش شروع به کار با دستورات Redis می کنیم ،همانطور که می دانید دیتابیس Redis بصورت جفت کلیدهای key/value کار می کند برای تست صحیح بودن عملیات یک کلید بنام name با مقدار javad ایجاد کرده و دوباره اطلاعات ان را به شرح ذیل می خوانیم:
برای ذخیره سازی داده ها بصورت عمومی در ردیس ما پنج گزینه در اختیار داریم:
همانگونه که اشاره کردیم Redis یک دیتابیس In Memory می باشد و داده ها را در Ram نگهداری می کند و دارای سرعت خیلی زیادی می باشد ولی یکی از امکاناتی در ردیس داریم امکانات نگهداری داده ها بصورت دایمی می باشد
برای نگهداری داده های ردیس در هارد بصورت دایمی بصورت کلی دو روش داریم
در ادامه اموزش شروع به بررسی دیتابیس Redis می کنیم مطابق اموزش های قبلی بعنوان منبع اموزشی از سایت https://www.tutorialspoint.com استفاده می کنیم:
ردیس یه برنامه اوپن سورس با مجوز BSD و در حقیقت یک دخیره ساز پیشرفته key/value می باشد اغلب از آن به عنوان سرور ساختار داده یاد می شود، زیرا کلیدها می توانند شامل رشته ها، هش ها، لیست ها، مجموعه ها و مجموعه های مرتب شده باشند. Redis به زبان C نوشته شده است. این آموزش درک خوبی از مفاهیم Redis، مورد نیاز برای ایجاد و استقرار یک سیستم بسیار مقیاس پذیر و عملکرد محور را ارائه می دهد.
این آموزش برای برای برنامه نویسان و معماران نرم افزار که مایل به یادگیری Redis در مراحل ساده و آسان هستند طراحی شده است. پس از تکمیل این آموزش، شما در سطح متوسطی از تخصص خواهید بود که از آنجا می توانید خود را به سطح بالاتری از تخصص ببرید.
قبل از ادامه این آموزش، باید دانش اولیه در مورد ساختارهای داده داشته باشید
ردیس (Redis) یک برنامه اوپن سورس ، یک منبع ذخیزه پیشرفته بصورت key/value می باشد و یک راه حل مناسب برای ساخت برنامه های کاربردی وب با کارایی بالا و مقیاس پذیر است. Redis دارای سه ویژگی اصلی است که آن را متمایز می کند.
در زیر مزایای خاصی از Redis بررسی می شود:
ردیس بسیار سریع است و می تواند حدود 110000 SET در ثانیه، حدود 81000 GET در ثانیه انجام دهد.
ردیس بطور بومی از بسیاری از انواع داده هایی که توسعه دهندگان از قبل می شناسند مانند لیست، مجموعه، مجموعه مرتب شده و هش پشتیبانی می کند. این امر حل انواع مشکلات را آسان می کند زیرا می دانیم کدام مشکل با کدام نوع داده بهتر قابل رسیدگی است
تمام عملیات Redis اتمیک هستند، که تضمین می کند که اگر دو مشتری به طور همروند درخواست دسترسی به داده ای را داشته باشند، سرور Redis مقدار به روز شده (آخرین به روزرسانی )را ارایه می کند
ردیس یک ابزار چندکاربردی است و میتواند در موارد متعددی مانند ذخیرهسازی، صفهای پیامرسانی مورد استفاده قرار گیرد (Redis به طور بومی از Publish پشتیبانی میکند).
در Redis، یک فایل پیکربندی (redis.conf) در دایرکتوری ریشه Redis موجود است. اگرچه می توانید تمام تنظیمات Redis را با دستور Redis CONFIG دریافت و تنظیم کنید.
Following is the basic syntax of Redis CONFIG command.
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
redis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice"
To get all configuration settings, use * in place of CONFIG_SETTING_NAME
redis 127.0.0.1:6379> CONFIG GET *
برای بهروزرسانی پیکربندی، میتوانید فایل redis.conf را مستقیماً ویرایش کنید یا میتوانید تنظیمات را از طریق دستور CONFIG set بهروزرسانی کنید.
Following is the basic syntax of CONFIG SET command.
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
redis 127.0.0.1:6379> CONFIG SET loglevel "notice" OK redis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice"
توجه شود ردیس دارای چهار حالت لاگ گیری می باشد
Redis has four log levels: debug, verbose, notice, and warning.
که در این مثال loglevel بر روی notice تنظیم شده است دقت کنید حالت پیش فرض لاگ گیری هم notice می باشد.
ردیس از 5 نوع نوع داده پشتیبانی می کند.
رشته Redis دنباله ای از بایت است. رشتهها در Redis دودویی امن هستند، به این معنی که طول مشخصی دارند و انتهای متن توسط هیچ کاراکتر پایاندهنده خاصی تعیین نمیشود. بنابراین، شما می توانید هر چیزی تا 512 مگابایت را در یک رشته ذخیره کنید.
Example
redis 127.0.0.1:6379> SET name "tutorialspoint" OK redis 127.0.0.1:6379> GET name "tutorialspoint"
در مثال بالا، SET و GET دستورات Redis هستند، name کلید استفاده شده در Redis و tutorialspoint مقدار رشته ای است که در Redis ذخیره می شود.
نکته:
حداکثر سایز یک رشته در در ردیس 512 مگابایت می باشد و اگر کلیدی حذف شده و یا ایجاد نشده باشد و درخواست شود Redis مقدار (nil) به معنی NULL را برگشت می دهد
لیست های Redis به سادگی لیستی از رشته ها هستند که بر اساس ترتیب درج مرتب شده اند. می توانید عناصر را در لیست های Redis در head یا tail لیست اضافه کنید. حداکثر طول یک لیست بیش از 4 میلیارد عنصر در هر لیست می باشد.
در حقیقت یک Linked list هستند که برای مطالعه بیشتر به سایت wiki مراجعه نمایید فقط توجه شود در ردیس لیست ها بصورت تک طرفه Singly linked list پیداسازی می شود ولی اگر حضور ذهن داشته باشید در اموزش ها سی شارپ توضیح داده ام که در سی شارپ لیست ها بصورت Doubly linked list می باشد دو جهت بوده و می توان در دو جهت از اول به اخر یا از اخر به اول پیمایش شود.
Example
redis 127.0.0.1:6379> LPUSH tutorials redis (integer) 1 redis 127.0.0.1:6379> LPUSH tutorials mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH tutorials mysql (integer) 3 redis 127.0.0.1:6379> LRANGE tutorials 0 10 1) "mysql" 2) "mongodb" 3) "redis"
Example:
هش Redis مجموعهای از جفتهای ارزش کلیدی است. هش های Redis نقشه هایی بین فیلدهای رشته و مقادیر رشته هستند. از این رو، از آنها برای نمایش اشیا استفاده می شود.
برای مطالعه بیشتر در مورد hash پیشنهاد می دهم ابتدا اموزش های بنده را در این راستا در آپارات را مطالعه نمایید
Example
redis 127.0.0.1:6379> HMSET user:1 username tutorialspoint password tutorialspoint points 200 OK redis 127.0.0.1:6379> HGETALL user:1 1) "username" 2) "tutorialspoint" 3) "password" 4) "tutorialspoint" 5) "points" 6) "200"
در مثال بالا، از نوع داده هش برای ذخیره شی کاربر استفاده می شود که حاوی اطلاعات اولیه کاربر است.در اینجا HMSET، HGETALL دستوراتی برای Redis هستند، در حالی که کلید جستجو user-1 می باشد
Every hash can store up to (more than 4 billion field-value pairs).
لیست های Redis به سادگی لیستی از رشته ها هستند که بر اساس ترتیب درج مرتب شده اند. شما می توانید عناصر را به لیست Redis در head یا tail اضافه کنید.
Example
redis 127.0.0.1:6379> lpush tutoriallist redis (integer) 1 redis 127.0.0.1:6379> lpush tutoriallist mongodb (integer) 2 redis 127.0.0.1:6379> lpush tutoriallist rabitmq (integer) 3 redis 127.0.0.1:6379> lrange tutoriallist 0 10 1) "rabitmq" 2) "mongodb" 3) "redis"
The max length of a list is 4294967295, more than 4 billion of elements per list
مجموعههای Redis مجموعهای نامرتب از رشتهها هستند. در Redis، می توانید اضافه کنید، حذف کنید، و وجود اعضا را در پیچیدگی زمانی O(1) آزمایش کنید.
redis 127.0.0.1:6379> sadd tutoriallist redis (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist mongodb (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq (integer) 0 redis 127.0.0.1:6379> 1) "rabitmq" 2) "mongodb" 3) "red
نکته:
در مثال بالا، rabbitmq دو بار اضافه شده است، اما به دلیل ویژگی منحصر به فرد مجموعه(set عضو تکراری را ثبت نمی کند)، تنها یک بار اضافه می شود.
The max number of members in a set is 4294967295, more than 4 billion of members per set.
مجموعههای مرتبشده Redis مشابه مجموعههای Redis هستند، مجموعههای غیر تکراری رشتهها. تفاوت این است که هر عضو یک مجموعه مرتب شده با یک امتیاز همراه است که برای گرفتن مجموعه مرتب شده از کوچکترین به بزرگترین امتیاز استفاده می شود. در حالی که اعضا منحصر به فرد هستند، امتیازها ممکن است تکرار شوند.
redis 127.0.0.1:6379> zadd tutoriallist 0 redis (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq"
ردیس دارای 16 دیتابیس می باشد که از شماره 0 تا 15 شماره گذاری شده است و بصورت پیش فرض در هنگام اتصال به ردیس اطلاعات در دیتابیس شماره 0 ذخیره می شود
از طریق دستور select می توانیم دیتابیس مورد نظر را انتخاب کنیم
از طریق دستور swapdb می توان تمامی داده های موجود در یک دیتابیس را ردیس را به دیتابیس دیگر ردیس منتقل کردد
swapdb 15 14
Redis Commands
دستورات Redis برای انجام برخی عملیات روی سرور Redis استفاده می شود. برای اجرای دستورات روی سرور Redis، به یک کلاینت Redis نیاز دارید. کلاینت Redis در پکیج ردیس موجود است که قبلاً آن را نصب کرده ایم.
Syntax
Following is the basic syntax of Redis client.
$redis-cli
مثال زیر توضیح می دهد که چگونه می توانیم مشتری Redis را راه اندازی کنیم. برای راه اندازی مشتری Redis، ترمینال را باز کرده و دستور redis-cli را تایپ کنید. این به سرور محلی شما متصل می شود و اکنون می توانید هر دستوری را اجرا کنید.
$redis-cli redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING PONG
در مثال بالا، ما به سرور Redis در حال اجرا در ماشین محلی متصل می شویم و یک دستور PING را اجرا می کنیم که بررسی می کند آیا سرور در حال اجرا است یا خیر.
برای اجرای دستورات روی سرور راه دور Redis، باید توسط همان کلاینت redis-cli به سرور متصل شوید.
$ redis-cli -h host -p port -a password
مثال زیر نحوه اتصال به سرور از راه دور Redis را نشان می دهد که روی هاست 127.0.0.1 اجرا می شود، پورت 6379 و دارای رمز عبور mypass است.
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass" redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING PONG
دستورات Redis keys برای مدیریت کلیدها در Redis استفاده می شود. در زیر نحوه استفاده از دستورات کلیدهای redis آمده است.
redis 127.0.0.1:6379> COMMAND KEY_NAME
redis 127.0.0.1:6379> SET tutorialspoint redis OK redis 127.0.0.1:6379> DEL tutorialspoint (integer) 1
در مثال بالا، DEL فرمان است، در حالی که tutorialspoint کلید است. اگر کلید حذف شود، خروجی دستور (عدد صحیح) 1 و در غیر این صورت (عدد صحیح) 0 خواهد بود.
برای تغییر نام یک کلید از دستور زیر استفاده می کنیم
rename old_key new_key
Following table lists some basic commands related to keys.
در ردیس expire برای مشخص کردن زمان از بین رفتن یک کلید براساس ثانیه می باشد و ttl نیز زمان باقیمانده برای از بین رفتن کلید را نمایش می دهد اگر عدد -2 را نمایش دهد به معنی key does not exis می باشد یعنی کلید حذف شده است و اگر عدد -1 نمایش دهد key exists but has no associated expire به معنی کلید وجود دارد و زمان ان منقضی نشده است(حالت نرمال در ttl عدد -1 را نمایش می دهد )
redis> SET mykey "Hello" "OK" redis> EXPIRE mykey 10 (integer) 1 redis> TTL mykey (integer) 10 redis>
دستورات رشته های Redis برای مدیریت مقادیر رشته در Redis استفاده می شود. در زیر نحوه استفاده از دستورات رشته Redis آمده است.
redis 127.0.0.1:6379> COMMAND KEY_NAME
redis 127.0.0.1:6379> SET tutorialspoint redis OK redis 127.0.0.1:6379> GET tutorialspoint "redis"
In the above example, SET and GET are the commands, while tutorialspoint is the key.
Following table lists some basic commands to manage strings in Redis.
Redis - Hashes
هش های ردیس برای مپ کردن بین فیلدهای رشته و مقادیر رشته هستند. از این رو، آنها بهترین نوع داده برای نمایش اشیا هستند. در ردیس، هر هش می تواند بیش از 4 میلیارد جفت فیلد-مقدار را ذخیره کند
redis 127.0.0.1:6379> HMSET tutorialspoint name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redis 127.0.0.1:6379> HGETALL tutorialspoint 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000"
در مثال بالا، جزئیات آموزش های Redis (نام، توضیحات، لایک ها، بازدیدکنندگان) را به صورت هش با نام "tutorialspoint" تنظیم کرده ایم.
Following table lists some basic commands related to hash.
لیست های Redis به سادگی لیستی از رشته ها هستند که بر اساس ترتیب درج مرتب شده اند. می توانید عناصر را در لیست های Redis در head یا tail لیست اضافه کنید. حداکثر طول یک لیست 2^32 - 1 عنصر است (4294967295، بیش از 4 میلیارد عنصر در هر لیست).
redis 127.0.0.1:6379> LPUSH tutorials redis (integer) 1 redis 127.0.0.1:6379> LPUSH tutorials mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH tutorials mysql (integer) 3 redis 127.0.0.1:6379> LRANGE tutorials 0 10 1) "mysql" 2) "mongodb" 3) "redis"
در مثال بالا، سه مقدار با دستور LPUSH در لیست Redis به نام "آموزش" درج شده است.
Following table lists some basic commands related to lists.
مجموعههای Redis مجموعهای نامرتب از رشتههای منحصربهفرد هستند. منحصر به فرد به این معنی است که مجموعه ها اجازه تکرار داده ها را در یک کلید نمی دهند. در مجموعه Redis وجود اعضا را در O(1) اضافه، حذف و آزمایش کنید (زمان ثابت بدون توجه به تعداد عناصر موجود در مجموعه). حداکثر طول یک لیست 2^32 - 1 عنصر است (4294967295، بیش از 4 میلیارد عنصر در هر مجموعه).
redis 127.0.0.1:6379> SADD tutorials redis (integer) 1 redis 127.0.0.1:6379> SADD tutorials mongodb (integer) 1 redis 127.0.0.1:6379> SADD tutorials mysql (integer) 1 redis 127.0.0.1:6379> SADD tutorials mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS tutorials 1) "mysql" 2) "mongodb" 3) "redis"
در مثال بالا، با دستور SADD، سه مقدار در مجموعه Redis با نام "tutorials" درج شده است.
Following table lists some basic commands related to sets.
مجموعههای مرتبشده Redis مشابه مجموعههای Redis با ویژگی منحصربهفرد مقادیر ذخیرهشده در یک مجموعه هستند. تفاوت این است که هر عضو یک مجموعه مرتب شده با یک امتیاز همراه است که برای گرفتن مجموعه مرتب شده از کوچکترین به بزرگترین امتیاز استفاده می شود. در مجموعه مرتبسازی شده Redis، وجود اعضا را در O(1) اضافه، حذف و آزمایش کنید (زمان ثابت بدون توجه به تعداد عناصر موجود در مجموعه). حداکثر طول یک لیست 2^32 - 1 عنصر است (4294967295، بیش از 4 میلیارد عنصر در هر مجموعه).
redis 127.0.0.1:6379> ZADD tutorials 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD tutorials 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD tutorials 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD tutorials 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD tutorials 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE tutorials 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
در مثال بالا، سه مقدار به همراه امتیاز آن در مجموعه مرتبسازی شده Redis به نام «آموزش» با دستور ZADD درج شده است.
Following table lists some basic commands related to sorted sets.
ردیس HyperLogLog الگوریتمی است که از تصادفی سازی استفاده می کند تا تقریبی از تعداد عناصر منحصر به فرد در یک مجموعه را با استفاده از مقدار ثابت و کمی حافظه ارائه دهد.
این الگوریتم HyperLogLog تقریب بسیار خوبی از کاردینالیته یک مجموعه حتی با استفاده از مقدار بسیار کمی از حافظه در حدود 12 کیلوبایت در هر کلید با خطای استاندارد 0.81٪ ارائه می دهد. هیچ محدودیتی برای تعداد مواردی که می توانید بشمارید وجود ندارد، مگر اینکه به ^642 مورد نزدیک شوید.
بصورت خلاصه می توان گفت این ساختار با حذف عناصر تکراری ، با سریعترین روش و کمترین میزان حافظه می تواند تعداد عناصر موجود در این ساختار را شمارش کند
Following example explains how Redis HyperLogLog works.
redis 127.0.0.1:6379> PFADD tutorials "redis" 1) (integer) 1 redis 127.0.0.1:6379> PFADD tutorials "mongodb" 1) (integer) 1 redis 127.0.0.1:6379> PFADD tutorials "mysql" 1) (integer) 1 redis 127.0.0.1:6379> PFCOUNT tutorials (integer) 3
Following table lists some basic commands related to Redis HyperLogLog.
دستور Redis PFADD تمام آرگومان های عنصر را به ساختار داده HyperLogLog که در نام کلید مشخص شده به عنوان اولین آرگومان ذخیره شده است اضافه می کند.
Integer reply, 1 or 0.
Following is the basic syntax of Redis PFADD command.
redis 127.0.0.1:6379> PFADD KEY_NAME ELEMENTS_TO_BE_ADDED
redis 127.0.0.1:6379> PFADD mykey a b c d e f g h i j (integer) 1 redis 127.0.0.1:6379> PFCOUNT mykey (integer) 10
دستور Redis PFCOUNT برای به دست آوردن کاردینالیتی تقریبی محاسبه شده توسط ساختار داده HyperLogLog ذخیره شده در متغیر مشخص شده استفاده می شود. اگر کلید وجود نداشته باشد، 0 را برمی گرداند.
Integer reply, approximated number of unique elements.
When PFCOUNT command is used with multiple keys, then it returns approximated cardinality of the union of the HyperLogLogs.
Following is the basic syntax of Redis PFCOUNT command.
redis 127.0.0.1:6379> PFCOUNT KEY1 KEY@... KEYN
redis 127.0.0.1:6379> PFADD mykey a b c d e f g h i j (integer) 1 redis 127.0.0.1:6379> PFCOUNT mykey (integer) 10 redis 127.0.0.1:6379> PFCOUNT mykey (integer) 10 redis 127.0.0.1:6379> PFCOUNT mykey mynewkey (integer) 10
دستور Redis PFMERGE برای ادغام چندین مقدار HyperLogLog در یک مقدار منحصر به فرد استفاده میشود که تقریباً اصلی بودن اتحاد مجموعههای مشاهدهشده ساختارهای HyperLogLog مبدا را نشان میدهد.
Simple string reply OK.
Following is the basic syntax of Redis PFMERGE command.
redis 127.0.0.1:6379> PFMERGE KEY1 KEY@... KEYN
redis 127.0.0.1:6379> PFADD hll1 foo bar zap a (integer) 1 redis 127.0.0.1:6379> PFADD hll2 a b c foo (integer) 1 redis 127.0.0.1:6379> PFMERGE hll3 hll1 hll2 OK redis 127.0.0.1:6379> PFCOUNT hll3 (integer) 6
درRedis Pub/Sub سیستم پیام رسانی را پیاده سازی می کند که در آن فرستنده در اصطلاح redis به نام ناشر(publishers) پیام ها را ارسال می کند در حالی که گیرندگان مشترکین(subscribers) آنها را دریافت می کنند. لینکی که پیام ها توسط آن منتقل می شوند کانال (channel) نامیده می شود.
در Redis، مشتری می تواند هر تعداد کانال را مشترک کند.
مثال زیر نحوه عملکرد مفهوم مشترک را توضیح می دهد. در مثال زیر، یکی از مشتریان کانالی به نام «redisChat» را مشترک میکند
redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1
اکنون، دو مشتری پیامها را در یک کانال به نام «redisChat» منتشر میکنند و مشتری مشترک بالا در حال دریافت پیام است.
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by tutorials point"
(integer) 1
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by tutorials point"
Following table lists some basic commands related to Redis Pub/Sub.
تراکنش های Redis امکان اجرای گروهی از دستورات را در یک مرحله واحد فراهم می کند. در زیر دو ویژگی تراکنش ها آورده شده است.
تراکنش Redis با دستور MULTI آغاز می شود و سپس باید لیستی از دستوراتی را که باید در تراکنش اجرا شوند ارسال کنید و پس از آن کل تراکنش با دستور EXEC اجرا می شود.
redis 127.0.0.1:6379> MULTI OK List of commands here redis 127.0.0.1:6379> EXEC
Following example explains how Redis transaction can be initiated and executed.
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET tutorial redis QUEUED redis 127.0.0.1:6379> GET tutorial QUEUED redis 127.0.0.1:6379> INCR visitors QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "redis" 3) (integer) 1
Following table shows some basic commands related to Redis transactions.
در دیتابیسهای رابطه ای جهت اجرای چندین دستور اعم از ایجاد، بهروزرسانی و حذف، از تراکنش یا Transaction ها استفاده میشود. هر تراکنش باید قوانین ACID را رعایت کند، در غیر اینصورت قابلاجرا نمیباشد. این قوانین با استفاده از نوعی سیستم قفل گذاری پیاده سازی شدهاند.
قوانین ACID شامل موارد ذیل است که باید در تراکنش دیتابیسهای رابطه ای رعایت گردد:
• Atomicity: این خاصیت که به خاصیت همه یا هیچ معروف است، بیانگر این است که یک تراکنش یا باید به طور کامل اجرا شود یا اصلا اجرا نشود. برای مثال اگر در یک تراکنش سه عملیات مختلف انجام گیرد، یا هر سه این عملیات باید تا پایان تراکنش به صورت کامل انجام شوند یا هیچ کدام از آنها انجام نشوند. دستورات باید به ترتیب و سریالی انجام گیرند و در صورتی که مشکلی در سیستم به وجود آمد (مثلا برق قطع شد)، سیستم باید بعد از اتصال دوباره، عملیات ها را Rollback نماید، به این ترتیب که گویا هیچ کدام از دستورات صورت نگرفته است.
• Consistency: برای درک درست مفهوم سازگاری، مثال تراکنش های بانک را در نظر بگیرید. در یک سیستم حسابداری بانک، مجموعه پول های انتقالی بین بانک باید ثابت باشد. در نظر بگیرید که مثلا اگر ۵۰ هزار تومان از حساب کاربری A به حساب کاربری B منتقل شد، مجموعه پول های موجود در بانک تغییر نخواهد کرد. این همان مفهوم سازگاری است. یعنی یک تراکنش، دیتابیس را از یک حالت سازگار به یک حالت سازگار دیگر انتقال میدهد.
• Isolation: فرض کنید در یک دیتابیس، چندین تراکنش با یکدیگر در حال اجرا هستند. هر تراکنش نباید از اجرای دیگر تراکنش ها مطلع شود. یعنی این تراکنش ها باید طوری اجرا شوند که انگار، فقط همین یک تراکنش در حال اجرا در کل دیتابیس است.
• Durability : به این معناست که یک تراکنش بعد از اتمام، باید در حافظه باقی بماند. یعنی اگر یک تراکنش با موفقیت به اتمام رسید، نتایج کار، با قطع برق یا اتفاق های دیگر از بین نرود.
ردیس از قوانین ACID فقط دو قانون یعنی Isolationو Atomicityرا رعایت میکند و قوانین دیگر را بر عهده برنامهنویس میگذارد.
Redis با استفاده از دستورات زیر که در دو بخش است ، تراکنش ها را مدیریت و اجرا میکند.
1. MULTI, EXEC, DISCARD – دستوراتی جهت ورود به تراکنش و خروج از آن.
2. WATCH, UNWATCH – مشاهده یک کلید خاص جهت تغییرات آن توسط client های دیگر.
تراکنش با دستور MULTI شروع میشود، این دستور همیشه پاسخ "OK" را برگشت میدهد. سپس دستورات وارد شده بعد از آن صف بندی میشوند و با دستور EXEC دستورات موجود در صف به ترتیب اجرا میشوند و تراکنش پایان مییابد
در صورت استفاده از DISCARD به جای EXEC کل دستورات موجود در صف حذف شده و تراکنش پایان مییابد.
همانطور که در شکل زیر قابلمشاهده است پاسخ EXEC یک آرایه است و هر کدام از مقادیر آرایه نتیجه اجرای هر کدام از دستورات است و چون دستورات به صورت ترتیبی انجام میگیرد ترتیب مقادیر آرایه نیز با ترتیب اجرای دستورات هماهنگ است.
نمونهای از کد تراکنش در ردیس را مشاهده کنید :
$ret = $redtis->multi( ) ->set('key1', ‘val1') ->get('keyl1' ) ->set('key2', ‘val2') ->get('key2' ) ->exec( ); /* $ret == Array( 0 => TRUE, 1 => 'val1', 2 => TRUE, 3 => ‘val2' ); */
در صورتی که یک client با سرور ردیس ارتباط داشته باشد استفاده از دستورات بالا صحیح میباشد ولی اگر چند client با سرور در ارتباط باشند احتمال خرابی داده موجود در سرور وجود دارد. جهت جلوگیری از خرابی داده میباید از WATCH , UNWATCH استفاده کرد.
دستور WATCH جهت مشاهده تغییرات کلید خاص توسط client های دیگر استفاده میشود و دستور UNWATCH برای پاک کردن مشاهدات client موجود استفاده میگردد.
$redis->watch( 'x'); $ret = $redis->multi( ) ->incr('x') ->exec(); /* $ret = FALSE if x has been modifted between the call to WATCH and the call to EXEC. */
در شکل بالا اگر کلید "x" توسط client دیگری watch شده بود و در حال استفاده بود، نتیجه False برمی گرداند و تراکنش مورد نظر می بایست در زمان دیگری اجرا گردد تا اگر client مورد نظر کلید "x" را رها (UNWATCH) کرده بود تراکنش اجرا گردد.
در طول یک تراکنش امکان رخداد دو نوع خطا وجود دارد که در ادامه به آنها خواهیم پرداخت.
• ممکن است یک دستور در صف قرار نگیرد ، بنابراین ممکن است قبل از فراخوانی دستور EXEC خطایی رخ دهد. به عنوان مثال دستور وارد شده اشتباه باشد (تعداد آرگومان اشتباه ، نام فرمان اشتباه و ...) یا ممکن است شرایط بحرانی مانند پر شدن حافظه وجود داشته باشد (اگر تنظیم سرور برای maxmemory تنظیم شده باشد). که در این صورت داده مورد نظر خراب نشده و تا اینجا Consistency رعایت میشود.
• یک خطا ممکن است پس از فراخوانی EXEC اتفاق بیافتد. به عنوان مثال از آنجا که ما عملیاتی را بر روی یک کلید با مقدار اشتباه انجام دادیم (مانند فراخوانی یک عملیات لیست در برابر یک مقدار رشته). در شکل زیر این خطا را ملاحظه می فرمایید.
> MULTI OK > set x "abc" QUEUED > lpop a QUEUED > EXEC +0K -ERR Operation against a key holding the wrong kind of value
دستور EXEC پاسخ دو رشته عناصر را بر می گرداند که یکی "OK" و پاسخ دیگری ERR است که وظیفه ی برنامهنویس یافتن راه حلی منطقی برای کنترل خطا و انتقال آن به کاربر است.
توجه به این نکته مهم است که حتی هنگامی که یک فرمان دچار مشکل میشود، تمام دستورات دیگر در صف پردازش قرار میگیرند و Redis مانع پردازش دستورات نمیشود. که این موجب عدم رعایت Consistency یا سازگاری در اطلاعات میگردد.
از دستور DISCARD به منظور متوقف کردن تراکنش استفاده میشود. در این حالت، هیچ فرمانی اجرا نمیشود و وضعیت اتصال به ردیس به حالت عادی بازگردانده می شود :
> set x 1 OK > multi OK > incr x QUEUED > discard OK > get x "1"
در صورتی که تجربه کار با دیتابیسهای رابطه ای را دارید، این که دستورات Redis میتوانند در طول یک تراکنش دچار مشکل شوند، اما Redis به جای Rollback کردن آنها، مابقی دستورات را اجرا میکند، ممکن است برای شما عجیب به نظر برسد.
با این وجود دلایل خوبی برای این رفتار وجود دارد:
• دستورات Redis فقط درصورتی میتوانند موجب خطا شوند که با یک ساختار و Syntax اشتباه فراخوانی شوند یا دستورات فراخوانی شده برای دیتاتایپ کلید مورد نظر تعریف شده نباشد، مطابق آنچه که در خطاهای نوع دوم گفتیم. این مشکلات در حین افزودن دستور به صف قابل تشخیص نیست چون دستور اجرا نمیشود بلکه صف بندی میشود. بلکه پس از فراخوانی دستور EXEC ،وقتی نوبت اجرای دستور مشکل دار میرسد، خطا بر می گرداند.
• Redis از نظر ساختار سادهتر و از لحاظ دسترسی سریع تر است به همین دلیل نیازی به Rollback ندارد.
لذا با توجه به این دلایل، کنترل و مدیریت این خطاها بر عهده ی برنامهنویس گذاشته شده است.
اسکریپت Redis برای ارزیابی اسکریپت ها با استفاده از مفسر Lua استفاده می شود. از نسخه 2.6.0 در Redis ساخته شده است. دستور مورد استفاده برای اسکریپت نویسی دستور EVAL است.
Following is the basic syntax of EVAL command.
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
Following example explains how Redis scripting works.
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second"
Following table lists some basic commands related to Redis Scripting.
این مقاله اموزش هنوز تمام نشده است و درحین تهیه می باشد !!!
در دوره های آموزش آنلاین تضمینی مجتمع فنی ارومیه که به صورت خصوصی و عمومی در دو شیوه حضوری و آنلاین برگزار می شود سرفصل های بسیار متنوع و کاربردی را بصورت پروژه محور آموزش داده می شود تا شخص کارآموز بتواند بلافاصله پس از اتمام این دوره در کمترین زمان ممکن وارد بازار کار شود.
آموزش تخصص ماست با ما حرفه ای شوید
جهت مشاوره با شماره 09149431772 در ارتباط باشید ...