فهرست بندی ثانویه

ساخت وبلاگ

Redis دقیقاً یک فروشگاه با ارزش کلیدی نیست ، زیرا مقادیر می توانند ساختار داده های پیچیده ای باشند. با این حال یک پوسته با ارزش کلیدی خارجی دارد: در سطح API داده های سطح توسط نام کلیدی مورد توجه قرار می گیرد. این عادلانه است که بگوییم ، به طور طبیعی ، Redis فقط دسترسی به کلید اصلی را ارائه می دهد. اما از آنجا که Redis یک سرور ساختار داده است ، به منظور ایجاد شاخص های ثانویه از انواع مختلف ، از جمله شاخص های کامپوزیت (چند ستونی) ، می توان از قابلیت های آن برای نمایه سازی استفاده کرد.

این سند توضیح می دهد که چگونه می توان با استفاده از ساختار داده های زیر ، شاخص ها را در Redis ایجاد کرد:

  • مجموعه های مرتب شده برای ایجاد شاخص های ثانویه توسط شناسه یا سایر زمینه های عددی.
  • مجموعه های مرتب شده با دامنه های واژگونی برای ایجاد شاخص های ثانویه پیشرفته تر ، شاخص های کامپوزیت و شاخص های نمودار نمودار.
  • مجموعه ای برای ایجاد شاخص های تصادفی.
  • لیست هایی برای ایجاد شاخص های ساده قابل تکرار و آخرین فهرست موارد N.

اجرای و حفظ شاخص ها با Redis موضوعی پیشرفته است ، بنابراین بیشتر کاربرانی که نیاز به انجام نمایش داده های پیچیده در مورد داده ها دارند ، باید درک کنند که آیا آنها بهتر توسط یک فروشگاه رابطه ای ارائه می شوند. با این حال ، غالباً ، به ویژه در سناریوهای ذخیره سازی ، نیاز صریح برای ذخیره داده های ایندکس شده در REDIS به منظور سرعت بخشیدن به سؤالات متداول که برای اجرای آن به نوعی نمایه سازی نیاز دارند ، وجود دارد.

شاخص های عددی ساده با مجموعه های مرتب شده

ساده ترین شاخص ثانویه که می توانید با Redis ایجاد کنید ، با استفاده از نوع داده های مرتب شده مرتب شده است ، که یک ساختار داده است که مجموعه ای از عناصر را که توسط یک شماره نقطه شناور سفارش داده شده است که نمره هر عنصر است ، نشان می دهد. عناصر از کوچکترین تا بالاترین امتیاز سفارش داده می شوند.

از آنجا که نمره یک شناور با دقت مضاعف است ، ایندکس هایی که می توانید با مجموعه های مرتب شده وانیل ایجاد کنید ، محدود به مواردی است که قسمت فهرست بندی یک عدد در یک محدوده معین است.

دو دستور برای ساختن این نوع شاخص ها Zadd و Zrange با آرگومان Byscore هستند تا به ترتیب موارد را اضافه کنند و موارد را در یک محدوده مشخص بازیابی کنند.

به عنوان مثال ، با افزودن عنصر به یک مجموعه مرتب شده ، می توان مجموعه ای از نام های شخص را با سن خود فهرست بندی کرد. این عنصر نام شخص خواهد بود و نمره سن خواهد بود.

به منظور بازیابی همه افراد با سن بین 20 تا 40 ، از دستور زیر استفاده می شود:

با استفاده از گزینه WithScores Zrange نیز می توان نمرات مرتبط با عناصر برگشتی را بدست آورد.

از دستور zcount می توان به منظور بازیابی تعداد عناصر در یک محدوده معین استفاده کرد ، بدون اینکه در واقع عناصر را واگذار کند ، که این نیز مفید است ، به خصوص با توجه به این واقعیت که این عمل در زمان لگاریتمی بدون در نظر گرفتن اندازه دامنه اجرا می شود.

دامنه ها می توانند فراگیر یا منحصر به فرد باشند ، لطفاً برای اطلاعات بیشتر به مستندات دستور Zrange مراجعه کنید.

توجه: با استفاده از Zrange با آرگومان های Byscore و Rev ، می توان از طیف وسیعی به ترتیب معکوس پرس و جو کرد ، که اغلب وقتی داده ها در یک جهت معین (صعودی یا نزولی) فهرست بندی می شوند ، مفید است اما می خواهیم اطلاعات را به روش دیگر بازیابی کنیمواد

با استفاده از IDS اشیاء به عنوان مقادیر مرتبط

