internal void SubscribeToCacheUpdate() { var subscriber = Connection.GetSubscriber(); subscriber.Subscribe(KeyRedisChannelNameForUpdate, (channel, message) => { if (channel != KeyRedisChannelNameForUpdate) { return; } var messageStr = (string)message; if (string.IsNullOrWhiteSpace(messageStr)) { return; } try { var model = messageStr.FromJson <CacheUpdateModel>(); // Yayınlayan bu sunucuysa işlem yapmaması için if (model.Publisher == PublisherId) { return; } if (model.Key.StartsWith("##remove##")) { var key = model.Key.ReplaceFirst("##remove##", ""); CurrentRuntimeCache.Remove(key); return; } if (model.Key.StartsWith("##removeall##")) { var prefix = model.Key.ReplaceFirst("##removeall##", ""); CurrentRuntimeCache.RemoveAll(prefix); return; } // Gelen nesnenin anlık tipini bilmediğimiz için Json dönüştürücü bunu yapamıyor // Model üzerinden tip okunup, modeldeki json bu tipe göre nesneye çevriliyor. var cacheItemValueJson = JObject.Parse(messageStr)["Value"].ToString(); var value = JsonConvert.DeserializeObject(cacheItemValueJson, model.ValueType); // Rediste zaten var o yüzden sadece runtimecache'de değişecek. CurrentRuntimeCache.Set(model.Key, value, model.ExpireDate); } catch { // ignored } }); }
public bool RemoveAll(string prefix = "") { try { foreach (var key in GetRedisKeys(prefix)) { Current.Remove(key, false); } CurrentRuntimeCache.RemoveAll(prefix); PublishCleanAllCache(prefix); } catch (RedisConnectionException ex) { return(CacheManager.UseBackupConnection(ex).RemoveAll(prefix)); } catch { return(false); } return(true); }