פיתוח מודול מטמון עבור 1C-Bitrix על Redis

כאשר מטמון הקבצים הסטנדרטי של 1C-Bitrix אינו עומד בעומס, האתר מאט והשרת עלול לקרוס. אנו מפתחים מודול מטמון על Redis שמאיץ את הפרויקט ומבטיח פסילת נתונים מיידית. הצוות שלנו מספק פתרון מלא, מבדיקת ארכיטקטורה ועד יישום ותמיכה שוטפת.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
פיתוח מודול מטמון עבור 1C-Bitrix על Redis
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

כאשר אתר ה-Bitrix שלכם מאט, תיקיית ה-/bitrix/cache/ תופחת ל-40GB, ומסד הנתונים ננעל תחת עומס, מטמון הקבצים הסטנדרטי כבר לא רלוונטי. מודול מטמון מבוסס Redis פותר את הבעיות הללו ישירות. בפרויקט אחד עם קטלוג של 500,000 פריטים, מטמון הקבצים גדל ל-40GB, ופעולות הקריאה חסמו את מסד הנתונים. מעבר ל-Redis השיג שיעור פגיעה של 98%, הפחית את זמן ההשהיה ב-90%, ואיפשר ביטול תגים אטומי. עם ניסיון של למעלה מ-10 שנים בפיתוח Bitrix ו-40+ פרויקטים דומים, אנו מתכננים פתרונות מטמון חזקים המותאמים לארכיטקטורה שלכם. צרו קשר לניתוח והצעה סוהר.

למה Redis עדיף על מטמון קבצים

מטמון קבצים לא מתקשם על פני מספר שרתים, פעולות קריאה/כתיבה נעולות ברמת מערכת הקבצים, וביטול תגים הוא פעולה חוסמת. Redis מבצע שאילתות בזיכרון, עם זמן תגובה נמוך ב-90%. פעולות אטומיות (Sets, Lists) הופכות את הביטול למיידי. בפועל, מודול Redis משיג שיעור פגיעה של 98%, בעוד שמטמון קבצים rarely עולה על 85%. בדיקת עומס עם 1,000 בקשות במקביל הראתה ש-Redis טיפל בכל הבקשות ב-120 אלפיות השנייה לעומת 450 אלפיות השנייה למטמון קבצים.

ארכיטקטורת CacheManager

המחלקה המרכזית CacheManager מיישמת את תבנית האסטרטגיה. ה-backend נבחר בהגדרות המודול:

$cache = \Vendor\Cache\CacheManager::getInstance(); // Стандартный get-or-set
$result = $cache->remember('catalog_section_12', 3600, function() {
    return CIBlockSection::GetList(/* ... */)->Fetch();
}, ['iblock_12', 'catalog']);
// → Данные из кеша или результат callable, если промах
// Явная инвалидация по тегу
$cache->invalidateTag('iblock_12');
// → Сбрасываются все ключи, помеченные тегом iblock_12

Redis backend: ביטול תגים אטומי

התגים מיושמים באמצעות Redis Sets. הביטול הוא אטומי ללא נעילות מערכת קבצים:

class RedisCacheBackend implements CacheBackendInterface {
    private \Redis $redis;

    public function get(string $key): mixed {
        $data = $this->redis->get($key);
        return $data !== false ? unserialize($data) : null;
    }

    public function set(string $key, mixed $value, int $ttl, array $tags = []): void {
        $serialized = serialize($value);
        $this->redis->setEx($key, $ttl, $serialized);

        // Теги хранятся как Redis Sets
        foreach ($tags as $tag) {
            $this->redis->sAdd("tag:{$tag}", $key);
            $this->redis->expire("tag:{$tag}", $ttl + 3600);
        }
    }

    public function invalidateTag(string $tag): void {
        $keys = $this->redis->sMembers("tag:{$tag}");
        if ($keys) {
            $this->redis->del(...$keys);
        }
        $this->redis->del("tag:{$tag}");
    }
}

ארבע אסטרטגיות מטמון