در مثال بالا ما اسامی را با سنین مرتبط مرتبط کردیم. با این حال به طور کلی ممکن است بخواهیم برخی از زمینه های یک شی را که در جای دیگر ذخیره می شود ، فهرست کنیم. به جای استفاده از مقدار تنظیم شده مرتب شده به طور مستقیم برای ذخیره داده های مرتبط با قسمت فهرست بندی شده ، می توان فقط شناسه شی را ذخیره کرد.

به عنوان مثال من ممکن است هش های Redis داشته باشم که کاربران را نمایندگی می کند. هر کاربر توسط یک کلید واحد ارائه می شود ، که به طور مستقیم توسط شناسه قابل دسترسی است:

اگر می خواهم برای پرس و جو کاربران تا سن خود ، یک شاخص ایجاد کنم ، می توانم انجام دهم:

این بار مقدار مرتبط با نمره در مجموعه مرتب شده ، شناسه شی است. بنابراین ، هنگامی که من از فهرست با Zrange با استدلال Byscore پرس و جو می کنم ، باید اطلاعات مورد نیاز خود را با دستورات HgetAll یا مشابه بازیابی کنم. مزیت بارز این است که اشیاء می توانند بدون لمس شاخص تغییر کنند ، تا زمانی که ما زمینه فهرست بندی شده را تغییر ندهیم.

در مثالهای بعدی تقریباً همیشه از شناسه ها به عنوان مقادیر مرتبط با شاخص استفاده می کنیم ، زیرا این امر معمولاً طراحی صوتی تر است ، با چند استثنا.

به روزرسانی شاخص های مرتب شده مرتب شده

اغلب ما چیزهایی را که با گذشت زمان تغییر می کنند فهرست می کنیم. در مثال فوق ، سن کاربر هر ساله تغییر می کند. در چنین حالتی منطقی است که به جای خود سن ، از تاریخ تولد به عنوان شاخص استفاده کنیم ، اما موارد دیگری نیز وجود دارد که ما به سادگی می خواهیم برخی از زمینه ها هر از گاهی تغییر کنند و شاخص برای بازتاب این تغییر باشد.

دستور ZADD به روزرسانی شاخص های ساده را به عنوان یک عمل بسیار بی اهمیت از آنجا که دوباره یک عنصر را با نمره متفاوت باز می کند ، می کند و همان مقدار به سادگی نمره را به روز می کند و عنصر را در موقعیت مناسب حرکت می دهد ، بنابراین اگر کاربر آنتیرز 39 ساله شود ،به منظور به روزرسانی داده های موجود در هش به نمایندگی از کاربر ، و در فهرست نیز باید دو دستور زیر را اجرا کنیم:

این عملیات ممکن است در یک معامله چند یا EXEC پیچیده شود تا اطمینان حاصل شود که هر دو قسمت به روز شده اند یا هیچ کدام.

تبدیل داده های چند بعدی به داده های خطی

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

به عنوان مثال API Indexing Redis Geo از یک مجموعه مرتب شده برای فهرست بندی مکان ها بر اساس عرض جغرافیایی و طول جغرافیایی با استفاده از تکنیکی به نام Geo Hash استفاده می کند. نمره مجموعه مرتب شده نمایانگر بیت های متناوب طول و عرض جغرافیایی است ، به طوری که ما نمره خطی یک مجموعه مرتب شده را در بسیاری از مربع های کوچک در سطح زمین نقشه می کنیم. با انجام یک مرکز سبک 8+1 به علاوه محله ها می توان عناصر را توسط شعاع بازیابی کرد.

محدودیت های نمره

نمرات عناصر مجموعه مرتب شده شناورهای دوتایی هستند. این بدان معناست که آنها می توانند مقادیر اعشاری یا عدد صحیح مختلفی را با خطاهای مختلف نشان دهند ، زیرا از یک بازنمایی نمایی در داخل استفاده می کنند. با این حال آنچه برای اهداف نمایه سازی جالب است این است که نمره همیشه قادر است بدون هیچ شماره خطایی بی ن-9007199254740992 و 9007199254740992 ، که -/+ 2^53 است.

هنگام نمایندگی اعداد بسیار بزرگتر ، به یک شکل متفاوت از نمایه سازی نیاز دارید که قادر به فهرست بندی اعداد با هر دقت باشد ، به نام شاخص واژگان شناسی.

شاخص های لغزشی

مجموعه های مرتب شده Redis دارای یک خاصیت جالب هستند. هنگامی که عناصر با همان نمره اضافه می شوند ، آنها به صورت واژگونی طبقه بندی می شوند و رشته ها را به عنوان داده های باینری با عملکرد MEMCMP () مقایسه می کنند.

برای افرادی که زبان C را نمی دانند و نه عملکرد MEMCMP ، این بدان معنی است که عناصر با همان نمره با مقایسه مقادیر خام بایت های خود ، بایت بعد از بایت طبقه بندی می شوند. اگر بایت اول یکسان باشد ، دوم بررسی می شود و غیره. اگر پیشوند مشترک دو رشته یکسان باشد ، رشته طولانی تر از این دو بیشتر در نظر گرفته می شود ، بنابراین "foobar" از "foo" بیشتر است.

