예제 #1
0
        public static CacheSyncMsg CreateStoreMsg(Guid sender, string key, object data, IDictionary <string, object> parameters)
        {
            var msg = new CacheSyncMsg()
            {
                CacheKey = key,
                Action   = CacheAction.Store,
                Sender   = sender
            };

            msg.Options.Add("Parameters", parameters);

            if (data != null)
            {
                var dataType = data.GetType().AssemblyQualifiedName;
                msg.Options.Add("DataType", dataType);
                var dataStr = Convert.ToBase64String(BitSerializer.Serialize(data));
                msg.Options.Add("Data", dataStr);
            }
            else
            {
                msg.Options.Add("Data", string.Empty);
            }

            return(msg);
        }
예제 #2
0
 public static void CleanKey(string key, bool sync = true)
 {
     CacheProvider.Provider.Remove(key);
     if (sync)
     {
         var msg = CacheSyncMsg.CreateRemoveMsg(_sender, key);
         _subscriber.Publish(_channel, DynamicJson.Serialize(msg));
     }
 }
예제 #3
0
        public static CacheSyncMsg CreateClearMsg(Guid sender)
        {
            var msg = new CacheSyncMsg()
            {
                Action = CacheAction.Remove,
                Sender = sender
            };

            return(msg);
        }
예제 #4
0
        public static void Clear(bool sync = true)
        {
            CacheProvider.Provider.Clear();

            if (sync)
            {
                var msg = CacheSyncMsg.CreateClearMsg(_sender);
                _subscriber.Publish(_channel, DynamicJson.Serialize(msg));
            }
        }
예제 #5
0
        public static CacheSyncMsg CreateRemoveMsg(Guid sender, string key)
        {
            var msg = new CacheSyncMsg()
            {
                CacheKey = key,
                Action   = CacheAction.Remove,
                Sender   = sender
            };

            return(msg);
        }
예제 #6
0
        public void Remove(string key)
        {
            _keys.TryRemove(key, out bool value);
            _storage.Remove(key);

            var msg = CacheSyncMsg.CreateRemoveMsg(_self, key);

            _subscriber.Publish(_channel, DynamicJson.Serialize(msg));

            Console.WriteLine("Removed:" + key);
        }
예제 #7
0
        public static CacheSyncMsg CreateUpdateExpireMsg(Guid sender, string key, int duration)
        {
            var msg = new CacheSyncMsg()
            {
                CacheKey = key,
                Action   = CacheAction.UpdateExpire,
                Duration = duration,
                Sender   = sender
            };

            return(msg);
        }
예제 #8
0
        public void Clear()
        {
            if (_storage.Count > 0)
            {
                _keys.Clear();
                _storage = new MemoryCache(new MemoryCacheOptions());
                GC.Collect();

                var msg = CacheSyncMsg.CreateClearMsg(_self);
                _subscriber.Publish(_channel, DynamicJson.Serialize(msg));
            }
        }
예제 #9
0
        public static void CleanBatch(string prefix, bool sync = true)
        {
            var keys = CacheProvider.Provider.Keys(k => k.StartsWith(prefix));

            Parallel.ForEach(keys, (key) => { CacheProvider.Provider.Remove(key); });

            if (sync)
            {
                var msg = CacheSyncMsg.CreateRemoveBatchMsg(_sender, prefix);
                _subscriber.Publish(_channel, DynamicJson.Serialize(msg));
            }
        }
예제 #10
0
        public static CacheSyncMsg CreateRemoveBatchMsg(Guid sender, string prefix)
        {
            var msg = new CacheSyncMsg()
            {
                CacheKey = prefix,
                Action   = CacheAction.Remove,
                Sender   = sender
            };

            msg.Options.Add("IsBatch", true);

            return(msg);
        }
예제 #11
0
        public static void UpdateExpire(string key, int duration, bool sync = true)
        {
            var data = CacheProvider.Provider.Retrieve <object>(key);

            CacheProvider.Provider.Remove(key);
            var parms = new Dictionary <string, object>();

            parms.Add("Duration", duration);
            parms.Add("Preset", null);
            CacheProvider.Provider.Store(key, data, parms);

            if (sync)
            {
                var msg = CacheSyncMsg.CreateUpdateExpireMsg(_sender, key, duration);
                _subscriber.Publish(_channel, DynamicJson.Serialize(msg));
            }
        }
예제 #12
0
        public static bool TryParseMsg(this RedisValue value, out CacheSyncMsg msg)
        {
            bool result = false;

            msg = null;
            if (!value.IsNullOrEmpty && value.HasValue)
            {
                try
                {
                    msg = DynamicJson.Parse(value).Deserialize <CacheSyncMsg>();
                    if (msg != null)
                    {
                        result = true;
                    }
                }
                catch (Exception ex)
                {
                    throw new InvalidCastException($"TryParseMsg error: {ex.Message} value: {value}", ex);
                }
            }

            return(result);
        }
예제 #13
0
        public void Store(string key, object data, IDictionary <string, object> parameters)
        {
            if (!_keys.ContainsKey(key))
            {
                _keys.TryAdd(key, false);
            }

            if (parameters != null && parameters.Count > 0 &&
                parameters.ContainsKey("Duration"))
            {
                int duration = (int)parameters["Duration"];
                var tsDur    = TimeSpan.FromSeconds(duration);

                var cts = new CancellationTokenSource();
                MemoryCacheEntryOptions options = new MemoryCacheEntryOptions();
                options.AbsoluteExpirationRelativeToNow = tsDur;
                options.AddExpirationToken(new CancellationChangeToken(cts.Token));
                options.RegisterPostEvictionCallback(new PostEvictionDelegate((entry, value, reason, state) => {
                    Console.WriteLine("reason:" + reason.ToString());
                    if (reason == EvictionReason.TokenExpired)
                    {
                        (state as ICacheProvider).Remove(entry as string);
                    }
                }), this);

                _storage.Set(key, data, options);
                cts.CancelAfter(tsDur);
            }
            else
            {
                _storage.Set(key, data);
            }

            var msg = CacheSyncMsg.CreateStoreMsg(_self, key, data, parameters);

            _subscriber.Publish(_channel, DynamicJson.Serialize(msg));
        }