وصل کردن همهچیز به هم (Wiring It All Together) 🔌
در نهایت باید این سرویسها را داخل DI container ثبت کنیم:
builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
ConnectionMultiplexer.Connect("<REDIS_CONNECTION_STRING>"));
// Register HybridCache (defaults generally work fine for L1)
builder.Services.AddHybridCache();
// Register our invalidation services
builder.Services.AddSingleton<ICacheInvalidator, RedisCacheInvalidator>();
builder.Services.AddHostedService<CacheInvalidationService>();
حالا وقتی Node A متد
InvalidateAsync("user:123")
را صدا بزند، Redis این پیام را به Node B، Node C و بقیه میفرستد. همهی آنها متد
hybridCache.RemoveAsync("user:123")
را اجرا میکنند و تضمین میشود که درخواست بعدی دادهی تازه را از منبع اصلی (یا از L2 مشترک) بگیرد. 🔄✨
یک راه بهتر: FusionCache 🧠🔥
اگر ساختن backplane اختصاصی حس «reinventing the wheel» به شما میدهد، بهتر است نگاهی به FusionCache بیندازید.
ءFusionCache یک کتابخانهی بالغ و battle-tested است که سالهاست دقیقاً همین مشکل را حل کرده. این کتابخانه یک backplane داخلی دارد که به صورت خودکار Pub/Sub را مدیریت میکند.
حتی بهتر از آن: FusionCache اخیراً یک پیادهسازی از abstract class مربوط به HybridCache اضافه کرده است. یعنی میتوانید تقریباً بدون تغییر زیاد در کد فعلی، آن را جایگزین کنید. 😍
// Using FusionCache's implementation of HybridCache
builder.Services.AddFusionCache()
.WithBackplane(
new RedisBackplane(new RedisBackplaneOptions { Configuration = "<REDIS_CONNECTION_STRING>" }))
.AsHybridCache();
جمعبندی 📝
ءHybridCache یک اضافهشدن بسیار قدرتمند به اکوسیستم NET. است و عملاً مزایای IMemoryCache و IDistributedCache را با هم ترکیب میکند. اما در سناریوهای multi-node که نیاز به consistency بالا دارند، هنوز به یک مکانیزم برای همگامسازی کشهای محلی نیاز دارید.
ءRedis Pub/Sub یک راهحل سبک و مؤثر برای این مشکل ارائه میدهد. 📡
با پیادهسازی یک «bus» ساده برای پیامهای invalidation، به بهترین حالت ممکن میرسید:
هم performance فوقالعادهی کش محلی را دارید، هم consistency سیستم توزیعشده را. ⚡️🌍
موفق باشید😉🚀
🔖هشتگها:
#DotNet #HybridCache #Redis #DistributedSystems #Caching #SystemDesign #FusionCache