دستوراتی مانند Zrange و Zlexcount وجود دارد که قادر به پرس و جو و تعداد دامنه ها به صورت واژگونی هستند ، با فرض اینکه از آنها با مجموعه های مرتب شده استفاده می شوند که در آن همه عناصر دارای یک امتیاز یکسان هستند.

این ویژگی redis اساساً معادل یک ساختار داده درخت B است که اغلب به منظور پیاده سازی فهرست ها با پایگاه داده های سنتی استفاده می شود. همانطور که می توانید حدس بزنید ، به همین دلیل ، می توان از این ساختار داده Redis به منظور پیاده سازی شاخص های فانتزی زیبا استفاده کرد.

قبل از اینکه به استفاده از شاخص های واژگونی بپردازیم ، بیایید بررسی کنیم که چگونه مجموعه های مرتب سازی شده در این حالت خاص عمل می کنند. از آنجا که ما باید عناصری را با همان نمره اضافه کنیم ، همیشه از نمره ویژه صفر استفاده خواهیم کرد.

واکشی همه عناصر موجود در مجموعه مرتب شده بلافاصله نشان می دهد که آنها به صورت واژگونی سفارش داده می شوند.

اکنون می توانیم از Zrange با استدلال bylex برای انجام نمایش داده های دامنه استفاده کنیم.

توجه داشته باشید که در نمایشگاه های محدوده ما عناصر Min و Max را که دامنه را با شخصیت های خاص مشخص می کنیم ، پیشوند کردیم. به این معنی است که همه عناصر را به صورت واژگونی بین یک فراگیر و B اختصاصی به من بدهید ، که همه عناصر شروع شده از a هستند.

همچنین دو کاراکتر خاص دیگر وجود دارد که رشته بی نهایت منفی و رشته بی نهایت مثبت را نشان می دهد ، که - و + هستند.

این اساساً است. بیایید ببینیم چگونه از این ویژگی ها برای ساخت فهرست استفاده کنیم.

مثال اول: تکمیل

کاربرد جالب از نمایه سازی تکمیل است. تکمیل همان اتفاقی است که وقتی شروع به تایپ کردن پرس و جو خود در موتور جستجو می کنید: رابط کاربری پیش بینی آنچه را که احتمالاً تایپ می کنید پیش بینی می کند و نمایش داده های مشترکی را که با همان کاراکترها شروع می شود ، ارائه می دهد.

یک رویکرد ساده لوحانه برای تکمیل این است که فقط هر پرس و جو موردی را که از کاربر دریافت می کنیم به شاخص اضافه کنیم. به عنوان مثال اگر کاربر موز را جستجو کند ، ما فقط انجام خواهیم داد:

و موارد دیگر برای هر پرس و جو جستجو که تاکنون با آن روبرو شده است. سپس وقتی می خواهیم ورودی کاربر را تکمیل کنیم ، با استفاده از Zrange با آرگومان Bylex ، یک پرس و جو دامنه را اجرا می کنیم. تصور کنید که کاربر در حال تایپ "بیت" در فرم جستجو است ، و ما می خواهیم کلمات کلیدی جستجوی احتمالی را برای "بیت" ارائه دهیم. ما یک فرمان مانند آن را ارسال می کنیم:

در اصل ما با استفاده از رشته ای که کاربر در حال حاضر در حال تایپ کردن است ، و همان رشته به علاوه یک بایت دنباله دار روی 255 ، که در مثال xff است ، به عنوان انتهای دامنه ، ایجاد می کنیم. به این ترتیب ما تمام رشته هایی را که برای رشته ای که کاربر تایپ می کند شروع می کنیم.

توجه داشته باشید که ما می خواهیم موارد زیادی را برگردانیم ، بنابراین ممکن است برای کاهش تعداد نتایج از گزینه حد استفاده کنیم.

اضافه کردن فرکانس به مخلوط

رویکرد فوق کمی ساده لوح است ، زیرا تمام جستجوهای کاربر از این طریق یکسان هستند. در یک سیستم واقعی می خواهیم رشته ها را با توجه به فرکانس آنها تکمیل کنیم: جستجوهای بسیار محبوب با احتمال بالاتر در مقایسه با رشته های جستجو که به ندرت تایپ می شوند ، پیشنهاد می شود.

به منظور پیاده سازی چیزی که به فرکانس بستگی دارد ، و در عین حال به طور خودکار با ورودی های آینده سازگار می شود ، با پاکسازی جستجوهایی که دیگر محبوب نیستند ، می توانیم از یک الگوریتم پخش بسیار ساده استفاده کنیم.

