1. 程式人生 > >StackExchange.redis 封裝幫助類

StackExchange.redis 封裝幫助類

using ModelLibrary.quotedata;
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using System.Text;
using System.Web.Script.Serialization;
/// <summary>
/// RedisHelperUtil 的摘要說明
/// </summary>
public class RedisHelperUtil : RedisHelper
{

    public RedisHelperUtil()
    {
        //
        // TODO: 在此處新增建構函式邏輯
        //
    }

    #region Redis記憶體庫連線方式
    /// <summary>
    /// 本地redis
    /// </summary>
   private static string constrStack = ConfigurationManager.ConnectionStrings["LocalKeyStack"].ConnectionString;
    /// <summary>
    /// 192.168.3.252
    /// </summary>
   // private static string constrStack = ConfigurationManager.ConnectionStrings["RedisKeyStack"].ConnectionString;
    #endregion

    //1069070069

    #region batch寫入資料

    #region Batch Hash寫入資料
   /// <summary>
   /// Batch Hash寫入資料 無資料型別
    /// </summary>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static  bool HashSetForBatch(RedisKey key, RedisValue v, RedisValue t, int db) 
    {
        using (var connect = ConnectionMultiplexer.Connect(constrStack)) 
        {
            try
            {
                var client = connect.GetDatabase(db);
                var batch = client.CreateBatch();
                Task b = batch.HashSetAsync(key, v,t);
                batch.Execute();
            }
            catch (Exception e){ }
            return true;
        }
    }

    /// <summary>
    /// Batch Hash寫入資料 資料型別T
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static async Task< bool> HashSetForBatch<T>(RedisKey key,RedisValue v, T t, int db) 
    {
        using (var connect = ConnectionMultiplexer.Connect(constrStack)) 
        {
            Task<bool> result=null;
            try 
            {
                var client = connect.GetDatabase(db);
                var bacth = client.CreateBatch();
                var b = bacth.HashSetAsync(key,v, RedisHelper.ConvertJson<T>(t));
                bacth.Execute();
                result = b;
            }
            catch (Exception e) { }
            return await result;
        }
    }
   #endregion

    #region Batch Set寫入資料
    /// <summary>
    /// Batch Set寫入資料 無資料型別
    /// </summary>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static async Task<long> SetAddForBatch(RedisKey key, RedisValue[] v, int db) 
    {
        using (var connect = ConnectionMultiplexer.Connect(constrStack)) 
        {
            Task<long> result = null;
            try
            {
                var client = connect.GetDatabase(db);
                var batch = client.CreateBatch();
                Task<long> b = batch.SetAddAsync(key, v);
                batch.Execute();
                result = b;
            }
            catch (Exception e) { }
            return await result;

        }
    }
    /// <summary>
    /// Batch Set寫入資料 資料型別T
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static async Task <bool> SetAddForBatch<T>(RedisKey key, T t, int db) 
    {
        using (var connect = ConnectionMultiplexer.Connect(constrStack)) 
        {
            Task<bool> result = null;
            try
            {
                var client = connect.GetDatabase(db);
                var batch = client.CreateBatch();
                Task<bool> b = batch.SetAddAsync(key, RedisHelper.ConvertJson<T>(t));
                batch.Execute();
                result = b;
            }
            catch { }
            return await result;
        }
    }

    #endregion

    #endregion

    #region bacth讀取資料

    #region Batch 讀取Hash
    /// <summary>
    /// Batch 讀取Hash所有的值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static HashEntry[] HashGetAllForBatch(RedisKey key, int db)
    {
        HashEntry[] hash = null;
        List<Task<HashEntry[]>> valueList = new List<Task<HashEntry[]>>();
        try
        {
            using (var connect = ConnectionMultiplexer.Connect(constrStack))
            {
                var client = connect.GetDatabase(db);
                var batch = client.CreateBatch();
                Task<HashEntry[]> tres = batch.HashGetAllAsync(key);
                valueList.Add(tres);
                batch.Execute();
                foreach (var hashEntry in valueList)
                {
                    hash = hashEntry.Result;
                    //var dic = hashEntry.Result.ToDictionary(k => k.Name, v => v.Value);
                    //var keys = dic.Keys;
                }
            }
        }
        catch (Exception e) { }
        return hash;
    }
    #endregion