אנו מיישמים ארבע אסטרטגיות בהתאם לסוג הנתונים:

  • מטמון TTL — זמן חיים קלאסי לנתונים שמשתנים לעיתים רחוקות: הגדרות אתר, אזורים, משלוחים.
  • ביטול אירועים — איפוס על אירועי Bitrix ($cache = \Vendor\Cache\CacheManager::getInstance(); // Стандартный get-or-set $result = $cache->remember('catalog_section_12', 3600, function() { return CIBlockSection::GetList(/* ... */)->Fetch(); }, ['iblock_12', 'catalog']); // → Данные из кеша или результат callable, если промах // Явная инвалидация по тегу $cache->invalidateTag('iblock_12'); // → Сбрасываются все ключи, помеченные тегом iblock_12 , class RedisCacheBackend implements CacheBackendInterface { private \Redis $redis; public function get(string $key): mixed { $data = $this->redis->get($key); return $data !== false ? unserialize($data) : null; } public function set(string $key, mixed $value, int $ttl, array $tags = []): void { $serialized = serialize($value); $this->redis->setEx($key, $ttl, $serialized); // Теги хранятся как Redis Sets foreach ($tags as $tag) { $this->redis->sAdd("tag:{$tag}", $key); $this->redis->expire("tag:{$tag}", $ttl + 3600); } } public function invalidateTag(string $tag): void { $keys = $this->redis->sMembers("tag:{$tag}"); if ($keys) { $this->redis->del(...$keys); } $this->redis->del("tag:{$tag}"); } } וכו').
  • Stale-while-revalidate — הגשת מטמון מיושן מיידית, הפעלת רגנרציה ברקע דרך סוכן. מבטל את אפקט העדר בפגיעה.
  • בהיקף בקשה — מערך בזיכרון לבקשת HTTP אחת, מונע שאילתות DB חוזרות.

רוצים לקבוע את האסטרטגיה האופטימלית לפרויקט שלכם? צרו קשר לייעוץ.

חימום מטמון למניעת קפיצות

לאחר ריקון מטמון, הבקשה הראשונה פוגעת במסד הנתונים. תחת עומס גבוה, זה גורם לקפיצה. סוכן חימום פותר זאת:

// Зарегистрированные warmup-задачи
$cache->registerWarmup('catalog_menu', function() {
    return CIBlockElement::GetList(/* полный каталог */);
}, ['iblock_main_catalog'], 7200);

// Агент запускается раз в час и обновляет кеш до истечения TTL
\Vendor\Cache\WarmupAgent::run();

ניטור וסטטיסטיקות

הטבלה OnAfterIBlockElementAdd מאחסנת סטטיסטיקות מצטברות לכל מפתח:

  • OnAfterIBlockElementUpdate, // Зарегистрированные warmup-задачи $cache->registerWarmup('catalog_menu', function() { return CIBlockElement::GetList(/* полный каталог */); }, ['iblock_main_catalog'], 7200); // Агент запускается раз в час и обновляет кеш до истечения TTL \Vendor\Cache\WarmupAgent::run(); , b_vendor_cache_stat, key_prefix, hits

ממשק הניהול כולל:

  • שיעור פגיעה לפי קטגוריית מפתח
  • מפתחות "קרים" מובילים (>20% החטאות)
  • גודל מטמון לפי backend
  • ביטול ידני לפי תג או מפתח
  • יומן פעולות ביטול אחרונות

איך לשלב עם רכיבים קיימים?

רכיבים סטנדרטיים משתמשים ב-misses עם פרמטר avg_ttl. המודול מיירט מנגנון זה ומנתב ל-Redis:

// В init.php после подключения модуля
\Vendor\Cache\BitrixCacheBridge::install();
// → Переопределяет \Bitrix\Main\Data\Cache::createInstance()
// возвращая Redis-бэкенд вместо файлового

הגשר הופך את המעבר לשקוף—הרכיבים ממשיכים לעבוד ללא שינויי קוד.

תהליך: מבדיקת אודיט ועד פריסה

  1. ניתוח — לימוד הארכיטקטורה הנוכחית, מדידת ביצועים (XDebug, יומן איטי של MySQL), זיהוי צווארי בקבוק.
  2. עיצוב — עיצוב סכמת המודול: בחירת אסטרטגיות, עיצוב מבנה תגים, תיאום עמכם.
  3. יישום — כתיבת קוד CacheManager, backends, סוכנים, גשר.
  4. בדיקות — בדיקות עומס עם JMeter (1,000 משתמשים וירטואליים) ואיסוף מדדים.
  5. פריסה — התקנה על staging וייצור, ניטור למשך שבוע.

מה כלול

תוצר תיאור
ארכיטקטורה תכנית אינטראקציה עם ליבת Bitrix
יישום קוד CacheManager, backends, אסטרטגיות, סוכנים
אינטגרציה BitrixCacheBridge לרכיבים
בדיקות דוח בדיקות עומס (שיעור פגיעה, זמן השהיה)
תיעוד PHPDoc, README, מדריך תפעול
תמיכה חודש חינם לאחר המסירה

לוח זמנים ועלות

שלב משך
ארכיטקטורת CacheManager, ממשק backend יום אחד
Redis backend עם תמיכה בתגים יומיים
אסטרטגיות: stale-while-revalidate, בהיקף בקשה יומיים
סוכן חימום מטמון יום אחד
גשר לרכיבי Bitrix סטנדרטיים יום אחד
סטטיסטיקות, ממשק ניהול יומיים
בדיקות עומס יום אחד
הגדרת Redis Cluster / Sentinel (אופציונלי) 1–2 ימים

סה"כ: 10–12 ימי עבודה. אחריות קוד: שנה. עלות הפיתוח מחושבת באופן אישי. לפרויקטים עם אשכול שרתי PHP—הגדרה נוספת של Redis Cluster או Sentinel: +1–2 ימים.

למדו עוד על Redis ועקרונות מטמון.

העריכו את הביצועים הנוכחיים של האתר שלכם: אנו מציעים אודיט מטמון תוך יומיים. הזמינו מודול מטמון כדי לשמור על האתר מהיר ויציב תחת כל עומס—צרו קשר לייעוץ!