diff --git a/SteamWare.IO/Redis.cs b/SteamWare.IO/Redis.cs
index 5c1e7a4..c18b6d5 100644
--- a/SteamWare.IO/Redis.cs
+++ b/SteamWare.IO/Redis.cs
@@ -9,972 +9,983 @@ using System.Threading.Tasks;
namespace SteamWare.IO
{
- public class Redis
+ public class Redis
+ {
+ #region base objects
+
+ ///
+ /// Oggetto currentDb locale
+ ///
+ private IDatabase _currDB { get; set; }
+
+ ///
+ /// Oggetto DB REDIS corrente
+ ///
+ public IDatabase cache
{
- #region base objects
-
- ///
- /// Oggetto currentDb locale
- ///
- private IDatabase _currDB { get; set; }
-
- ///
- /// Oggetto DB REDIS corrente
- ///
- public IDatabase cache //currDB
+ get
+ {
+ IDatabase answ;
+ // se già valorizzato uso oggetto private...
+ if (_currDB != null)
{
- get
- {
- IDatabase answ;
- // se già valorizzato uso oggetto private...
- if (_currDB != null)
- {
- answ = _currDB;
- }
- else
- {
- // init DB (sullo 0)
- answ = connRedis.GetDatabase();
- // gestione override...
- if (memLayer.ML.confReadInt("redisDb") >= 0)
- {
- // in questo caso uso il DB configurato in app.config...
- answ = connRedis.GetDatabase(memLayer.ML.confReadInt("redisDb"));
- }
- _currDB = answ;
- }
- // restituisco oggetto DB
- return answ;
- }
+ answ = _currDB;
}
-
- ///
- /// Connessione lazy a redis...
- ///
- private Lazy lazyConnection = new Lazy(() =>
+ else
{
- string RedisConn = memLayer.ML.confReadString("RedisConn");
- if (string.IsNullOrEmpty(RedisConn))
- {
- RedisConn = "localhost,abortConnect=false,ssl=false";
- }
-
- return ConnectionMultiplexer.Connect(RedisConn);
- });
-
- ///
- /// Connessione lazy a redis...
- ///
- private Lazy lazyConnectionAdmin = new Lazy(() =>
- {
- string RedisConnAdmin = memLayer.ML.confReadString("RedisConnAdmin");
- if (string.IsNullOrEmpty(RedisConnAdmin))
- {
- RedisConnAdmin = "localhost,abortConnect=false,ssl=false,allowAdmin=true";
- }
-
- return ConnectionMultiplexer.Connect(RedisConnAdmin);
- });
-
- ///
- /// Oggetto statico connessione redis
- ///
- public ConnectionMultiplexer connRedis
- {
- get
- {
- return lazyConnection.Value;
- }
+ // init DB (sullo 0)
+ answ = connRedis.GetDatabase();
+ // gestione override...
+ if (memLayer.ML.confReadInt("redisDb") >= 0)
+ {
+ // in questo caso uso il DB configurato in app.config...
+ answ = connRedis.GetDatabase(memLayer.ML.confReadInt("redisDb"));
+ }
+ _currDB = answ;
}
-
- ///
- /// Oggetto statico connessione redis
- ///
- public ConnectionMultiplexer connRedisAdmin
- {
- get
- {
- return lazyConnectionAdmin.Value;
- }
- }
-
- #endregion base objects
-
- #region Helpers
-
- ///
- /// Nome della variabile HASH da utilizzare (dato CodModulo / Server / DB impiegato da funzionalita' DbConfig) + keyName richiesto...
- ///
- public string redHash(string keyName)
- {
- string answ = keyName;
- try
- {
- answ = string.Format("{0}:{1}:{2}:{3}", memLayer.ML.confReadString("CodModulo"), memLayer.ML.taConfig.Connection.DataSource, memLayer.ML.taConfig.Connection.Database, keyName).Replace("\\", "_");
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Serializzazione di un oggetto generico
- ///
- ///
- ///
- public string serializeVal(object origVal)
- {
- string answ = "";
- try
- {
- answ = JsonConvert.SerializeObject(origVal);
- }
- catch { }
- return answ;
- }
-
- ///
- /// Deserializzazione di un valore string in oggetto generico
- ///
- ///
- ///
- public object deserializeVal(string serVal)
- {
- object answ = "";
- try
- {
- answ = JsonConvert.DeserializeObject(serVal);
- }
- catch { }
- return answ;
- }
-
- ///
- /// Restituisce un pò di info sul server redis connesso
- ///
- ///
- public string getRedisInfoData()
- {
- string answ = "";
- StringBuilder sb = new StringBuilder();
- try
- {
- sb.AppendLine($"Configuration: {connRedis.Configuration}");
- sb.AppendLine($"Connected: {connRedis.IsConnected}");
- sb.AppendLine($"ClientName: {connRedis.ClientName}");
- sb.AppendLine($"Total Ops: {connRedis.OperationCount}");
- sb.AppendLine($"Status: {connRedis.GetStatus()}");
- answ = sb.ToString();
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Restituisce info dei server connessi...
- ///
- ///
- public IServer[] redServInfo()
- {
- IServer[] answ = new IServer[1];
- try
- {
- answ = new IServer[connRedisAdmin.GetEndPoints().Length];
- int i = 0;
- foreach (var ep in connRedisAdmin.GetEndPoints())
- {
- var server = connRedisAdmin.GetServer(ep);
- answ[i] = server;
- i++;
- }
- }
- catch (Exception exc)
- {
- Logging.Instance.Error($"redServInfo:{Environment.NewLine}{exc}");
- }
- return answ;
- }
-
- #endregion Helpers
-
- #region gestione valori in RedisCache
-
- ///
- /// Restituisce una chiave salvata in RedisCache
- ///
- ///
- ///
- public string getRSV(string chiave)
- {
- string answ = "";
- try
- {
- answ = cache.StringGet(chiave);
- }
- catch (Exception exc)
- {
- //logger.lg.scriviLog(string.Format("Errore in getRSV:{0}{1}", Environment.NewLine, exc), tipoLog.EXCEPTION);
- }
- return answ;
- }
-
- ///
- /// Salva una chiave in RedisCache
- ///
- ///
- ///
- ///
- public bool setRSV(string chiave, string valore)
- {
- bool answ = false;
- try
- {
- cache.StringSet(chiave, valore);
- answ = true;
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezzione in setRSV:{0}{1}", Environment.NewLine, exc));
- }
- return answ;
- }
-
- ///
- /// Salva una chiave in RedisCache
- ///
- ///
- ///
- /// in secondi
- ///
- public bool setRSV(string chiave, string valore, int TTL_sec)
- {
- bool answ = false;
- try
- {
- TimeSpan expT = new TimeSpan(0, 0, TTL_sec);
- // salvo con expyry...
- cache.StringSet(chiave, valore, expT);
- answ = true;
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezzione in setRSV:{0}{1}", Environment.NewLine, exc));
- }
- return answ;
- }
-
- ///
- /// Incrementa un contatore in Redis
- ///
- ///
- ///
- public long setRCntI(string chiave)
- {
- long answ = 0;
- try
- {
- answ = cache.StringIncrement(chiave, 1);
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezzione in setRCI:{0}{1}", Environment.NewLine, exc));
- }
- return answ;
- }
-
- ///
- /// Decrementa un contatore in Redis
- ///
- ///
- ///
- public long setRCntD(string chiave)
- {
- long answ = 0;
- try
- {
- answ = cache.StringDecrement(chiave, 1);
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezzione in setRCD:{0}{1}", Environment.NewLine, exc));
- }
- return answ;
- }
-
- ///
- /// Restituisce una chiave COUNTER in RedisCache
- ///
- ///
- ///
- public int getRCnt(string chiave)
- {
- int answInt = 0;
- string answ = "";
- try
- {
- answ = cache.StringGet(chiave);
- answInt = Convert.ToInt32(answ);
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezione in getRSV:{0}{1}", Environment.NewLine, exc));
- }
- return answInt;
- }
-
- ///
- /// Resetta (elimina) un contatore in Redis
- ///
- ///
- ///
- public bool resetRCnt(string chiave)
- {
- bool answ = false;
- try
- {
- answ = cache.KeyDelete(chiave);
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezione in resetRCnt:{0}{1}", Environment.NewLine, exc));
- }
- return answ;
- }
-
- ///
- /// Restituisce un set KVP (Key Value Pair) salvati in RedisCache
- ///
- ///
- ///
- public RedisValue[] getRKeys(RedisKey[] chiavi)
- {
- RedisValue[] answ = null;
- try
- {
- answ = cache.StringGet(chiavi);
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezione in getRKeys:{0}{1}", Environment.NewLine, exc));
- }
- return answ;
- }
-
- ///
- /// Salva un set KVP (Key Value Pair) in RedisCache
- ///
- /// Set KVP chiave-valore da salvare
- ///
- public bool setRKeys(KeyValuePair[] valori)
- {
- bool answ = false;
- try
- {
- cache.StringSet(valori);
- answ = true;
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezione in setRKeys:{0}{1}", Environment.NewLine, exc));
- }
- return answ;
- }
-
- ///
- /// Verifica se ci siano valori nella KEY indicata...
- ///
- ///
- ///
- public bool redKeyPresent(RedisKey key)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- try
- {
- answ = cache.KeyExists(key);
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezione in redKeyPresent per la key {2}:{0}{1}", Environment.NewLine, exc, key));
- }
- return answ;
- }
-
- ///
- /// Verifica se ci siano valori nella KEY indicata (string)
- ///
- ///
- ///
- public bool redKeyPresentSz(string key)
- {
- bool answ = false;
- try
- {
- RedisKey chiave = key;
- answ = redKeyPresent(chiave);
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Verifica se ci siano valori nella hash indicata...
- ///
- ///
- ///
- public bool redHashPresent(RedisKey key)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- try
- {
- answ = cache.HashGetAll(key).Length > 0;
- }
- catch (Exception exc)
- {
- Logging.Instance.Error(string.Format("Eccezione in redHashPresent per la key {2}{0}{1}", Environment.NewLine, exc, key));
- }
- return answ;
- }
-
- ///
- /// Verifica se ci siano valori nella hash indicata (string)
- ///
- ///
- ///
- public bool redHashPresentSz(string key)
- {
- bool answ = false;
- try
- {
- RedisKey chiave = key;
- answ = redHashPresent(chiave);
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Recupera tutti i valori dalla hash
- ///
- ///
- ///
- public KeyValuePair[] redGetHash(string hashKey)
- {
- KeyValuePair[] answ = new KeyValuePair[1];
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = hashKey;
- HashEntry[] valori = cache.HashGetAll(chiave);
- answ = new KeyValuePair[valori.Length];
- int i = 0;
- foreach (HashEntry item in valori)
- {
- answ[i] = new KeyValuePair(item.Name, item.Value);
- i++;
- }
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Recupera tutti i valori dalla hash in formato Dictionary
- ///
- ///
- ///
- public Dictionary redGetHashDict(string hashKey)
- {
- Dictionary answ = new Dictionary();
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = hashKey;
- HashEntry[] valori = cache.HashGetAll(chiave);
- foreach (HashEntry item in valori)
- {
- answ.Add(item.Name, item.Value);
- }
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Recupera UN SINGOLO VALORE dalla hash per un dato field
- ///
- ///
- ///
- ///
- public string redGetHashField(string hashKey, string hashField)
- {
- string answ = "";
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = hashKey;
- RedisValue campo = hashField;
- RedisValue valOut = cache.HashGet(chiave, campo);
- answ = valOut.ToString();
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Salvataggio di una hash di valori
- ///
- /// chiave
- /// valori
- ///
- public bool redSaveHash(string hashKey, KeyValuePair[] hashFields)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = hashKey;
- HashEntry[] valori = new HashEntry[hashFields.Length];
- int i = 0;
- foreach (KeyValuePair kvp in hashFields)
- {
- valori[i] = new HashEntry(kvp.Key, kvp.Value);
- i++;
- }
- cache.HashSet(chiave, valori);
- answ = true;
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Salvataggio di una hash di valori in formato Dictionary
- ///
- /// chiave
- /// valori
- ///
- public bool redSaveHashDict(string hashKey, Dictionary hashFields)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = hashKey;
- HashEntry[] valori = new HashEntry[hashFields.Count];
- int i = 0;
- foreach (KeyValuePair kvp in hashFields)
- {
- valori[i] = new HashEntry(kvp.Key, kvp.Value);
- i++;
- }
- cache.HashSet(chiave, valori);
- answ = true;
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Salvataggio di una hash di valori
- ///
- /// chiave
- /// valori come lista KVP
- ///
- public bool redSaveHashList(string hashKey, List> hashListKVP)
- {
- bool answ = false;
- if (connRedis.IsConnected)
- {
- // cerco se ci sia valore in redis...
- IDatabase cache = connRedis.GetDatabase();
- try
- {
- RedisKey chiave = hashKey;
- HashEntry[] valori = new HashEntry[hashListKVP.Count];
- int i = 0;
- foreach (KeyValuePair kvp in hashListKVP)
- {
- valori[i] = new HashEntry(kvp.Key, kvp.Value);
- i++;
- }
- cache.HashSet(chiave, valori);
- answ = true;
- }
- catch
- { }
- }
- return answ;
- }
-
- ///
- /// Salvataggio di una hash di valori
- ///
- /// chiave
- /// valori
- /// scadenza preimpostata hash (secondi) | defaoult = -1 (non scade)
- ///
- public bool redSaveHash(string hashKey, KeyValuePair[] hashFields, double expireSeconds = -1)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = hashKey;
- answ = redSaveHash(hashKey, hashFields);
- if (expireSeconds > 0)
- {
- cache.KeyExpire(chiave, DateTime.Now.AddSeconds(expireSeconds));
- }
- //answ = true;
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Salvataggio di una hash di valori in formato Dictionary
- ///
- /// chiave
- /// valori
- /// scadenza preimpostata hash (secondi) | defaoult = -1 (non scade)
- ///
- public bool redSaveHashDict(string hashKey, Dictionary hashFields, double expireSeconds = -1)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = hashKey;
- answ = redSaveHashDict(hashKey, hashFields);
- if (expireSeconds > 0)
- {
- cache.KeyExpire(chiave, DateTime.Now.AddSeconds(expireSeconds));
- }
- //answ = true;
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Elimina una key (hash, string)
- ///
- ///
- ///
- public bool redDelKey(string key)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- try
- {
- RedisKey chiave = key;
- cache.KeyDelete(chiave);
- answ = true;
- }
- catch
- { }
- return answ;
- }
-
- ///
- /// Flush completo cache redis
- ///
- /// ** = tutti
- ///
- public bool redFlushKey(string keyPattern)
- {
- bool answ = false;
- // cerco se ci sia valore in redis...
- // se vuoto = ALL...
- keyPattern = string.IsNullOrEmpty(keyPattern) ? "**" : keyPattern;
- try
- {
- foreach (var ep in connRedis.GetEndPoints())
- {
- var server = connRedis.GetServer(ep);
- var keys = server.Keys(database: memLayer.ML.confReadInt("redisDb"), pattern: $"{keyPattern}*");
- foreach (var key in keys)
- {
- cache.KeyDelete(key);
- }
- }
- answ = true;
- }
- catch (Exception exc)
- {
- Logging.Instance.Error($"Eccezione in redFlushKey{Environment.NewLine}{exc}");
- }
- return answ;
- }
-
- ///
- /// Conta num oggetti cache redis che rispondono a pattern
- ///
- /// ** = tutti
- ///
- public int redCountKey(string keyPattern)
- {
- int answ = 0;
- // cerco se ci sia valore in redis...
- // se vuoto = ALL...
- keyPattern = string.IsNullOrEmpty(keyPattern) ? "**" : keyPattern;
- try
- {
- foreach (var ep in connRedis.GetEndPoints())
- {
- var server = connRedis.GetServer(ep);
- foreach (var key in server.Keys(pattern: keyPattern))
- {
- answ++;
- }
- }
- }
- catch (Exception exc)
- {
- Logging.Instance.Error($"Eccezione in redCountKey:{Environment.NewLine}{exc}");
- }
- return answ;
- }
-
- ///
- /// Restituisce numero record in Redis DB
- ///
- public long numRecRedis
- {
- get
- {
- long answ = 0;
- try
- {
- foreach (var ep in connRedis.GetEndPoints())
- {
- var server = connRedis.GetServer(ep);
- answ += server.DatabaseSize();
- }
- }
- catch
- { }
- return answ;
- }
- }
-
- ///
- /// Restituisce oggetti cache redis che rispondono a pattern
- ///
- /// ** = tutti
- /// Tipo di ordinamento per kvp
- ///
- public List> redGetCounterByKey(string keyPattern, kvpOrderBy orderBy)
- {
- int numAnsw = redCountKey(keyPattern);
- RedisKey[] chiavi = new RedisKey[numAnsw];
- List> answ = new List>();
- // se vuoto = ALL...
- keyPattern = string.IsNullOrEmpty(keyPattern) ? "**" : keyPattern;
-
- // recupero in primis elenco chiavi
- try
- {
- int i = 0;
- foreach (var ep in connRedis.GetEndPoints())
- {
- var server = connRedis.GetServer(ep);
- foreach (var key in server.Keys(pattern: keyPattern))
- {
- chiavi[i] = key;
- i++;
- }
- }
- }
- catch (Exception exc)
- {
- Logging.Instance.Error($"Eccezione in redGetCounterByKey{Environment.NewLine}{exc}");
- }
- // ora recupero valori!
- var valori = getRKeys(chiavi);
- int currVal = 0;
- // popolo rispsota
- try
- {
- for (int i = 0; i < numAnsw; i++)
- {
- Int32.TryParse(valori[i], out currVal);
- answ.Add(new KeyValuePair(chiavi[i], currVal));
- }
- }
- catch
- { }
- // se richiesto riordino...
- switch (orderBy)
- {
- case kvpOrderBy.KeyAsc:
- answ.Sort(CompareKey);
- break;
-
- case kvpOrderBy.KeyDesc:
- answ.Sort(CompareKeyDesc);
- break;
-
- case kvpOrderBy.ValAsc:
- answ.Sort(CompareVal);
- break;
-
- case kvpOrderBy.ValDesc:
- answ.Sort(CompareValDesc);
- break;
-
- default:
- break;
- }
- return answ;
- }
-
- ///
- /// Effettua comaprazione x CHIAVE in KVP ASC
- ///
- ///
- ///
- ///
- private int CompareKey(KeyValuePair x, KeyValuePair y)
- {
- return x.Key.CompareTo(y.Key);
- }
-
- ///
- /// Effettua comaprazione x VALORE in KVP ASC
- ///
- ///
- ///
- ///
- public int CompareVal(KeyValuePair x, KeyValuePair y)
- {
- return x.Value.CompareTo(y.Value);
- }
-
- ///
- /// Effettua comaprazione x CHIAVE in KVP DESC
- ///
- ///
- ///
- ///
- private int CompareKeyDesc(KeyValuePair x, KeyValuePair y)
- {
- return y.Key.CompareTo(x.Key);
- }
-
- ///
- /// Effettua comaprazione x VALORE in KVP DESC
- ///
- ///
- ///
- ///
- public int CompareValDesc(KeyValuePair x, KeyValuePair y)
- {
- return y.Value.CompareTo(x.Value);
- }
-
- ///
- /// Tipologia di ordinamento x liste KVP
- ///
- public enum kvpOrderBy
- {
- ///
- /// Ordinamento ASCending per KEY
- ///
- KeyAsc,
-
- ///
- /// Ordinamento DESCending per KEY
- ///
- KeyDesc,
-
- ///
- /// Ordinamento ASCending per VAL
- ///
- ValAsc,
-
- ///
- /// Ordinamento DESCending per VAL
- ///
- ValDesc
- }
-
- #endregion gestione valori in RedisCache
-
- #region gestione Stack / List
-
- ///
- /// Lunghezza Stack
- ///
- ///
- ///
- public long StackLen(string stackName)
- {
- return connRedis.GetDatabase().ListLength((RedisKey)stackName);
- }
-
- ///
- /// Mette in Stack un valore (F.I.L.O.)
- ///
- ///
- ///
- public void StackPush(string stackName, string value)
- {
- connRedis.GetDatabase().ListRightPush((RedisKey)stackName, (RedisValue)value);
- }
-
- ///
- /// Recupera valore da Stack (F.I.L.O.)
- ///
- ///
- ///
- public string StackPop(string stackName)
- {
- return connRedis.GetDatabase().ListRightPop((RedisKey)stackName).ToString();
- }
-
- ///
- /// Lunghezza List
- ///
- ///
- ///
- public long ListLen(string queueName)
- {
- return connRedis.GetDatabase().ListLength((RedisKey)queueName);
- }
-
- ///
- /// Mette un valore in List (F.I.F.O.)
- ///
- ///
- ///
- public void ListPush(string queueName, string value)
- {
- connRedis.GetDatabase().ListRightPush((RedisKey)queueName, (RedisValue)value);
- }
-
- ///
- /// Recupera valore da List (F.I.F.O.)
- ///
- ///
- ///
- public string ListPop(string queueName)
- {
- return connRedis.GetDatabase().ListLeftPop((RedisKey)queueName).ToString();
- }
-
- #endregion gestione Stack / List
+ // restituisco oggetto DB
+ return answ;
+ }
}
+
+ ///
+ /// Oggetto per sottoscrizione Pub/Sub Redis
+ ///
+ public ISubscriber RedPubSub
+ {
+ get
+ {
+ return connRedis.GetSubscriber();
+ }
+ }
+
+ ///
+ /// Connessione lazy a redis...
+ ///
+ private Lazy lazyConnection = new Lazy(() =>
+ {
+ string RedisConn = memLayer.ML.confReadString("RedisConn");
+ if (string.IsNullOrEmpty(RedisConn))
+ {
+ RedisConn = "localhost,abortConnect=false,ssl=false";
+ }
+
+ return ConnectionMultiplexer.Connect(RedisConn);
+ });
+
+ ///
+ /// Connessione lazy a redis...
+ ///
+ private Lazy lazyConnectionAdmin = new Lazy(() =>
+ {
+ string RedisConnAdmin = memLayer.ML.confReadString("RedisConnAdmin");
+ if (string.IsNullOrEmpty(RedisConnAdmin))
+ {
+ RedisConnAdmin = "localhost,abortConnect=false,ssl=false,allowAdmin=true";
+ }
+
+ return ConnectionMultiplexer.Connect(RedisConnAdmin);
+ });
+
+ ///
+ /// Oggetto statico connessione redis
+ ///
+ public ConnectionMultiplexer connRedis
+ {
+ get
+ {
+ return lazyConnection.Value;
+ }
+ }
+
+ ///
+ /// Oggetto statico connessione redis
+ ///
+ public ConnectionMultiplexer connRedisAdmin
+ {
+ get
+ {
+ return lazyConnectionAdmin.Value;
+ }
+ }
+
+ #endregion base objects
+
+ #region Helpers
+
+ ///
+ /// Nome della variabile HASH da utilizzare (dato CodModulo / Server / DB impiegato da funzionalita' DbConfig) + keyName richiesto...
+ ///
+ public string redHash(string keyName)
+ {
+ string answ = keyName;
+ try
+ {
+ answ = string.Format("{0}:{1}:{2}:{3}", memLayer.ML.confReadString("CodModulo"), memLayer.ML.taConfig.Connection.DataSource, memLayer.ML.taConfig.Connection.Database, keyName).Replace("\\", "_");
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Serializzazione di un oggetto generico
+ ///
+ ///
+ ///
+ public string serializeVal(object origVal)
+ {
+ string answ = "";
+ try
+ {
+ answ = JsonConvert.SerializeObject(origVal);
+ }
+ catch { }
+ return answ;
+ }
+
+ ///
+ /// Deserializzazione di un valore string in oggetto generico
+ ///
+ ///
+ ///
+ public object deserializeVal(string serVal)
+ {
+ object answ = "";
+ try
+ {
+ answ = JsonConvert.DeserializeObject(serVal);
+ }
+ catch { }
+ return answ;
+ }
+
+ ///
+ /// Restituisce un pò di info sul server redis connesso
+ ///
+ ///
+ public string getRedisInfoData()
+ {
+ string answ = "";
+ StringBuilder sb = new StringBuilder();
+ try
+ {
+ sb.AppendLine($"Configuration: {connRedis.Configuration}");
+ sb.AppendLine($"Connected: {connRedis.IsConnected}");
+ sb.AppendLine($"ClientName: {connRedis.ClientName}");
+ sb.AppendLine($"Total Ops: {connRedis.OperationCount}");
+ sb.AppendLine($"Status: {connRedis.GetStatus()}");
+ answ = sb.ToString();
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Restituisce info dei server connessi...
+ ///
+ ///
+ public IServer[] redServInfo()
+ {
+ IServer[] answ = new IServer[1];
+ try
+ {
+ answ = new IServer[connRedisAdmin.GetEndPoints().Length];
+ int i = 0;
+ foreach (var ep in connRedisAdmin.GetEndPoints())
+ {
+ var server = connRedisAdmin.GetServer(ep);
+ answ[i] = server;
+ i++;
+ }
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error($"redServInfo:{Environment.NewLine}{exc}");
+ }
+ return answ;
+ }
+
+ #endregion Helpers
+
+ #region gestione valori in RedisCache
+
+ ///
+ /// Restituisce una chiave salvata in RedisCache
+ ///
+ ///
+ ///
+ public string getRSV(string chiave)
+ {
+ string answ = "";
+ try
+ {
+ answ = cache.StringGet(chiave);
+ }
+ catch (Exception exc)
+ {
+ //logger.lg.scriviLog(string.Format("Errore in getRSV:{0}{1}", Environment.NewLine, exc), tipoLog.EXCEPTION);
+ }
+ return answ;
+ }
+
+ ///
+ /// Salva una chiave in RedisCache
+ ///
+ ///
+ ///
+ ///
+ public bool setRSV(string chiave, string valore)
+ {
+ bool answ = false;
+ try
+ {
+ cache.StringSet(chiave, valore);
+ answ = true;
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezzione in setRSV:{0}{1}", Environment.NewLine, exc));
+ }
+ return answ;
+ }
+
+ ///
+ /// Salva una chiave in RedisCache
+ ///
+ ///
+ ///
+ /// in secondi
+ ///
+ public bool setRSV(string chiave, string valore, int TTL_sec)
+ {
+ bool answ = false;
+ try
+ {
+ TimeSpan expT = new TimeSpan(0, 0, TTL_sec);
+ // salvo con expyry...
+ cache.StringSet(chiave, valore, expT);
+ answ = true;
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezzione in setRSV:{0}{1}", Environment.NewLine, exc));
+ }
+ return answ;
+ }
+
+ ///
+ /// Incrementa un contatore in Redis
+ ///
+ ///
+ ///
+ public long setRCntI(string chiave)
+ {
+ long answ = 0;
+ try
+ {
+ answ = cache.StringIncrement(chiave, 1);
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezzione in setRCI:{0}{1}", Environment.NewLine, exc));
+ }
+ return answ;
+ }
+
+ ///
+ /// Decrementa un contatore in Redis
+ ///
+ ///
+ ///
+ public long setRCntD(string chiave)
+ {
+ long answ = 0;
+ try
+ {
+ answ = cache.StringDecrement(chiave, 1);
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezzione in setRCD:{0}{1}", Environment.NewLine, exc));
+ }
+ return answ;
+ }
+
+ ///
+ /// Restituisce una chiave COUNTER in RedisCache
+ ///
+ ///
+ ///
+ public int getRCnt(string chiave)
+ {
+ int answInt = 0;
+ string answ = "";
+ try
+ {
+ answ = cache.StringGet(chiave);
+ answInt = Convert.ToInt32(answ);
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezione in getRSV:{0}{1}", Environment.NewLine, exc));
+ }
+ return answInt;
+ }
+
+ ///
+ /// Resetta (elimina) un contatore in Redis
+ ///
+ ///
+ ///
+ public bool resetRCnt(string chiave)
+ {
+ bool answ = false;
+ try
+ {
+ answ = cache.KeyDelete(chiave);
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezione in resetRCnt:{0}{1}", Environment.NewLine, exc));
+ }
+ return answ;
+ }
+
+ ///
+ /// Restituisce un set KVP (Key Value Pair) salvati in RedisCache
+ ///
+ ///
+ ///
+ public RedisValue[] getRKeys(RedisKey[] chiavi)
+ {
+ RedisValue[] answ = null;
+ try
+ {
+ answ = cache.StringGet(chiavi);
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezione in getRKeys:{0}{1}", Environment.NewLine, exc));
+ }
+ return answ;
+ }
+
+ ///
+ /// Salva un set KVP (Key Value Pair) in RedisCache
+ ///
+ /// Set KVP chiave-valore da salvare
+ ///
+ public bool setRKeys(KeyValuePair[] valori)
+ {
+ bool answ = false;
+ try
+ {
+ cache.StringSet(valori);
+ answ = true;
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezione in setRKeys:{0}{1}", Environment.NewLine, exc));
+ }
+ return answ;
+ }
+
+ ///
+ /// Verifica se ci siano valori nella KEY indicata...
+ ///
+ ///
+ ///
+ public bool redKeyPresent(RedisKey key)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ try
+ {
+ answ = cache.KeyExists(key);
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezione in redKeyPresent per la key {2}:{0}{1}", Environment.NewLine, exc, key));
+ }
+ return answ;
+ }
+
+ ///
+ /// Verifica se ci siano valori nella KEY indicata (string)
+ ///
+ ///
+ ///
+ public bool redKeyPresentSz(string key)
+ {
+ bool answ = false;
+ try
+ {
+ RedisKey chiave = key;
+ answ = redKeyPresent(chiave);
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Verifica se ci siano valori nella hash indicata...
+ ///
+ ///
+ ///
+ public bool redHashPresent(RedisKey key)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ try
+ {
+ answ = cache.HashGetAll(key).Length > 0;
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error(string.Format("Eccezione in redHashPresent per la key {2}{0}{1}", Environment.NewLine, exc, key));
+ }
+ return answ;
+ }
+
+ ///
+ /// Verifica se ci siano valori nella hash indicata (string)
+ ///
+ ///
+ ///
+ public bool redHashPresentSz(string key)
+ {
+ bool answ = false;
+ try
+ {
+ RedisKey chiave = key;
+ answ = redHashPresent(chiave);
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Recupera tutti i valori dalla hash
+ ///
+ ///
+ ///
+ public KeyValuePair[] redGetHash(string hashKey)
+ {
+ KeyValuePair[] answ = new KeyValuePair[1];
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = hashKey;
+ HashEntry[] valori = cache.HashGetAll(chiave);
+ answ = new KeyValuePair[valori.Length];
+ int i = 0;
+ foreach (HashEntry item in valori)
+ {
+ answ[i] = new KeyValuePair(item.Name, item.Value);
+ i++;
+ }
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Recupera tutti i valori dalla hash in formato Dictionary
+ ///
+ ///
+ ///
+ public Dictionary redGetHashDict(string hashKey)
+ {
+ Dictionary answ = new Dictionary();
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = hashKey;
+ HashEntry[] valori = cache.HashGetAll(chiave);
+ foreach (HashEntry item in valori)
+ {
+ answ.Add(item.Name, item.Value);
+ }
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Recupera UN SINGOLO VALORE dalla hash per un dato field
+ ///
+ ///
+ ///
+ ///
+ public string redGetHashField(string hashKey, string hashField)
+ {
+ string answ = "";
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = hashKey;
+ RedisValue campo = hashField;
+ RedisValue valOut = cache.HashGet(chiave, campo);
+ answ = valOut.ToString();
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Salvataggio di una hash di valori
+ ///
+ /// chiave
+ /// valori
+ ///
+ public bool redSaveHash(string hashKey, KeyValuePair[] hashFields)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = hashKey;
+ HashEntry[] valori = new HashEntry[hashFields.Length];
+ int i = 0;
+ foreach (KeyValuePair kvp in hashFields)
+ {
+ valori[i] = new HashEntry(kvp.Key, kvp.Value);
+ i++;
+ }
+ cache.HashSet(chiave, valori);
+ answ = true;
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Salvataggio di una hash di valori in formato Dictionary
+ ///
+ /// chiave
+ /// valori
+ ///
+ public bool redSaveHashDict(string hashKey, Dictionary hashFields)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = hashKey;
+ HashEntry[] valori = new HashEntry[hashFields.Count];
+ int i = 0;
+ foreach (KeyValuePair kvp in hashFields)
+ {
+ valori[i] = new HashEntry(kvp.Key, kvp.Value);
+ i++;
+ }
+ cache.HashSet(chiave, valori);
+ answ = true;
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Salvataggio di una hash di valori
+ ///
+ /// chiave
+ /// valori come lista KVP
+ ///
+ public bool redSaveHashList(string hashKey, List> hashListKVP)
+ {
+ bool answ = false;
+ if (connRedis.IsConnected)
+ {
+ // cerco se ci sia valore in redis...
+ IDatabase cache = connRedis.GetDatabase();
+ try
+ {
+ RedisKey chiave = hashKey;
+ HashEntry[] valori = new HashEntry[hashListKVP.Count];
+ int i = 0;
+ foreach (KeyValuePair kvp in hashListKVP)
+ {
+ valori[i] = new HashEntry(kvp.Key, kvp.Value);
+ i++;
+ }
+ cache.HashSet(chiave, valori);
+ answ = true;
+ }
+ catch
+ { }
+ }
+ return answ;
+ }
+
+ ///
+ /// Salvataggio di una hash di valori
+ ///
+ /// chiave
+ /// valori
+ /// scadenza preimpostata hash (secondi) | defaoult = -1 (non scade)
+ ///
+ public bool redSaveHash(string hashKey, KeyValuePair[] hashFields, double expireSeconds = -1)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = hashKey;
+ answ = redSaveHash(hashKey, hashFields);
+ if (expireSeconds > 0)
+ {
+ cache.KeyExpire(chiave, DateTime.Now.AddSeconds(expireSeconds));
+ }
+ //answ = true;
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Salvataggio di una hash di valori in formato Dictionary
+ ///
+ /// chiave
+ /// valori
+ /// scadenza preimpostata hash (secondi) | defaoult = -1 (non scade)
+ ///
+ public bool redSaveHashDict(string hashKey, Dictionary hashFields, double expireSeconds = -1)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = hashKey;
+ answ = redSaveHashDict(hashKey, hashFields);
+ if (expireSeconds > 0)
+ {
+ cache.KeyExpire(chiave, DateTime.Now.AddSeconds(expireSeconds));
+ }
+ //answ = true;
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Elimina una key (hash, string)
+ ///
+ ///
+ ///
+ public bool redDelKey(string key)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ try
+ {
+ RedisKey chiave = key;
+ cache.KeyDelete(chiave);
+ answ = true;
+ }
+ catch
+ { }
+ return answ;
+ }
+
+ ///
+ /// Flush completo cache redis
+ ///
+ /// ** = tutti
+ ///
+ public bool redFlushKey(string keyPattern)
+ {
+ bool answ = false;
+ // cerco se ci sia valore in redis...
+ // se vuoto = ALL...
+ keyPattern = string.IsNullOrEmpty(keyPattern) ? "**" : keyPattern;
+ try
+ {
+ foreach (var ep in connRedis.GetEndPoints())
+ {
+ var server = connRedis.GetServer(ep);
+ var keys = server.Keys(database: memLayer.ML.confReadInt("redisDb"), pattern: $"{keyPattern}*");
+ foreach (var key in keys)
+ {
+ cache.KeyDelete(key);
+ }
+ }
+ answ = true;
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error($"Eccezione in redFlushKey{Environment.NewLine}{exc}");
+ }
+ return answ;
+ }
+
+ ///
+ /// Conta num oggetti cache redis che rispondono a pattern
+ ///
+ /// ** = tutti
+ ///
+ public int redCountKey(string keyPattern)
+ {
+ int answ = 0;
+ // cerco se ci sia valore in redis...
+ // se vuoto = ALL...
+ keyPattern = string.IsNullOrEmpty(keyPattern) ? "**" : keyPattern;
+ try
+ {
+ foreach (var ep in connRedis.GetEndPoints())
+ {
+ var server = connRedis.GetServer(ep);
+ foreach (var key in server.Keys(pattern: keyPattern))
+ {
+ answ++;
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error($"Eccezione in redCountKey:{Environment.NewLine}{exc}");
+ }
+ return answ;
+ }
+
+ ///
+ /// Restituisce numero record in Redis DB
+ ///
+ public long numRecRedis
+ {
+ get
+ {
+ long answ = 0;
+ try
+ {
+ foreach (var ep in connRedis.GetEndPoints())
+ {
+ var server = connRedis.GetServer(ep);
+ answ += server.DatabaseSize();
+ }
+ }
+ catch
+ { }
+ return answ;
+ }
+ }
+
+ ///
+ /// Restituisce oggetti cache redis che rispondono a pattern
+ ///
+ /// ** = tutti
+ /// Tipo di ordinamento per kvp
+ ///
+ public List> redGetCounterByKey(string keyPattern, kvpOrderBy orderBy)
+ {
+ int numAnsw = redCountKey(keyPattern);
+ RedisKey[] chiavi = new RedisKey[numAnsw];
+ List> answ = new List>();
+ // se vuoto = ALL...
+ keyPattern = string.IsNullOrEmpty(keyPattern) ? "**" : keyPattern;
+
+ // recupero in primis elenco chiavi
+ try
+ {
+ int i = 0;
+ foreach (var ep in connRedis.GetEndPoints())
+ {
+ var server = connRedis.GetServer(ep);
+ foreach (var key in server.Keys(pattern: keyPattern))
+ {
+ chiavi[i] = key;
+ i++;
+ }
+ }
+ }
+ catch (Exception exc)
+ {
+ Logging.Instance.Error($"Eccezione in redGetCounterByKey{Environment.NewLine}{exc}");
+ }
+ // ora recupero valori!
+ var valori = getRKeys(chiavi);
+ int currVal = 0;
+ // popolo rispsota
+ try
+ {
+ for (int i = 0; i < numAnsw; i++)
+ {
+ Int32.TryParse(valori[i], out currVal);
+ answ.Add(new KeyValuePair(chiavi[i], currVal));
+ }
+ }
+ catch
+ { }
+ // se richiesto riordino...
+ switch (orderBy)
+ {
+ case kvpOrderBy.KeyAsc:
+ answ.Sort(CompareKey);
+ break;
+
+ case kvpOrderBy.KeyDesc:
+ answ.Sort(CompareKeyDesc);
+ break;
+
+ case kvpOrderBy.ValAsc:
+ answ.Sort(CompareVal);
+ break;
+
+ case kvpOrderBy.ValDesc:
+ answ.Sort(CompareValDesc);
+ break;
+
+ default:
+ break;
+ }
+ return answ;
+ }
+
+ ///
+ /// Effettua comaprazione x CHIAVE in KVP ASC
+ ///
+ ///
+ ///
+ ///
+ private int CompareKey(KeyValuePair x, KeyValuePair y)
+ {
+ return x.Key.CompareTo(y.Key);
+ }
+
+ ///
+ /// Effettua comaprazione x VALORE in KVP ASC
+ ///
+ ///
+ ///
+ ///
+ public int CompareVal(KeyValuePair x, KeyValuePair y)
+ {
+ return x.Value.CompareTo(y.Value);
+ }
+
+ ///
+ /// Effettua comaprazione x CHIAVE in KVP DESC
+ ///
+ ///
+ ///
+ ///
+ private int CompareKeyDesc(KeyValuePair x, KeyValuePair y)
+ {
+ return y.Key.CompareTo(x.Key);
+ }
+
+ ///
+ /// Effettua comaprazione x VALORE in KVP DESC
+ ///
+ ///
+ ///
+ ///
+ public int CompareValDesc(KeyValuePair x, KeyValuePair y)
+ {
+ return y.Value.CompareTo(x.Value);
+ }
+
+ ///
+ /// Tipologia di ordinamento x liste KVP
+ ///
+ public enum kvpOrderBy
+ {
+ ///
+ /// Ordinamento ASCending per KEY
+ ///
+ KeyAsc,
+
+ ///
+ /// Ordinamento DESCending per KEY
+ ///
+ KeyDesc,
+
+ ///
+ /// Ordinamento ASCending per VAL
+ ///
+ ValAsc,
+
+ ///
+ /// Ordinamento DESCending per VAL
+ ///
+ ValDesc
+ }
+
+ #endregion gestione valori in RedisCache
+
+ #region gestione Stack / List
+
+ ///
+ /// Lunghezza Stack
+ ///
+ ///
+ ///
+ public long StackLen(string stackName)
+ {
+ return connRedis.GetDatabase().ListLength((RedisKey)stackName);
+ }
+
+ ///
+ /// Mette in Stack un valore (F.I.L.O.)
+ ///
+ ///
+ ///
+ public void StackPush(string stackName, string value)
+ {
+ connRedis.GetDatabase().ListRightPush((RedisKey)stackName, (RedisValue)value);
+ }
+
+ ///
+ /// Recupera valore da Stack (F.I.L.O.)
+ ///
+ ///
+ ///
+ public string StackPop(string stackName)
+ {
+ return connRedis.GetDatabase().ListRightPop((RedisKey)stackName).ToString();
+ }
+
+ ///
+ /// Lunghezza List
+ ///
+ ///
+ ///
+ public long ListLen(string queueName)
+ {
+ return connRedis.GetDatabase().ListLength((RedisKey)queueName);
+ }
+
+ ///
+ /// Mette un valore in List (F.I.F.O.)
+ ///
+ ///
+ ///
+ public void ListPush(string queueName, string value)
+ {
+ connRedis.GetDatabase().ListRightPush((RedisKey)queueName, (RedisValue)value);
+ }
+
+ ///
+ /// Recupera valore da List (F.I.F.O.)
+ ///
+ ///
+ ///
+ public string ListPop(string queueName)
+ {
+ return connRedis.GetDatabase().ListLeftPop((RedisKey)queueName).ToString();
+ }
+
+ #endregion gestione Stack / List
+ }
}
\ No newline at end of file