    #region Batch 讀取List
    /// <summary>
    /// Batch 讀取List所有的值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static RedisValue[] ListGetAllForBatch(RedisKey key, int db)
    {
        RedisValue[] redis = null;
        List<Task<RedisValue[]>> valueList = new List<Task<RedisValue[]>>();
        try
        {
            using (var connect = ConnectionMultiplexer.Connect(constrStack))
            {
                var client = connect.GetDatabase(db);
                var batch = client.CreateBatch();
                Task<RedisValue[]> list = batch.ListRangeAsync(key);
                valueList.Add(list);
                batch.Execute();
                foreach (var RedisValue in valueList)
                {
                    redis = RedisValue.Result;
                }
            }
        }
        catch (Exception e) { }
        return redis;
    }
    #endregion

    #region  Batch 讀取SortedSet
    /// <summary>
    /// 獲取SortedSet的全部資料
    /// </summary>
    /// <param name="key"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static RedisValue[] SortedSetRangeByRankAllForBatch(RedisKey key, int db) 
    {
        RedisValue[] redis = null;
        List<Task<RedisValue[]>> value = new List<Task<RedisValue[]>>();
        using (var connect = ConnectionMultiplexer.Connect(constrStack)) 
        {
            try 
            {
                var client = connect.GetDatabase(db);
                var batch = client.CreateBatch();
                Task<RedisValue []> list = batch.SortedSetRangeByRankAsync(key);;
                value.Add(list);
                batch.Execute();
                foreach (var v in value) 
                {
                    redis = v.Result;
                }
            }
            catch (Exception e) { }
            return redis;
        }
    }
    #endregion
    #endregion

    #region redis資料型別為string