برای شروع ، ما شاخص خود را اصلاح می کنیم تا نه تنها اصطلاح جستجو ، بلکه فرکانس این اصطلاح را نیز ذخیره کنیم. بنابراین به جای اضافه کردن موز ، موز را اضافه می کنیم: 1 ، جایی که 1 فرکانس است.

ما همچنین برای افزایش شاخص اگر اصطلاح جستجو از قبل در فهرست وجود داشته باشد ، به منطق نیاز داریم ، بنابراین آنچه در واقع ما انجام خواهیم داد چیزی شبیه به آن است:

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

توجه داشته باشید که از آنجا که ممکن است به روزرسانی های همزمان وجود داشته باشد ، سه دستور فوق باید به جای آن از طریق اسکریپت LUA ارسال شود ، به طوری که اسکریپت LUA به صورت اتمی تعداد قدیمی را بدست می آورد و مورد را با نمره افزایش یافته دوباره اضافه می کند.

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

موارد بیشتری وجود دارد: هدف ما این است که فقط مواردی را که به طور مکرر جستجو می شود ، جستجو کنیم. بنابراین ما به نوعی پاکسازی نیاز داریم. هنگامی که ما واقعاً از این فهرست برای تکمیل ورودی کاربر پرس و جو می کنیم ، ممکن است چیزی شبیه به آن را ببینیم:

به عنوان مثال ، هیچ کس به دنبال "Banaooo" نیست ، اما پرس و جو یک بار واحد انجام شد ، بنابراین ما آن را به کاربر ارائه می دهیم.

این همان کاری است که ما می توانیم انجام دهیم. از میان موارد برگشتی ، ما یک تصادفی را انتخاب می کنیم ، نمره آن را به یک کاهش می دهیم و آن را با نمره جدید دوباره اضافه می کنیم. اما اگر نمره به 0 برسد ، ما به سادگی مورد را از لیست حذف می کنیم. شما می توانید از سیستم های بسیار پیشرفته تری استفاده کنید ، اما ایده این است که شاخص در دراز مدت شامل جستجوهای برتر خواهد بود و اگر جستجوهای برتر در طول زمان تغییر کند ، به طور خودکار سازگار خواهد شد.

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

عادی سازی رشته ها برای کیس و لهجه ها

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

یک راه ساده با این مسائل ، عادی سازی رشته ای است که کاربر جستجو می کند. هرچه کاربر در جستجوی "موز" ، "موز" یا "Ba'nana" باشد ، ما همیشه ممکن است آن را به "موز" تبدیل کنیم.

با این حال ، گاهی اوقات ممکن است دوست داشته باشیم که کاربر را با مورد اصلی تایپ کنید ، حتی اگر رشته را برای نمایه سازی عادی کنیم. برای انجام این کار ، کاری که ما انجام می دهیم تغییر قالب شاخص است تا به جای ذخیره فقط مدت زمان: فرکانس ما نرمال را ذخیره می کنیم: فرکانس: اصلی مانند مثال زیر:

در اصل ما زمینه دیگری را اضافه می کنیم که فقط برای تجسم استخراج و از آن استفاده خواهیم کرد. به جای آن ، دامنه ها همیشه با استفاده از رشته های عادی محاسبه می شوند. این یک ترفند مشترک است که دارای چندین برنامه است.

اضافه کردن اطلاعات کمکی در فهرست

هنگام استفاده از یک مجموعه مرتب شده به روش مستقیم ، ما برای هر شی دو ویژگی متفاوت داریم: نمره ای که ما به عنوان یک شاخص و یک مقدار مرتبط از آن استفاده می کنیم. به جای آن ، هنگام استفاده از شاخص های واژگونی ، نمره همیشه روی 0 تنظیم می شود و اساساً به هیچ وجه مورد استفاده قرار نمی گیرد. ما با یک رشته واحد باقی مانده ایم که خود عنصر است.

همانطور که در نمونه های تکمیل قبلی انجام دادیم ، ما هنوز قادر به ذخیره داده های مرتبط با استفاده از جداکننده هستیم. به عنوان مثال ما از روده بزرگ برای اضافه کردن فرکانس و کلمه اصلی برای تکمیل استفاده کردیم.

به طور کلی می توانیم هر نوع ارزش مرتبط را به کلید فهرست بندی خود اضافه کنیم. به منظور استفاده از یک فهرست واژگونی برای پیاده سازی یک فروشگاه با ارزش کلید ساده ، ما فقط ورودی را به عنوان کلید ذخیره می کنیم: مقدار:

و کلید را با:

سپس قسمت را بعد از روده بزرگ استخراج می کنیم تا مقدار را بازیابی کنیم. با این حال مشکلی برای حل در این مورد ، برخورد است. شخصیت روده بزرگ ممکن است بخشی از کلید خود باشد ، بنابراین باید انتخاب شود تا هرگز با کلید اضافه شده برخورد نشود.

از آنجا که دامنه های واژگانی در Redis ایمن باینری هستند ، می توانید از هر بایت یا هر دنباله ای از بایت استفاده کنید. اما اگر ورودی کاربر غیر قابل اعتماد را دریافت می کنید ، بهتر است از نوعی فرار استفاده کنید تا تضمین کنید که جداکننده هرگز اتفاق نمی افتد که بخشی از کلید باشد.

به عنوان مثال اگر از دو بایت تهی به عنوان جداکننده " 0 0" استفاده می کنید ، ممکن است بخواهید همیشه در رشته های خود از بایت های تهی در دو دنباله بایت فرار کنید.

بالشتک عددی

شاخص های واژگونی ممکن است فقط در مواردی که مشکل مورد نظر برای فهرست بندی رشته ها باشد ، خوب به نظر برسد. در واقع استفاده از این نوع شاخص به منظور انجام فهرست بندی اعداد دقیق دلخواه بسیار ساده است.

در مجموعه کاراکتر ASCII ، ارقام به ترتیب از 0 تا 9 ظاهر می شوند ، بنابراین اگر شماره های چپ را با صفرهای پیشرو سمت چپ کنیم ، نتیجه این است که مقایسه آنها به عنوان رشته ها با ارزش عددی آنها سفارش می دهد.

ما به طور موثری با استفاده از یک زمینه عددی یک شاخص ایجاد کردیم که می تواند به همان اندازه که می خواهیم باشد. این همچنین با تعداد نقطه شناور از هرگونه دقت با اطمینان از اینکه قسمت عددی را با صفرهای پیشرو و قسمت اعشاری با صفرهای دنباله دار مانند در لیست زیر از شماره ها قرار داده ایم ، کار می کند:

با استفاده از اعداد به صورت باینری

ذخیره اعداد در اعشاری ممکن است از حافظه بیش از حد استفاده کند. یک روش جایگزین فقط برای ذخیره اعداد ، به عنوان مثال عدد صحیح 128 بیتی ، مستقیماً به شکل باینری آنها است. با این حال ، برای این کار ، شما باید شماره ها را در قالب Big Endian ذخیره کنید ، به طوری که مهمترین بایت ها قبل از کمترین بایت قابل توجه ذخیره می شوند. به این ترتیب وقتی Redis رشته ها را با MEMCMP () مقایسه می کند ، به طور موثری اعداد را بر اساس مقدار آنها مرتب می کند.

به خاطر داشته باشید که داده های ذخیره شده در قالب باینری برای اشکال زدایی کمتر قابل مشاهده است ، تجزیه و صادرات سخت تر است. بنابراین قطعاً تجارت است.

شاخص های کامپوزیت

تاکنون روشهای فهرست بندی زمینه های تک را مورد بررسی قرار دادیم. با این حال همه ما می دانیم که فروشگاه های SQL قادر به ایجاد شاخص ها با استفاده از چندین زمینه هستند. به عنوان مثال ممکن است محصولات را در یک فروشگاه بسیار بزرگ با شماره اتاق و قیمت فهرست کنم.

برای بازیابی تمام محصولات در یک اتاق معین با محدوده قیمت معین ، باید نمایش داده شود. کاری که من می توانم انجام دهم این است که هر محصول را به روش زیر فهرست بندی کنم:

در اینجا زمینه ها اتاق هستند: قیمت: product_id. من فقط از چهار رقم در مثال برای سادگی استفاده کردم. داده های کمکی (شناسه محصول) نیازی به بالشتک ندارد.

با داشتن شاخصی مانند آن ، برای به دست آوردن تمام محصولات در اتاق 56 با قیمت بین 10 تا 30 دلار بسیار آسان است. ما فقط می توانیم دستور زیر را اجرا کنیم:

موارد فوق را به عنوان شاخص مرکب نامیده می شود. اثربخشی آن بستگی به ترتیب زمینه ها و نمایش داده شده هایی دارد که می خواهم اجرا کنم. به عنوان مثال ، از شاخص فوق نمی توان به طور مؤثر استفاده کرد تا تمام محصولات دارای دامنه قیمت خاص بدون در نظر گرفتن شماره اتاق باشد. با این حال من می توانم از کلید اصلی برای اجرای نمایش داده ها صرف نظر از قیمت استفاده کنم ، مانند تمام محصولات موجود در اتاق 44.

