Redis حالا bitmap فشرده Roaring داره
خلاصهٔ کاملتر
Daniel Lemire تو وبلاگش خبر داده که Antonio Viggiano پشتیبانی از Roaring bitmap رو به خود Redis اضافه کرده و احتمالاً تو Redis 8.12 منتشر میشه. Redis یه دیتابیس in-memory هست که اغلب بهعنوان کش جلوی یه دیتابیس کندتر استفاده میشه و جز رشته، نوعهای دادهای مثل list، hash، set و stream هم داره.
bitmap یعنی نگه داشتن یه مجموعه از اعداد صحیح به شکل یه سری بیت، که بیت شماره i نشون میده عدد i تو مجموعه هست یا نه. مزیتش اینه که اشتراک و اجتماع دو مجموعه فقط با چند عمل بیتی مثل AND و OR و XOR انجام میشه. Redis از قدیم با SETBIT از bitmap پشتیبانی میکرده، ولی اونو تو یه رشته معمولی ذخیره میکنه.
مشکل اینجاست که این رشته به ازای هر هشت موقعیت بیتی یه بایت جا میگیره، تا بزرگترین offsetی که ست کردی، مهم نیست چند تا بیت واقعاً روشنه. مثلاً اگه فقط یه بیت رو تو offset چهار میلیارد روشن کنی، ۵۱۲ مگابایت حافظه میگیره و هر BITCOUNT یا BITOP هم باید کل اونو اسکن کنه.
bitmap فشرده این مشکل رو حل میکنه، یعنی مجموعه پراکنده رو کمحجم نگه میداره و شمارش و اشتراک و اجتماع رو بدون باز کردن فشردهسازی انجام میده. Roaring احتمالاً پراستفادهترین فرمت تو این زمینهست و Elasticsearch و Apache Spark و ClickHouse ازش استفاده میکنن. Roaring خودش رو با داده تطبیق میده: بخشهای پراکنده رو به شکل لیست کوتاه اعداد، بخشهای متراکم رو به شکل bitset ساده، و بازههای طولانی پشتسرهم رو به شکل run نگه میداره.
تو Redis یه نوع جدید اضافه شده: TYPE key مقدار bitmap و OBJECT ENCODING key مقدار bitmap-roaring برمیگردونه. این قابلیت اختیاریه و با CONFIG SET bitmap-default-roaring yes روشن میشه. نویسنده Redis رو از merge commit بیلد کرده و روی یه هسته Intel Xeon Gold 6548N با چهار بار کاری تست کرده: ۰.۱ درصد id تصادفی از ۱۰۰ میلیون، ۵۰ درصد تصادفی، ده run یکمیلیونی پشتسرهم، و ۱۰۰ هزار id هششده ۳۲ بیتی.
نتیجه به گفته نویسنده اینه که Roaring تو بعضی حالتها خیلی سریعتر از bitmap فشردهنشدهست. قویترین مورد idهای هششدهست، چون نسخه رشتهای باید کل چهار میلیارد موقعیت بیتی رو بپوشونه و هر BITOP ۵۱۲ مگابایت رو اسکن میکنه. نویسنده تأکید میکنه Roaring همیشه بهتر نیست و trade-offهای خودشو داره، ولی امتحان کردنش بهزودی فقط یه تنظیم کار داره.
نکات کلیدی:
- پشتیبانی از Roaring احتمالاً تو Redis 8.12 منتشر میشه
- با CONFIG SET bitmap-default-roaring yes فعال میشه و پیشفرض خاموشه
- bitmap رشتهای فعلی با یه بیت تو offset چهار میلیارد ۵۱۲ مگابایت حافظه میگیره
- OBJECT ENCODING برای نوع جدید مقدار bitmap-roaring برمیگردونه
- Roaring تو Elasticsearch و Apache Spark و ClickHouse هم استفاده میشه
- Roaring همیشه بهتر نیست و بسته به شکل داده trade-off داره