    #region 儲存單個 value
    /// <summary>
    /// 儲存單個 value
    /// 設定一個string的鍵,如果存在 就會被重寫
    /// </summary>
    /// <param name="TableName">表名</param>
    /// <param name="value">值</param>
    /// <param name="db">資料庫</param>
    /// <returns></returns>
    public static bool StringSet(string TableName, string value, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).StringSet(TableName, value);
        }
    }

    public static bool StringSet<T>(RedisKey key, T v, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            return client.GetDatabase(db).StringSet(key, RedisHelper.ConvertJson<T>(v));
        }
    }
    #endregion

    #region 儲存多個 value
    /// <summary>
    /// 批量儲存多個值
    /// </summary>
    /// <param name="TableName">陣列 表名</param>
    /// <param name="value">陣列 值</param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static bool StringSet(string[] TableName, string[] value, int db)
    {
        //例項: 
        //string [] tabname = {"a1","a2","a3" };
        //string[] key = { "key1", "key2", "key3" };
        //var result = RedisHelperUtil.StringSet(tabname, key, dbt);

        var count = TableName.Length;
        var keyValuePair = new KeyValuePair<RedisKey, RedisValue>[count];
        for (int i = 0; i < count; i++)
        {
            keyValuePair[i] = new KeyValuePair<RedisKey, RedisValue>(TableName[i], value[i]);
        }
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).StringSet(keyValuePair);
        }
    }
    #endregion

    #region String讀取單個值
    /// <summary>
    /// String讀取單個值
    /// </summary>
    /// <param name="TableName">表名</param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static string StringGet(string TableName, int db)
    {
        //例項:
        //var result = RedisHelperUtil.StringGet("a1", dbt);
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).StringGet(TableName);
        }
    }
    /// <summary>
    /// String讀取單個值 資料型別T 返回物件T
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static T StringGet<T>(RedisKey key, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            var value = client.GetDatabase(db).StringGet(key);
            return RedisHelper.ConvertObj<T>(value);
        }
    }
    #endregion

    #region string批量讀取
    /// <summary>
    /// string批量讀取
    /// </summary>
    /// <param name="keyStrs"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>

    public static RedisValue[] StringGet(RedisKey[] TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).StringGet(TableName);
        }
    }
    /// <summary>
    /// string批量讀取 資料型別T 返回List<T> 集合
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static List<T> StringGet<T>(RedisKey[] key, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            RedisValue[] v = client.GetDatabase(db).StringGet(key);
            return RedisHelper.ConvetList<T>(v);
        }
    }

    #endregion

    #region 數字增長val
    /// <summary>
    /// String 數字增長val,返回自增後的值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static double StringIncrement(RedisKey key, double v, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            return client.GetDatabase(db).StringIncrement(key, v);
        }
    }
    #endregion

    #region 數字減少v
    /// <summary>
    /// 數字減少v,返回自減少的值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static double StringDecrement(RedisKey key, double v, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            return client.GetDatabase(db).StringDecrement(key, v);
        }
    }
    #endregion
    #endregion

    #region redis資料型別為hash

    #region 判斷某個hash資料是否存在
    /// <summary>
    /// 判斷某個hash資料是否存在
    /// </summary>
    /// <param name="TableName">表名</param>
    /// <param name="dataKey">鍵名</param>
    /// <param name="dbt">資料庫名</param>
    /// <returns></returns>
    public static bool HashExists(string TableName, string dataKey, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashExists(TableName, dataKey);
        }
    }
    #endregion

    #region Hash 儲存一個數據
    /// <summary>
    /// Hash 儲存一個數據 資料型別T
    /// 如果這個hsah不存在則建立新的hash鍵返回true,如果不存在則這個hash鍵會被重寫 返回false
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName">表名</param>
    /// <param name="dataKey">鍵名</param>
    /// <param name="dbt">資料庫</param>
    /// <param name="t">json格式字串</param>
    /// <returns></returns>
    public static bool HashSet<T>(string TableName, string dataKey, int dbt, T t)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            var json = RedisHelper.ConvertJson(t);
            return client.GetDatabase(dbt).HashSet(TableName, dataKey, json);
        }
    }
    /// <summary>
    /// Hash 儲存一個數據 
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="db"></param>
    /// <param name="t"></param>
    /// <returns></returns>
    public static bool HashSet(string TableName, string dataKey, int db, RedisValue t)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).HashSet(TableName, dataKey, t);
        }
    }
    #endregion

    #region Hash一次性插入多條資料
    /// <summary>
    /// Hash一次性插入多條資料 資料型別 List<HashEntry> t
    /// </summary>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static bool HashSetMore(RedisKey key, List<HashEntry> t, int db)
    {
        using (var connect = ConnectionMultiplexer.Connect(constrStack))
        {
            connect.GetDatabase(db).HashSet(key, t.ToArray());
            return true;
        }
    }
    /// <summary>
    /// hash一次性插入多條資料,資料型別 HashEntry[] v
    /// </summary>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static bool HashSetMore(RedisKey key, HashEntry[] v, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            client.GetDatabase(db).HashSet(key, v);
            return true;
        }
    }

    #endregion

    #region 從hash中獲取單個數據
    /// <summary>
    /// 從hash中獲取資料 資料型別T
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static T HashGet<T>(string TableName, string dataKey, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            string value = client.GetDatabase(dbt).HashGet(TableName, dataKey);
            return RedisHelper.ConvertObj<T>(value);
        }
    }
    /// <summary>
    /// 從hash中獲取資料
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static string HashGet(string TableName, string dataKey, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            string value = client.GetDatabase(dbt).HashGet(TableName, dataKey);
            return value;
        }
    }
    #endregion

    #region 從hash中獲取多個鍵值
    /// <summary> 
    /// 從hash中獲取多個鍵值 返回 RedisValue[]
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="hashFields">一個鍵值的陣列</param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static RedisValue[] HashValues(string TableName, RedisValue[] hashFields, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashGet(TableName, hashFields);
        }
    }
    /// <summary>
    /// 從hash中獲取多個鍵值 返回List<T>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static List<T> HashValues<T>(RedisKey key, RedisValue[] v, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            var value = client.GetDatabase(db).HashGet(key, v);
            return RedisHelper.ConvetList<T>(value);
        }
    }
    #endregion

    #region 獲取整個hash的資料
    /// <summary>
    /// 獲取hash表中的所有值   適用於資料量小
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static HashEntry[] Hash_GetAll(string TableName, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashGetAll(TableName);
        }
    }


    #endregion

    #region 獲取整個hash的Key 
    /// <summary>
    /// 獲取整個hash的Key
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static RedisValue[] HashAllKeys(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).HashKeys(TableName);
        }
    }
    #endregion

    #region 獲取整個hash的Value
    /// <summary>
    /// 獲取整個hash的Value 返回RedisValue[]
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static RedisValue[] HashAllValues(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).HashValues(TableName);
        }
    }
    /// <summary>
    /// 獲取整個hash的Value 返回List<T>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static List<T> HashAllValues<T>(RedisKey key, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            RedisValue[] v = client.GetDatabase(db).HashValues(key);
            return RedisHelper.ConvetList<T>(v);
        }
    }
    #endregion

    #region 移除hash中的某個值
    /// <summary>
    /// 移除hash中的某個值
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static bool HashDelete(string TableName, string dataKey, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashDelete(TableName, dataKey);
        }
    }
    #endregion

    #region 移除hash中多個值
    /// <summary>
    /// 移除hash中多個值
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static long HashDelete(string TableName, List<RedisValue> dataKey, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashDelete(TableName, dataKey.ToArray());
        }
    }

    public static long HashDelete(string TableName, RedisValue[] Rvalue, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).HashDelete(TableName, Rvalue);
        }
    }
    #endregion

    #region 為數字增長 V
    /// <summary>
    /// 為數字增長 V
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="dbt"></param>
    /// <param name="v">可以是負數</param>
    /// <returns></returns>
    public static double HashIncrement(string TableName, string dataKey, int dbt, double v = 1)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashIncrement(TableName, dataKey, v);
        }
    }
    #endregion

    #region 為數字減少 V
    /// <summary>
    /// 為數字減少 V
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="dataKey"></param>
    /// <param name="dbt"></param>
    /// <param name="v">可以是負數</param>
    /// <returns></returns>
    public static double HashDecrement(string TableName, string dataKey, int dbt, double v = 1)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashDecrement(TableName, dataKey, v);
        }
    }
    #endregion

    #region 返回hash中的長度
    /// <summary>
    /// 返回hash中的長度
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="key"></param>
    /// <param name="dbt"></param>
    /// <returns></returns>
    public static long HashLength(string TableName, string key, int dbt)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(dbt).HashLength(TableName);
        }
    }
    #endregion

    #endregion

    #region redis資料型別為list

    #region 從key的list中取出所有的資料
    /// <summary>
    /// 從key的list中取出所有的資料
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns>並且資料結構為JSON格式</returns>
    public static List<T> ListRange<T>(string TableName, int db)
    {
        //例項
        //List<JsonObject> li = new List<JsonObject>();
        //li = RedisHelperUtil.ListRange<JsonObject>("abc", 3);
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return RedisHelper.ConvetList<T>(client.GetDatabase(db).ListRange(TableName));
        }
    }

    public static List<T> ListRange<T>(string TableName, int db,int start,int stop)
    {
        //例項
        //List<JsonObject> li = new List<JsonObject>();
        //li = RedisHelperUtil.ListRange<JsonObject>("abc", 3);
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return RedisHelper.ConvetList<T>(client.GetDatabase(db).ListRange(TableName,start,stop));
        }
    }

    /// <summary>
    /// 從key的list中取出所有的資料
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static RedisValue[] ListRange(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListRange(TableName);
        }
    }

    public static RedisValue[] ListRange(RedisKey key, int db, long start, long stop)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListRange(key, start, stop);
        }
    }
    #endregion

    #region 從左側(頭部)向list中新增一個值
    /// <summary>
    /// 從左側向list中新增一個值(無格式型別),返回集合總數 
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="value"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListLeftPush(string TableName, RedisValue value, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListLeftPush(TableName, value);
        }
    }
    /// <summary>
    /// 從左側向list中新增一個值(JSON格式),返回集合總數 
    /// </summary>
    /// <typeparam name="T">實體</typeparam>
    /// <param name="TableName"></param>
    /// <param name="value"></param>
    /// <param name="db"></param>
    /// <returns>插入資料的表的資料結構要一致並且資料結構為JSON格式</returns>

    public static long ListLeftPush<T>(string TableName, T t, int db)
    {
        string JsonStr = JsonHelperUtil.ConvertJson(t);
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListLeftPush(TableName, JsonStr);
        }
    }

    #endregion

    #region 從左側(頭部)向list中新增多個值
    /// <summary>
    /// 從左側(頭部)向list中新增多個值
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListLeftPush(string TableName, RedisValue[] v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListLeftPush(TableName, v);
        }
    }

    /// <summary>
    /// 從左側向list中新增多個值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="values"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListLeftPush<T>(string TableName, List<T> values, int db)
    {
        //事例:
        //List<string> tt = new List<string>();
        //tt.Add("a1");
        //tt.Add("a2");
        //tt.Add("a3");
        //var r = RedisHelperUtil.ListLeftPush(tab, tt, dbt);
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            RedisValue[] valueList = RedisHelper.ConvertRedisValue(values.ToArray());
            return client.GetDatabase(db).ListLeftPush(TableName, valueList);
        }
    }
    #endregion

    #region 從右側(尾部)向list新增一個值
    /// <summary>
    /// 從右側(尾部)向list新增一個值(無格式)
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="value"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListRightPush(string TableName, RedisValue value, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListRightPush(TableName, value);
        }
    }
    /// <summary>
    /// 從右側(尾部)向list新增一個值(JSON格式)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListRightPush<T>(string TableName, T t, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            var v = RedisHelper.ConvertJson(t);
            return client.GetDatabase(db).ListRightPush(TableName, v);
        }
    }

    #endregion

    #region 從右側(尾部)向list新增多個值

    public static long ListRightPush(string TableName, RedisValue[] v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListRightPush(TableName, v);
        }
    }
    /// <summary>
    /// 從右側(尾部)向list新增多個值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListRightPush<T>(string TableName, List<T> t, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            RedisValue[] values = RedisHelper.ConvertRedisValue(t.ToArray());
            return client.GetDatabase(db).ListRightPush(TableName, values);
        }
    }

    #endregion

    #region 從左側(頭部)向list中取出一個值 並且刪除
    /// <summary>
    /// 從左側(頭部)向list中取出一個值 並且刪除
    /// </summary>
    /// <param name="TableNme"></param>
    /// <param name="db"></param>
    /// <returns>返回一個值</returns>
    public static RedisValue ListLeftPop(string TableNme, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return (client.GetDatabase(db).ListLeftPop(TableNme));
        }
    }
    /// <summary>
    /// /// <summary>
    /// 從左側(頭部)向list中取出一個值 返回物件
    /// </summary>
    /// <param name="TableNme"></param>
    /// <param name="db"></param>
    /// <returns>返回一個物件</returns>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static T ListLeftPop<T>(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return RedisHelper.ConvertObj<T>(client.GetDatabase(db).ListLeftPop(TableName));
        }
    }
    #endregion

    #region 從右側(尾部)向list中取出一個值並且刪除

    /// <summary>
    /// 從右側(尾部)向list中取出一個值並且刪除
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static RedisValue ListRightPop(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListRightPop(TableName);
        }
    }
    /// <summary>
    /// 從右側(尾部)向list中取出一個值 返回物件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static T ListRightPop<T>(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return RedisHelper.ConvertObj<T>(client.GetDatabase(db).ListRightPop(TableName));
        }
    }
    #endregion

    #region 從在xx之後入列
    /// <summary>
    /// 從在xx之後(右側尾部)入列
    /// </summary>
    /// <param name="TableName">表名</param>
    /// <param name="pivot">在pivot之後插入</param>
    /// <param name="v">插入值為v</param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListInsertAfter(string TableName, RedisValue pivot, RedisValue v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListInsertAfter(TableName, pivot, v);
        }
    }

    public static long ListInsertAfter<T>(RedisKey key, RedisValue pivot, T t, int db) 
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack)) 
        {
            return client.GetDatabase(db).ListInsertAfter(key, pivot, RedisHelper.ConvertJson<T>(t));
        }
    }
    #endregion

    #region 從在xx之前入列
    /// <summary>
    /// 從在xx之前入列
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="pivot">在pivot前面插入(左側。前方)</param>
    /// <param name="v">插入v</param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListInsertBefore(string TableName, RedisValue pivot, RedisValue v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListInsertBefore(TableName, pivot, v);
        }
    }
    public static long ListInsertBefore<T>(string TableName, RedisValue pivot,T t, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListInsertBefore(TableName, pivot, RedisHelper.ConvertJson<T>(t));
        }
    }
    #endregion

    #region 從第幾個後面入列
    /// <summary>
    /// 從第幾個後面入列
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="index"></param>
    /// <param name="value"></param>
    /// <param name="db"></param>
    public static void ListSetByIndex(string TableName, long index, RedisValue value, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            client.GetDatabase(db).ListSetByIndex(TableName, index, value);
        }
    }
    #endregion

    #region 根據index獲取(下標0開始)
    /// <summary>
    /// 根據index獲取(下標0開始)
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="index"></param>
    /// <param name="db"></param>
    public static RedisValue ListGetByIndex(string TableName, long index, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListGetByIndex(TableName, index);
        }
    }
    #endregion

    #region list集合長度
    /// <summary>
    /// 返回list集合長度
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListLength(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListLength(TableName);
        }
    }
    #endregion

    #region 從key的List中移除指定的值,返回刪除個數
    /// <summary>
    /// 從key的List中移除指定的值,返回刪除個數
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long ListRemove(string TableName, RedisValue v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).ListRemove(TableName, v);
        }
    }
    #endregion
    #endregion

    #region redis資料型別為set

    #region 在key集合中新增一個value值
    /// <summary>
    /// 在key集合中新增一個value值
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static bool SetAdd(string TableName, RedisValue v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SetAdd(TableName, v);
        }
    }

    #endregion

    #region 在key集合中新增多個value值
    /// <summary>
    /// 在key集合中新增一個或多個value值
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long SetAdd(string TableName, RedisValue[] v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SetAdd(TableName, v);
        }
    }

    #endregion

    #region 獲取Key所有值的集合
    /// <summary>
    /// 獲取Key所有值的集合
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static RedisValue[] SetMembers(string TableName, int db)
    {
        #region 例項 :
        //RedisValue[] r = RedisHelperUtil.SetMembers("SetV", 3);
        //var rr = r[1];
        #endregion
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SetMembers(TableName);
        }
    }
    #endregion

    #region 獲取key集合的數量
    /// <summary>
    /// 獲取key集合的數量
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long SetLength(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SetLength(TableName);
        }
    }
    #endregion

    #region 判斷Key集合中是否包含指定的值
    /// <summary>
    /// 判斷Key集合中是否包含指定的值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    /// 
    public static bool SetContains(string TableName, RedisValue v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SetContains(TableName, v);
        }
    }
    #endregion

    #region 刪除key集合中指定的value
    /// <summary>
    /// 刪除key集合中指定的value
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="datakey"></param>
    /// <param name="db"></param>
    public static bool SetRemove(string TableName, string datakey, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SetRemove(TableName, datakey);
        }
    }
    #endregion



    #endregion

    #region redis資料型別為SortedSet

    #region 新增一個值到Key
    /// <summary>
    /// 新增一個值到Key
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="t"></param>
    /// <param name="score"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static bool SortedSetAdd<T>(string TableName, T t, double score, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetAdd(TableName, RedisHelper.ConvertJson<T>(t), score);
        }
    }
    /// <summary>
    /// 新增一個或多個值
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="v"></param>
    /// <param name="score"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long SortedSetAdd(string TableName, SortedSetEntry[] v, double score, int db)
    {
        //例項:
        //SortedSetEntry[] v = {new SortedSetEntry("a",2),new SortedSetEntry("b",2)};
        //var l = RedisHelperUtil.SortedSetAdd("SortedOne",v,2,3);
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetAdd(TableName, v);
        }
    }
    #endregion

    #region 新增一個集合到Key

    /// <summary>
    /// 新增一個集合到Key
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="value"></param>
    /// <param name="score"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long SortedSetAdd<T>(string TableName, List<T> value, double score, int db)
    {
        #region 例項
        //List<string> l = new List<string>();
        //l.Add("aa");
        //l.Add("bb");
        //var t = RedisHelperUtil.SortedSetAdd<string>("Test", l, 2, 3);
        #endregion
        SortedSetEntry[] Svalue = value.Select(o => new SortedSetEntry(RedisHelper.ConvertJson<T>(o), score)).ToArray();
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetAdd(TableName, Svalue);
        }
    }
    #endregion

    #region 獲取SortedSet的全部資料 或者從start開始到stop條的資料
    /// <summary>
    /// 獲取SortedSet的全部資料
    /// 或者從start開始到stop條的資料
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <param name="start">起始數</param>
    /// <param name="stop">-1表示到結束,0為1條</param>
    /// <param name="desc">是否按降序排列</param>
    /// <returns></returns>
    public static RedisValue[] SortedSetRangeByRankAll(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetRangeByRank(TableName);
        }
    }
    public static RedisValue[] SortedSetRangeByRankAll(string TableName, int db, long start = 0, long stop = -1, bool desc = false)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            start = start == 0 ? 0 : start;
            stop = stop == -1 ? -1 : stop;
            Order orderBy = desc ? Order.Descending : Order.Ascending;
            return client.GetDatabase(db).SortedSetRangeByRank(TableName, start, stop, orderBy);
        }
    }
    #endregion

    #region 獲取SortedSet的分頁資料
    /// <summary>
    /// 獲取SortedSet的分頁資料
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="pageIndex">頁碼</param>
    /// <param name="pageSize">頁大小</param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static RedisValue[] SortedSetRangeByRank(string TableName, int pageIndex, int pageSize, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetRangeByRank(TableName, (pageIndex - 1) * pageSize, pageIndex * pageSize - 1);
        }
    }
    #endregion

    #region 獲取指定key的排序Score值
    /// <summary>
    /// 獲取制定key的排序Score值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="TableName"></param>
    /// <param name="t"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static double? SortedSetScore(string TableName, RedisValue v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetScore(TableName, v);
        }
    }

    public static double? SortedSetScore<T>(string TableName, T t, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetScore(TableName, RedisHelper.ConvertJson<T>(t));
        }
    }



    #endregion

    #region 獲取集合中的數量
    /// <summary>
    /// 獲取集合中的數量
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long SortedSetLength(string TableName, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetLength(TableName);
        }
    }
    #endregion

    #region 移除資料從SortedSet
    /// <summary>
    /// 移除資料從SortedSet
    /// </summary>
    /// <param name="TableName"></param>
    /// <param name="v"></param>
    /// <param name="db"></param>
    /// <returns></returns>
    public static long SortedSetRemove(string TableName, RedisValue[] v, int db)
    {
        using (var client = ConnectionMultiplexer.Connect(constrStack))
        {
            return client.GetDatabase(db).SortedSetRemove(TableName, v);
        }
    }
    #endregion

    #endregion

}