شاخص های کامپوزیت بسیار قدرتمند هستند و به منظور بهینه سازی نمایش داده های پیچیده در فروشگاه های سنتی استفاده می شوند. در Redis ، آنها می توانند برای اجرای یک شاخص Redis بسیار سریع در حافظه چیزی که در یک فروشگاه داده سنتی ذخیره شده است ، یا به منظور مستقیم نمایه سازی داده های Redis ، مفید باشند.

به روزرسانی شاخص های واژگونی

مقدار شاخص در یک شاخص واژگونی می تواند بسیار فانتزی و سخت یا آهسته باشد تا از آنچه در مورد شیء ذخیره می کنیم بازسازی شود. بنابراین یک رویکرد برای ساده کردن رسیدگی به شاخص ، با هزینه استفاده از حافظه بیشتر ، این است که در کنار مجموعه مرتب شده ای که نمایانگر فهرست A هش است که شناسه شی را به مقدار شاخص فعلی نقشه برداری می کند ، باشد.

به عنوان مثال ، هنگامی که ما فهرست می کنیم ، به هش نیز اضافه می کنیم:

این همیشه مورد نیاز نیست ، اما عملکرد به روزرسانی شاخص را ساده می کند. به منظور حذف اطلاعات قدیمی ، بدون در نظر گرفتن مقادیر زمینه های فعلی شیء ، برای ID ID 90 فهرست بندی شدیم ، فقط باید مقدار هش را با استفاده از شیء ID و ZREM در نمای تنظیم شده بازیابی کنیم.

نمودارهای نمایندگی و پرس و جو با استفاده از یک ضبیات

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

شش ضلعی نمایشی برای روابط بین اشیاء ، تشکیل شده توسط یک موضوع ، یک محمول و یک شیء فراهم می کند. یک رابطه ساده بین اشیاء می تواند باشد:

به منظور نشان دادن این رابطه می توانم عنصر زیر را در فهرست واژگانی خود ذخیره کنم:

توجه داشته باشید که من مورد خود را با SPO String Prefixed کردم. این بدان معناست که مورد یک موضوع ، محمول ، رابطه شی را نشان می دهد.

در می توانید 5 ورودی دیگر را برای یک رابطه اضافه کنید ، اما به ترتیب دیگری:

اکنون همه چیز جالب است و من می توانم از بسیاری جهات مختلف از نمودار پرس و جو کنم. به عنوان مثال ، همه افراد ضدز دوست چه کسانی هستند؟

یا ، همه روابط Antirez و Matteocollina در جایی که موضوع اول است و دوم شیء چیست؟

با ترکیب سؤالات مختلف ، می توانم سوالات فانتزی بپرسم. به عنوان مثال: همه دوستان من چه کسانی هستند که مانند آبجو در بارسلونا زندگی می کنند و ماتئوکولینا نیز دوستان را در نظر می گیرند؟برای به دست آوردن این اطلاعات ، من با یک پرس و جو SPO شروع می کنم تا تمام افرادی را که با آنها دوست هستم پیدا کنم. سپس برای هر نتیجه ، من یک پرس و جو SPO را انجام می دهم تا بررسی کنم که آیا آنها آبجو را دوست دارند ، مواردی را که برای آنها نمی توانم این رابطه را پیدا کنم ، حذف کردم. من دوباره این کار را برای فیلتر کردن توسط شهر انجام می دهم. سرانجام من از لیستی که به دست آوردم ، یک پرس و جو OPS را برای یافتن ، که توسط Matteocollina دوست محسوب می شود ، انجام می دهم.

برای درک بهتر این ایده ها، حتماً اسلایدهای متئو کولینا در مورد Levelgraph را بررسی کنید.

شاخص های چند بعدی

نوع پیچیده تر ایندکس، ایندکس است که به شما امکان می دهد پرس وجوهایی را در جایی که دو یا چند متغیر به طور همزمان برای محدوده های خاص پرس و جو می شوند، انجام دهید. به عنوان مثال، ممکن است مجموعه داده ای داشته باشم که سن و حقوق افراد را نشان می دهد، و می خواهم همه افراد 50 تا 55 ساله را که حقوقی بین 70000 تا 85000 دارند بازیابی کنم.

این پرس و جو ممکن است با یک نمایه چند ستونی انجام شود، اما این امر مستلزم آن است که متغیر اول را انتخاب کنیم و سپس متغیر دوم را اسکن کنیم، به این معنی که ممکن است کار بسیار بیشتری نسبت به نیاز انجام دهیم. انجام این نوع پرس و جوها شامل چندین متغیر با استفاده از ساختارهای داده مختلف امکان پذیر است. به عنوان مثال، گاهی اوقات از درختان چند بعدی مانند درختان k-d یا درختان r استفاده می شود. در اینجا روشی متفاوت برای فهرست بندی داده ها در ابعاد چندگانه، با استفاده از یک ترفند بازنمایی که به ما امکان می دهد پرس و جو را به روشی بسیار کارآمد با استفاده از محدوده های واژگانی Redis انجام دهیم، شرح می دهیم.

