• C# 项目中使用 ServiceStack.Redis 操作 Redis


    Redis 官网上可以找到很多针对 C# 的类库支持,这里我们选择了 ServiceStack.Redis 这个客户端,但是 ServiceStack.Redis 有个连接数限制,需要修改源码,另外一个用的比较多的是 StackExchange.Redis,这里不做介绍。

    RedisConfiguration 类:

        /// <summary>
        /// 表示配置文件中的 Redis 配置节。
        /// </summary>
        public sealed class RedisConfiguration : ConfigurationSection
        {
            /// <summary>
            /// 检索当前应用程序默认配置的 Redis 配置节。
            /// </summary>
            /// <returns>指定的 Redis 配置节对象,或者,如果该节不存在,则为 null。</returns>
            public static RedisConfiguration GetConfig()
            {
                RedisConfiguration section = (RedisConfiguration)ConfigurationManager.GetSection("RedisConfig");
                return section;
            }
    
            /// <summary>
            /// 检索当前应用程序默认配置的 Redis 配置节。
            /// </summary>
            /// <param name="sectionName">配置节的路径和名称。</param>
            /// <returns>指定的 Redis 配置节对象,或者,如果该节不存在,则为 null。</returns>
            public static RedisConfiguration GetConfig(string sectionName)
            {
                RedisConfiguration section = (RedisConfiguration)ConfigurationManager.GetSection("RedisConfig");
                if (section == null)
                    throw new ConfigurationErrorsException("Section " + sectionName + " is not found.");
                return section;
            }
            /// <summary>
            /// 获取或设置用于写入的 Redis 服务器地址。
            /// </summary>
            [ConfigurationProperty("WriteServerList", IsRequired = false)]
            public string WriteServerHosts
            {
                get
                {
                    return (string)base["WriteServerList"];
                }
                set
                {
                    base["WriteServerList"] = value;
                }
            }
    
            /// <summary>
            /// 获取或设置用于读取的 Redis 服务器的主机地址。
            /// </summary>
            [ConfigurationProperty("ReadServerList", IsRequired = false)]
            public string ReadServerHosts
            {
                get
                {
                    return (string)base["ReadServerList"];
                }
                set
                {
                    base["ReadServerList"] = value;
                }
            }
    
            /// <summary>
            /// 获取或设置 Redis Sentinel 服务器的主机地址。
            /// </summary>
            [ConfigurationProperty("SentinelServerList", IsRequired = false)]
            public string SentinelServerHosts
            {
                get
                {
                    return (string)base["SentinelServerList"];
                }
                set
                {
                    base["SentinelServerList"] = value;
                }
            }
    
            /// <summary>
            /// 获取或设置 Redis Sentinel 服务器的密码。
            /// </summary>
            [ConfigurationProperty("SentinelPassword", IsRequired = false)]
            public string SentinelPassword
            {
                get
                {
                    return (string)base["SentinelPassword"];
                }
                set
                {
                    base["SentinelPassword"] = value;
                }
            }
    
            /// <summary>
            /// 获取或设置 Redis 主服务器的名称。
            /// </summary>
            [ConfigurationProperty("MasterName", IsRequired = false)]
            public string MasterName
            {
                get
                {
                    string masterName = (string)base["MasterName"];
                    return String.IsNullOrEmpty(masterName) ? "master" : masterName;
                }
                set
                {
                    base["MasterName"] = value;
                }
            }
    
            /// <summary>
            /// 获取或设置 Sentinel 的默认数据库。
            /// </summary>
            [ConfigurationProperty("SentinelDb", IsRequired = false, DefaultValue = 0)]
            public int SentinelDb
            {
                get
                {
                    int sentinelDb = (int)base["SentinelDb"];
                    return sentinelDb >= 0 ? sentinelDb : 0;
                }
                set
                {
                    base["SentinelDb"] = value;
                }
            }
    
            /// <summary>
            /// 最大写入连接池大小。
            /// </summary>
            [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)]
            public int MaxWritePoolSize
            {
                get
                {
                    int maxWritePoolSize = (int)base["MaxWritePoolSize"];
                    return maxWritePoolSize > 0 ? maxWritePoolSize : 5;
                }
                set
                {
                    base["MaxWritePoolSize"] = value;
                }
            }
    
            /// <summary>
            /// 最大读取连接池大小。
            /// </summary>
            [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)]
            public int MaxReadPoolSize
            {
                get
                {
                    int maxReadPoolSize = (int)base["MaxReadPoolSize"];
                    return maxReadPoolSize > 0 ? maxReadPoolSize : 5;
                }
                set
                {
                    base["MaxReadPoolSize"] = value;
                }
            }
    
            /// <summary>
            /// 自动重启。
            /// </summary>
            [ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)]
            public bool AutoStart
            {
                get
                {
                    return (bool)base["AutoStart"];
                }
                set
                {
                    base["AutoStart"] = value;
                }
            }
    
            /// <summary>
            /// 本地缓存到期时间,单位:秒。
            /// </summary>
            [ConfigurationProperty("CacheExpires", IsRequired = false, DefaultValue = 36000)]
            public int CacheExpires
            {
                get
                {
                    return (int)base["CacheExpires"];
                }
                set
                {
                    base["CacheExpires"] = value;
                }
            }
    
    
            /// <summary>
            /// 是否记录日志,该设置仅用于排查 Redis 运行时出现的问题,如 Redis 工作正常,请关闭该项。
            /// </summary>
            [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)]
            public bool RecordeLog
            {
                get
                {
                    return (bool)base["RecordeLog"];
                }
                set
                {
                    base["RecordeLog"] = value;
                }
            }
    
        }
    

    RedisKeys 类定义全局 Key:

        /// <summary>
        /// 全局 Key 定义。
        /// </summary>
        public static class RedisKeys
        {
    
            #region 广告相关...
    
            /// <summary>
            /// 指定城市唯一编号指定唯一广告编号的信息实体对象,{0}:指定城市唯一编号,{1}:指定广告编码。
            /// </summary>
            public static readonly string ADVERTISEMENTSEAT_CITY_BAIDUADID = "AdvertisementSeat_City_{0}_BaiDuAdId_{1}";
            /// <summary>
            /// 指定城市唯一编号指定广告投放目标的信息实体对象,{0}:指定城市唯一编号,{1}:指定广告投放目标。
            /// </summary>
            public static readonly string ADVERTISEMENTSEAT_CITY_BAIDUADID_TARGET = "AdvertisementSeat_City_{0}_Target_{1}";
            /// <summary>
            /// 指定城市唯一编号指定唯一广告编号的信息实体对象,{0}:指定城市唯一编号,{1}:指定产品类型编码。
            /// </summary>
            public static readonly string ADVERTISEMENTSEAT_CITY_CONDITION = "AdvertisementSeat_City_{0}_Condition_{1}";
    
            #endregion
    
        }

    RedisConnectType 类定义 Redis 建立连接的方式,连接池模式,及时连接及时释放模式:

        /// <summary>
        /// 定义 Redis 建立连接的方式,连接池模式,及时连接及时释放模式。
        /// </summary>
        public enum RedisConnectType
        {
            /// <summary>
            /// 连接池链接方式。
            /// </summary>
            PooledRedisClient,
            /// <summary>
            /// 短连接方式,用完就释放的模式。
            /// </summary>
            ShortConnectClient
        }
    

    RedisExpires 中统一定义了 Redis 数据的有效时间:

        /// <summary>
        /// Redis 有效时间(单位:分钟)定义类。
        /// </summary>
        public static class RedisExpires
        {
            /// <summary>
            /// 1 分钟。
            /// </summary>
            public static readonly int ONE_MINUTE = 1;
    
            /// <summary>
            /// 10 分钟。
            /// </summary>
            public static readonly int TEN_MINUTE = 10;
    
            /// <summary>
            /// 半小时。
            /// </summary>
            public static readonly int HALF_HOUR = 30;
    
            /// <summary>
            /// 1 小时。
            /// </summary>
            public static readonly int ONE_HOUR = 60;
    
            /// <summary>
            /// 半天。
            /// </summary>
            public static readonly int HALF_DAY = 60 * 12;
    
            /// <summary>
            /// 1 天。
            /// </summary>
            public static readonly int ONE_DAY = 60 * 24;
    
            /// <summary>
            /// 1 周。
            /// </summary>
            public static readonly int ONE_WEEK = 7 * 60 * 24;
    
            /// <summary>
            /// 1 个月。
            /// </summary>
            public static readonly int ONE_MONTH = 30 * 60 * 24;
        }

    RedisManager 类中提供了常用的操作:

       /// <summary>
        /// 提供一组用于 Redis 连接池管理对象的工具和方法。
        /// </summary>
        public sealed class RedisManager
        {
            /// <summary>
            /// 声明 Redis 配置信息。
            /// </summary>
            private static RedisConfiguration _redisConfiguration = RedisConfiguration.GetConfig();
            /// <summary>
            /// 声明 Redis 客户端连接的线程安全池对象。
            /// </summary>
            private static IRedisClientsManager _redisClientsManager = null;
            ///// <summary>
            ///// 建立 Redis 连接的方式(默认是连接池的方式)。
            ///// </summary>
            //private RedisConnectType ConnnectType = RedisConnectType.PooledRedisClient;
            ///// <summary>
            ///// ip
            ///// </summary>
            //private string RedisServerIP = "";
            ///// <summary>
            ///// 端口
            ///// </summary>
            //private int RedisServerPort = 6379;
            ///// <summary>
            ///// 数据库编号
            ///// </summary>
            //private int RedisServerDb = 0;
            /// <summary>
            /// 声明 _lockObject 对象。
            /// </summary>
            private object _lockObject = new object();
    
            /// <summary>
            /// 初始化 Redis 连接池管理对象。
            /// </summary>
            static RedisManager()
            {
                CreateManager();
            }
    
    
            /// <summary>
            /// 创建 Redis 连接池管理对象。
            /// </summary>
            private static void CreateManager()
            {
                string[] sentinelServerHosts = SplitServerHosts(_RedisConfiguration.SentinelServerHosts, ",");
                var redisSentinel = new RedisSentinel(sentinelServerHosts, _RedisConfiguration.MasterName);
                _redisClientsManager = redisSentinel.Start();
            }
    
            /// <summary>
            /// 取得服务器主机地址集合。
            /// </summary>
            /// <param name="serverHosts">服务器主机地址。</param>
            /// <param name="split">分隔符。</param>
            /// <returns>服务器主机地址集合。</returns>
            private static string[] SplitServerHosts(string serverHosts, string split)
            {
                return serverHosts.Split(split.ToArray());
            }
    
            /// <summary>
            /// 获取 Redis 客户端缓存操作对象。
            /// </summary>
            public static IRedisClient GetClient()
            {
                if (_redisClientsManager == null)
                    CreateManager();
                var redisClient = _redisClientsManager.GetClient();
                redisClient.Password = _RedisConfiguration.SentinelPassword;
    #if(DEBUG)
                redisClient.Db = _RedisConfiguration.SentinelDb;
    #endif
                return redisClient;
            }
    
            /// <summary>
            /// 刷新全部数据。
            /// </summary>
            public static void FlushAll()
            {
                using (IRedisClient redis = GetClient())
                {
                    redis.FlushAll();
                }
            }
    
            #region 项...
    
            /// <summary>
            /// 设置指定的项到指定的键中。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <returns>如果设置成功,则为 true;否则为 false。</returns>
            public static bool ItemSet<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.Set(key, t);
                }
            }
    
            /// <summary>
            /// 设置指定的项到指定的键中。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <param name="expire">指定的有效期(单位:分钟)。</param>
            /// <returns>如果设置成功,则为 true;否则为 false。</returns>
            public static bool ItemSetExpire<T>(string key, T t, int expire)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.Set(key, t, DateTime.Now.Add(TimeSpan.FromMinutes(expire)));
                }
            }
    
            /// <summary>
            /// 获取指定的键的项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <returns>如果存在该项,则返回该项,否则返回 null。</returns>
            public static T ItemGet<T>(string key) where T : class
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.Get<T>(key);
                }
            }
    
            /// <summary>
            /// 移除指定的键的项。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <returns>如果移除成功,则为 true;否则为 false。</returns>
            public static bool ItemRemove(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.Remove(key);
                }
            }
    
            #endregion
    
            #region 列表...
    
            /// <summary>
            /// 添加项到指定键的列表。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            public static void ListAdd<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    redisTypedClient.AddItemToList(redisTypedClient.Lists[key], t);
                }
            }
    
            /// <summary>
            /// 将指定的对象集合的元素添加到指定键的列表末尾。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="tList">指定的项的集合。</param>
            public static void ListAddRange<T>(string key, List<T> tList)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    redisTypedClient.Lists[key].AddRange(tList);
                }
            }
    
            /// <summary>
            /// 从指定键的列表中移除指定的项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <returns>返回一个值,该值表示是否移除成功。</returns>
            public static bool ListRemove<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    return redisTypedClient.RemoveItemFromList(redisTypedClient.Lists[key], t) > 0;
                }
            }
    
            /// <summary>
            /// 从指定键的列表中移除所有的项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            public static void ListRemoveAll<T>(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    redisTypedClient.Lists[key].RemoveAll();
                }
            }
    
            /// <summary>
            /// 获取指定键的列表中实际包含的元素数。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <returns>指定的键中实际包含的元素数。</returns>
            public static int ListCount(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    return (int)redis.GetListCount(key);
                }
            }
    
            /// <summary>
            /// 从指定键的列表中获取指定范围的元素。
            /// </summary>
            /// <typeparam name="T">指定项的类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="start">范围开始处的从零开始的索引。</param>
            /// <param name="count">范围中的元素数。</param>
            /// <returns>指定键的列表中的范围的元素。</returns>
            public static List<T> ListGetRange<T>(string key, int index, int count)
            {
                using (IRedisClient redis = GetClient())
                {
                    var c = redis.As<T>();
                    return c.Lists[key].GetRange(index, index + count - 1);
                }
            }
    
            /// <summary>
            /// 获取指定键的列表中的所有元素。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <returns>指定键的列表中的范围的元素。</returns>
            public static List<T> ListGetAll<T>(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    var c = redis.As<T>();
                    return c.Lists[key].GetRange(0, c.Lists[key].Count);
                }
            }
    
            /// <summary>
            /// 分页获取指定键的列表中的元素。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="pageIndex">指定的分页索引。</param>
            /// <param name="pageSize">指定的分页大小。</param>
            /// <returns>指定键的列表中的范围的元素。</returns>
            public static List<T> ListGetAll<T>(string key, int pageIndex, int pageSize)
            {
                int start = pageSize * (pageIndex - 1);
                return ListGetRange<T>(key, start, pageSize);
            }
    
            /// <summary>
            /// 设置指定键的列表的有效期。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <param name="datetime">有效期。</param>
            public static void ListSetExpire(string key, DateTime datetime)
            {
                using (IRedisClient redis = GetClient())
                {
                    redis.ExpireEntryAt(key, datetime);
                }
            }
    
            #endregion
    
            #region 集合...
    
            /// <summary>
            /// 将一个或多个元素加入到集合指定的键中,已经存在于集合的元素将被忽略。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            public static void SetAdd<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    redisTypedClient.Sets[key].Add(t);
                }
            }
    
            /// <summary>
            /// 获取指定的键的集合中实际包含的元素数。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <returns>指定的键的集合中实际包含的元素数。</returns>
            public static int SetCount<T>(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    return redisTypedClient.Sets[key].Count();
                }
            }
    
            /// <summary>
            /// 确定某项是否在指定键的集合中。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <returns>如果存在该项,则为 true;否则为 false。</returns>
            public static bool SetContains<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    return redisTypedClient.Sets[key].Contains(t);
                }
            }
    
            /// <summary>
            /// 从指定键的集合中移除特定对象的第一个匹配项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <returns>如果移除成功,则为 true;否则为 false。</returns>
            public static bool SetRemove<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    return redisTypedClient.Sets[key].Remove(t);
                }
            }
    
            /// <summary>
            /// 获取指定键的数据集的所有项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <returns>指定键的数据集的所有项</returns>
            public static IList<T> SetGetAll<T>(string key)
            {
                List<T> result = new List<T>();
                using (IRedisClient redis = GetClient())
                {
                    var redisTypedClient = redis.As<T>();
                    var sets = redisTypedClient.Sets[key];
    
                    if (sets != null && sets.Count > 0)
                    {
                        foreach (var item in sets)
                        {
                            result.Add(item);
                        }
                    }
                }
                return result;
            }
    
            #endregion
    
            #region 哈希表...
    
            /// <summary>
            /// 确定某项是否在指定键的哈希表中。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="dataKey">数据项的键。</param>
            /// <returns>如果存在该项,则为 true;否则为 false。</returns>
            public static bool HashSetContains<T>(string key, string dataKey)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.HashContainsEntry(key, dataKey);
                }
            }
    
            /// <summary>
            /// 设置指定的项到指定键的哈希表中。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="dataKey">数据项的键。</param>
            /// <returns>如果设置成功,则为 true;否则为 false。</returns>
            public static bool HashSetAdd<T>(string key, string dataKey, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    string value = JsonSerializer.SerializeToString(t);
                    return redis.SetEntryInHash(key, dataKey, value);
                }
            }
    
            /// <summary>
            /// 移除哈希表中指定键的项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="dataKey">数据项的键。</param>
            /// <returns>如果移除成功,则为 true;否则为 false。</returns>
            public static bool HashSetRemove(string key, string dataKey)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.RemoveEntryFromHash(key, dataKey);
                }
            }
    
            /// <summary>
            /// 移除哈希表中的所有项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="dataKey">数据项的键。</param>
            /// <returns>如果移除成功,则为 true;否则为 false。</returns>
            public static bool HashSetRemoveAll(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.Remove(key);
                }
            }
    
            /// <summary>
            /// 获取哈希表中的指定键的项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="dataKey">数据项的键。</param>
            /// <returns>指定键的哈希表的项。</returns>
            public static T HashSetGet<T>(string key, string dataKey)
            {
                using (IRedisClient redis = GetClient())
                {
                    string value = redis.GetValueFromHash(key, dataKey);
                    return JsonSerializer.DeserializeFromString<T>(value);
                }
            }
    
            /// <summary>
            /// 获取指定键的哈希表的所有项。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <returns>指定键的哈希表的所有项。</returns>
            public static List<T> HashSetGetAll<T>(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    var list = redis.GetHashValues(key);
                    if (list != null && list.Count > 0)
                    {
                        List<T> result = new List<T>();
                        foreach (var item in list)
                        {
                            var value = JsonSerializer.DeserializeFromString<T>(item);
                            result.Add(value);
                        }
                        return result;
                    }
                    return null;
                }
            }
    
            /// <summary>
            /// 设置指定键的哈希表的有效期。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <param name="expire">指定的有效期时间(单位:分钟)。</param>
            public static void HashSetExpire(string key, int expire)
            {
                using (IRedisClient redis = GetClient())
                {
                    redis.ExpireEntryAt(key, DateTime.Now.Add(TimeSpan.FromMinutes(expire)));
                }
            }
    
            #endregion
    
            #region 有序集合...
    
            /// <summary>
            /// 添加指定项到指定键的有序集合。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <returns>如果成功添加,则为 true;否则为 false。</returns>
            public static bool SortedSetAdd<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    string value = JsonSerializer.SerializeToString<T>(t);
                    return redis.AddItemToSortedSet(key, value);
                }
            }
    
    
            /// <summary>
            /// 添加指定项到指定键的有序集合,评分用于排序。如果该元素已经存在,则根据评分更新该元素的顺序。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <param name="score">用于排序的评分值。</param>
            /// <returns>如果成功添加,则为 true;否则为 false。</returns>
            public static bool SortedSetAdd<T>(string key, T t, double score)
            {
                using (IRedisClient redis = GetClient())
                {
                    string value = JsonSerializer.SerializeToString<T>(t);
                    return redis.AddItemToSortedSet(key, value, score);
                }
            }
    
            /// <summary>
            /// 从指定键的有序集合中移除指定的元素。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <returns>如果成功移除,则为 true;否则为 false。</returns>
            public static bool SortedSetRemove<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    string value = ServiceStack.Text.JsonSerializer.SerializeToString<T>(t);
                    return redis.RemoveItemFromSortedSet(key, value);
                }
            }
    
            /// <summary>
            /// 从指定键的有序集合尾部移除指定的索引后的匹配项。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <param name="size">保留的条数。</param>
            /// <returns>移除的元素数量。</returns>
            public static int SortedSetTrim(string key, int size)
            {
                using (IRedisClient redis = GetClient())
                {
                    return (int)redis.RemoveRangeFromSortedSet(key, size, 9999999);
                }
            }
    
            /// <summary>
            /// 获取指定的键的有序集合中实际包含的元素数。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <returns>指定的键的有序集合中实际包含的元素数。</returns>
            public static int SortedSetCount(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    return (int)redis.GetSortedSetCount(key);
                }
            }
    
            /// <summary>
            /// 分页获取指定键的有序集合中的元素。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="pageIndex">指定的分页索引。</param>
            /// <param name="pageSize">指定的分页大小。</param>
            /// <returns>指定键的有序集合中的元素集合。</returns>
            public static List<T> SortedSetGetList<T>(string key, int pageIndex, int pageSize)
            {
                using (IRedisClient redis = GetClient())
                {
                    var list = redis.GetRangeFromSortedSet(key, (pageIndex - 1) * pageSize, pageIndex * pageSize - 1);
                    if (list != null && list.Count > 0)
                    {
                        List<T> result = new List<T>();
                        foreach (var item in list)
                        {
                            var data = ServiceStack.Text.JsonSerializer.DeserializeFromString<T>(item);
                            result.Add(data);
                        }
                        return result;
                    }
                }
                return null;
            }
    
    
            /// <summary>
            /// 获取指定键的有序集合中的所有元素。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <returns>指定键的有序集合中的元素集合。</returns>
            public static List<T> SortedSetGetListALL<T>(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    var list = redis.GetRangeFromSortedSet(key, 0, 9999999);
                    if (list != null && list.Count > 0)
                    {
                        List<T> result = new List<T>();
                        foreach (var item in list)
                        {
                            var data = JsonSerializer.DeserializeFromString<T>(item);
                            result.Add(data);
                        }
                        return result;
                    }
                }
                return null;
            }
    
            /// <summary>
            /// 设置指定键的有序集合的有效期。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <param name="expire">指定的有效期(单位:分钟)。</param>
            public static void SortedSetSetExpire(string key, int expire)
            {
                using (IRedisClient redis = GetClient())
                {
                    redis.ExpireEntryAt(key, DateTime.Now.Add(TimeSpan.FromMinutes(expire)));
                }
            }
    
            /// <summary>
            /// 获取指定键的有序集合中的指定元素的评分。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t">指定的项。</param>
            /// <returns>指定键的有序集合中的指定元素的评分。</returns>
            public static double SortedSetGetItemScore<T>(string key, T t)
            {
                using (IRedisClient redis = GetClient())
                {
                    var data = ServiceStack.Text.JsonSerializer.SerializeToString<T>(t);
                    return redis.GetItemScoreInSortedSet(key, data);
                }
            }
    
            #endregion
    
            #region 二进制...
    
            /// <summary>
            /// 设置 BitMap 值,返回 0 或 1 是成功,返回 -1 是失败。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <param name="offset">偏移量。</param>
            /// <param name="value">值只能是 0 或 1,其它的值会报错</param>
            /// <returns>返回 0 或 1 是成功,返回 -1 是失败。</returns>
            public static long BitSet(string key, int offset, int value)
            {
                using (IRedisClient redis = GetClient())
                {
                    var rc = redis as RedisClient;
                    if (rc != null)
                    {
                        return rc.SetBit(key, offset, value);
                    }
                    return -1;
                }
            }
    
            /// <summary>
            /// 获取 BitMap 值,返回 0 或 1 是成功,返回 -1 是失败。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <param name="offset">偏移量。</param>
            /// <returns>返回 0 或 1 是成功,返回 -1 是失败。</returns>
            public static long BitGet(string key, int offset)
            {
                using (IRedisClient redis = GetClient())
                {
                    var rc = redis as RedisClient;
                    if (rc != null)
                    {
                        return rc.GetBit(key, offset);
                    }
                    return -1;
                }
            }
    
            public bool ByteSet<T>(string key, T t)
            {
                bool result = false;
                if (t != null)
                {
                    MemoryStream ms = new MemoryStream();
                    Serialize(t, ms);
                    byte[] data = ms.ToArray();
                    using (IRedisClient redis = GetClient())
                    {
                        return redis.Set(key, data);
                    }
                }
                return result;
    
            }
    
            /// <summary>
            /// 写入一个实体类T,将其转换成二制进存储,并且数据过期时间一到则立刻删除
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <param name="t"></param>
            /// <param name="Expire"></param>
            /// <returns></returns>
            public bool ByteSetExpire<T>(string key, T t, DateTime Expire)
            {
                bool flag = false;
                if (t != null)
                {
                    MemoryStream ms = new MemoryStream();
                    Serialize<T>(t, ms);
                    byte[] data = ms.ToArray();
                    using (IRedisClient redis = GetClient())
                    {
                        TimeSpan ts = Expire - DateTime.Now;
                        flag = redis.Set(key, data, ts);
                    }
                }
                return flag;
            }
    
            /// <summary>
            /// 获取 key 值为 key 的实体类 T。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="key">指定的键。</param>
            /// <returns></returns>
            public T ByteGet<T>(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    byte[] data = redis.Get<byte[]>(key);
                    if (data == null || data.Length == 0)
                    {
                        return default(T);
                    }
                    using (MemoryStream ms = new MemoryStream())
                    {
                        ms.Write(data, 0, data.Length);
                        ms.Position = 0;
                        return Deserialize<T>(ms);
                    }
                }
            }
    
            #endregion
    
            #region 其他方法...
    
            /// <summary>
            /// 获取当前服务器中的所有 Key。
            /// </summary>
            /// <returns>当前服务器中的所有 Key 的集合。</returns>
            public static List<string> GetAllKeys()
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.GetAllKeys();
                }
            }
    
            /// <summary>
            /// 移除指定集合中的所有 Key。
            /// </summary>
            /// <param name="keys">指定的 Key 集合。</param>
            public static void RemoveAll(IEnumerable<string> keys)
            {
                using (IRedisClient redis = GetClient())
                {
                    redis.RemoveAll(keys);
                }
            }
    
            /// <summary>
            /// 确定指定的键是否在 Redis 数据库中。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <returns>若存在指定的键,则返回 true,否则返回 false。</returns>
            public static bool ContainsKey(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.ContainsKey(key);
                }
            }
    
            /// <summary>
            /// 获取当前数据库服务器中的指定的 Key。
            /// </summary>
            /// <param name="key">指定的键。</param>
            /// <returns>若移除指定的键成功,则返回 true,否则返回 false。</returns>
            public static bool Remove(string key)
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.Remove(key);
                }
            }
    
            /// <summary>
            /// 获取当前 Redis 信息。
            /// </summary>
            /// <returns>当前 Redis 信息。</returns>
            public Dictionary<string, string> GetInfo()
            {
                using (IRedisClient redis = GetClient())
                {
                    return redis.Info;
                }
            }
    
            /// <summary>
            /// 将指定的对象序列化成二进制对象。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="obj">指定的对象。</param>
            /// <param name="stream">序列化的二进制对象。</param>
            private static void Serialize<T>(T obj, Stream stream)
            {
                if (stream == null)
                    throw new ArgumentNullException("stream");
                var formatter = new BinaryFormatter();
                formatter.Serialize(stream, obj);
            }
    
            /// <summary>
            /// 将指定的二进制对象反序列化成对象。
            /// </summary>
            /// <typeparam name="T">指定的项类型。</typeparam>
            /// <param name="obj">指定的对象。</param>
            /// <param name="stream">序列化的二进制对象。</param>
            /// <returns>反序列化的对象。</returns>
            public static T Deserialize<T>(Stream stream)
            {
                if (stream == null)
                    throw new ArgumentNullException("stream");
    
                var formatter = new BinaryFormatter();
                return (T)formatter.Deserialize(stream);
            }
    
            #endregion
    
        }
    

      

  • 相关阅读:
    childNodes.length和form.length的不同
    外部样式表声明的样式并不会进入style对象
    js之insertBefore(newElement,oldElement)
    文字不换行,超出部分显示成省略号
    animation和transition做动画的区别
    html中隐藏一个元素的方法
    css常见属性和属性值
    css选择器的优先级
    frameset怎么框架内部跳转
    form表单标签及属性的介绍
  • 原文地址:https://www.cnblogs.com/weisenz/p/2434850.html
Copyright © 2020-2023  润新知