فرض کنید نقاطی در فضا داریم که نمونه های داده ما را نشان می دهد، جایی که x و y مختصات ما هستند. حداکثر مقدار هر دو متغیر 400 است.

در شکل بعدی، کادر آبی نمایانگر درخواست ما است. ما تمام نقاطی را می خواهیم که x بین 50 تا 100 باشد و y بین 100 و 300 باشد.

Points in the space

برای نمایش داده هایی که این نوع پرس و جوها را سریع انجام می دهند، با اضافه کردن اعداد خود با 0 شروع می کنیم. بنابراین برای مثال تصور کنید می خواهیم نقطه 10،25 (x, y) را به نمایه خود اضافه کنیم. با توجه به اینکه حداکثر بازه در مثال 400 است، می توانیم فقط سه رقم را اضافه کنیم، بنابراین به دست می آوریم:

حالا کاری که ما انجام می دهیم این است که ارقام را به هم می زنیم، با گرفتن سمت چپ ترین رقم در x، و سمت چپ ترین رقم در y، و به همین ترتیب، به منظور ایجاد یک عدد واحد:

این نمایه ما است، اما برای اینکه بتوانیم نمایش اصلی را راحت تر بازسازی کنیم، اگر بخواهیم (به قیمت فضا)، ممکن است مقادیر اصلی را نیز به عنوان ستون های اضافی اضافه کنیم:

حال، بیایید در مورد این نمایش و اینکه چرا در زمینه پرس و جوهای محدوده مفید است، استدلال کنیم. به عنوان مثال، اجازه دهید مرکز کادر آبی خود را که در x=75 و y=200 است، در نظر بگیرید. ما می توانیم این عدد را مانند قبل با درهم کردن ارقام رمزگذاری کنیم و به دست آوریم:

اگر دو رقم آخر را به ترتیب با 00 و 99 جایگزین کنیم چه اتفاقی می افتد؟محدوده ای را به دست می آوریم که از نظر واژگانی پیوسته است:

آنچه این نقشه به یک مربع است که تمام مقادیر را نشان می دهد که متغیر X بین 70 تا 79 است و متغیر Y بین 200 تا 209 است. برای شناسایی این منطقه خاص ، می توانیم در آن بازه نقاط تصادفی بنویسیم.

Small area

بنابراین پرس و جو واژگونی فوق به ما امکان می دهد تا به راحتی از نقاط در یک مربع خاص در تصویر استفاده کنیم. با این حال ، مربع ممکن است برای جعبه ای که در حال جستجو هستیم خیلی کوچک باشد ، به طوری که به سؤالات زیادی نیاز است. بنابراین ما می توانیم همین کار را انجام دهیم اما به جای جایگزینی دو رقم آخر با 00 و 99 ، می توانیم این کار را برای چهار رقم آخر انجام دهیم و دامنه زیر را بدست آوریم:

این بار دامنه تمام نقاط را نشان می دهد که x بین 0 تا 99 و y بین 200 تا 299 است. ترسیم نقاط تصادفی در این بازه این منطقه بزرگتر را به ما نشان می دهد.

Large area

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

اعداد ما به صورت باینری ، با فرض اینکه ما فقط برای هر متغیر فقط 9 بیت نیاز داریم (برای نشان دادن اعداد تا 400 مقدار) این خواهد بود:

بنابراین با رقم های درهم تنیده ، نمایندگی ما در شاخص خواهد بود:

بیایید ببینیم که دامنه های ما چیست ، زیرا 2 ، 4 ، 6 ، 8 را جایگزین می کنیم. بیت هایی با 0S AD 1s در بازنمایی درهم تنیده:

و غیرهاکنون ما قطعاً دانه بندی بهتری داریم! همانطور که می بینید جایگزین های N از فهرست ، جعبه های جستجوی سمت 2^(n/2) را به ما می دهد.

بنابراین کاری که ما انجام می دهیم این است که ابعادی را که جعبه جستجوی ما کوچکتر است بررسی کنید و نزدیکترین قدرت دو را به این شماره بررسی کنید. جعبه جستجوی ما 50100 تا 100،300 بود ، بنابراین دارای عرض 50 و ارتفاع 200 است. ما از این دو ، 50 کوچکتر می گیریم و نزدیکترین قدرت دو را که 64 است بررسی می کنیم. 64 2^6 است ، بنابراین مابا شاخص های به دست آمده جایگزین آخرین 12 بیت از نمایندگی درهم آمیخته می شود (به طوری که ما فقط 6 بیت از هر متغیر را جایگزین می کنیم).

هرچند مربع های منفرد ممکن است تمام جستجوی ما را پوشش ندهند ، بنابراین ممکن است ما به بیشتر نیاز داشته باشیم. کاری که ما انجام می دهیم این است که با گوشه پایین سمت چپ جعبه جستجوی ما ، که 50100 است ، شروع کنیم و با جایگزین کردن 6 بیت آخر در هر شماره با 0. اولین بار را پیدا کنیم.

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

برای هر مربع پیدا شده ، ما پرس و جو خود را انجام می دهیم و عناصر را در داخل می گیریم و عناصری را که خارج از جعبه جستجوی ما هستند ، از بین می بریم.

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

در حالی که بلافاصله بی اهمیت است ، این یک استراتژی نمایه سازی بسیار مفید است که در آینده ممکن است به روش بومی به Redis اجرا شود. در حال حاضر ، نکته خوب این است که ممکن است پیچیدگی به راحتی در داخل یک کتابخانه محصور شود که می تواند به منظور انجام نمایه سازی و نمایش داده ها مورد استفاده قرار گیرد. یک نمونه از چنین کتابخانه ای ، بازگرداندن ، اثبات مفهوم کتابخانه روبی است که با استفاده از تکنیک شرح داده شده در اینجا ، داده های بعدی را در داخل Redis نشان می دهد.

شاخص های چند بعدی با شماره های منفی یا شناور

ساده ترین راه برای نشان دادن مقادیر منفی فقط کار با اعداد صحیح بدون امضا و نشان دادن آنها با استفاده از یک افست است ، به طوری که وقتی فهرست می شوید ، قبل از ترجمه اعداد در نمایه فهرست بندی شده ، مقدار مطلق عدد صحیح منفی کوچکتر خود را اضافه می کنید.

برای شماره های نقطه شناور ، ساده ترین رویکرد احتمالاً تبدیل آنها به اعداد صحیح با ضرب عدد صحیح برای یک قدرت ده متناسب با تعداد رقم پس از نقطه ای که می خواهید حفظ کنید.

شاخص های غیر محدوده

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

به عنوان مثال ، من می توانم شناسه های شیء را به یک نوع داده تعیین شده معرفی کنم تا بتوانم از عملکرد عناصر تصادفی از طریق SRANDMEMBER به منظور بازیابی مجموعه ای از اشیاء تصادفی استفاده کنم. همچنین می توان از مجموعه ها برای بررسی وجود استفاده کرد ، در صورت نیاز من این است که یک مورد خاص وجود داشته باشد یا نه یک خاصیت بولی یا نه.

به طور مشابه می توان از لیست ها استفاده کرد تا موارد را به یک سفارش ثابت بپیوندد. من می توانم تمام موارد خود را در لیست Redis اضافه کنم و لیست را با RPOPLPush با استفاده از همان نام کلید به عنوان منبع و مقصد بچرخانم. این زمانی مفید است که من می خواهم مجموعه ای از موارد خاص را دوباره و دوباره برای همیشه به همان ترتیب پردازش کنم. به یک سیستم خوراک RSS فکر کنید که نیاز به تازه کردن نسخه محلی به صورت دوره ای دارد.

یکی دیگر از شاخص های محبوب که اغلب با Redis استفاده می شود ، یک لیست پوششی است که در آن موارد با LPUSH اضافه می شوند و با LTRIM برش داده می شوند ، تا بتوانید با آخرین موارد N روبرو شوید ، به همان ترتیب که دیده می شود.

ناسازگاری شاخص

به روز کردن شاخص ممکن است چالش برانگیز باشد ، در طی ماهها یا سالها ممکن است که به دلیل اشکالات نرم افزاری ، پارتیشن های شبکه یا سایر رویدادها ، ناسازگاری ها اضافه شوند.

می توان از استراتژی های مختلفی استفاده کرد. اگر داده های شاخص خارج از کشور باشد ، تعمیر خوانده شده می تواند یک راه حل باشد ، جایی که داده ها در صورت درخواست آن به صورت تنبل ثابت می شوند. هنگامی که ما داده هایی را که در خود Redis ذخیره شده است ، می توان از خانواده اسکن دستورات برای تأیید ، به روزرسانی یا بازسازی شاخص از ابتدا ، به صورت تدریجی استفاده کرد.

در این صفحه

این یک وب سایت جامعه است که توسط Redis Ltd. © 2022 حمایت می شود. Redis و آرم مکعب علائم تجاری ثبت شده Redis Ltd. شرایط استفاده و خط مشی رازداری هستند.

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

برچسب : نویسنده : زین‌العابدین مراغه‌ای بازدید : <-PostHit-> تاريخ : دوشنبه 11 ارديبهشت 1402 ساعت: 17:41