• asp.net redis 实战


    当开始用    var result=new RedisClient("127.0.0.1",6379,1"1111");  这个helper ,后面有并发之后就一直提示超时问题。

    后面改为连接池(集群的方式)

    /// <summary>
    /// 连接客户端管理
    /// </summary>
    private static PooledRedisClientManager prcm;

    /// <summary>
    /// 创建链接池管理对象
    /// </summary>
    public static PooledRedisClientManager CreateManager()
    {
    string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");
    string[] readServerList = SplitString(redisConfigInfo.ReadServerList, ",");

    return new PooledRedisClientManager(writeServerList, readServerList,
    new RedisClientManagerConfig
    {
    MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,
    MaxReadPoolSize = redisConfigInfo.MaxReadPoolSize,
    DefaultDb = redisConfigInfo.InitalDb,
    AutoStart = redisConfigInfo.AutoStart,
    }); //, redisConfigInfo.InitalDb
    }

    /// <summary>
    /// 客户端缓存操作对象
    /// </summary>
    public static IRedisClient GetClient()
    {
    if (OpenRedis)
    {
    if (prcm == null)
    {
     prcm = CreateManager();
    }

    return prcm.GetClient();
    }
    return null;
    }

    但发现用同一个还是连接池并发大还是有问题,从日志上面看

    Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use.
    异常信息:System.TimeoutException: Redis Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use.

    could not connect to redis Instance at 127.0.0.1:6379
    异常信息:ServiceStack.Redis.RedisException: could not connect to redis Instance at 127.0.0.1:6379 ---> System.Net.Sockets.SocketException: 在一个非套接字上尝试了一个操作。 127.0.0.1:6379

    后面在网上查找的时候看到使用using 的方法。 跟连接数据库一样的道理,还有开多线程会报错,要加local锁

    RedisConfigInfo类

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Web;

    namespace Cache.Redis
    {
    /// <summary>
    /// 获取redis配置的类
    /// </summary>
    public sealed class RedisConfigInfo:ConfigurationSection
    {
    public static RedisConfigInfo GetConfig()
    {
    var section = (RedisConfigInfo)System.Configuration.ConfigurationManager.GetSection("RedisConfig");
    return section;
    }
    public static RedisConfigInfo GetConfig(string sectionName)
    {
    var section = (RedisConfigInfo)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 WriteServerList
    {
    get
    {
    return (string)base["WriteServerList"];
    }

    set {
    base["WriteServerList"] = value;
    }
    }

    /// <summary>
    /// 可读的Redis链接地址,它一般由多个服务器组件,一般称为从服务器(slave),各个服务器之间用逗号分开
    /// </summary>
    [ConfigurationProperty("ReadServerList", IsRequired = false)]
    public string ReadServerList
    {
    get
    {
    return (string)base["ReadServerList"];
    }

    set
    {
    base["ReadServerList"] = value;
    }
    }

    /// <summary>
    /// 最大写链接数
    /// </summary>
    [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)]
    public int MaxWritePoolSize
    {
    get
    {
    return (int)base["MaxWritePoolSize"];
    }

    set
    {
    base["MaxWritePoolSize"] = value;
    }
    }

    /// <summary>
    /// 初始化哪个库
    /// </summary>
    [ConfigurationProperty("InitalDb", IsRequired = false)]
    public long InitalDb
    {
    get
    {
    return (long)base["InitalDb"];
    }

    set
    {
    base["InitalDb"] = value;
    }
    }

    /// <summary>
    /// 最大写链接数
    /// </summary>
    [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)]
    public int MaxReadPoolSize
    {
    get
    {
    return (int)base["MaxReadPoolSize"];
    }

    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("LocalCacheTime", IsRequired = false, DefaultValue = 36000)]
    public int LocalCacheTime
    {
    get
    {
    return (int)base["LocalCacheTime"];
    }

    set
    {
    base["LocalCacheTime"] = value;
    }
    }

    /// <summary>
    /// 是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项
    /// </summary>
    [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)]
    public bool RecordeLog
    {
    get
    {
    return (bool)base["RecordeLog"];
    }

    set
    {
    base["RecordeLog"] = value;
    }
    }

    /// <summary>
    /// 超时时间
    /// </summary>
    [ConfigurationProperty("PoolTimeOutSeconds", IsRequired = false, DefaultValue = 5000)]
    public int PoolTimeOutSeconds
    {
    get
    {
    return (int)base["PoolTimeOutSeconds"];
    }

    set
    {
    base["PoolTimeOutSeconds"] = value;
    }
    }

    }
    }

    RedisOperatorBase类

    using ServiceStack.Redis;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace Cache.Redis
    {
    /// <summary>
    /// Redis回收类
    /// </summary>
    public abstract class RedisOperatorBase : IDisposable
    {
    protected static object lockobj = new object();

    private bool _disposed = false;
    protected RedisOperatorBase()
    {
    }
    protected virtual void Dispose(bool disposing)
    {
    if (!this._disposed)
    {
    if (disposing)
    {
    }
    }
    this._disposed = true;
    }
    public void Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(this);
    }
    /// <summary>
    /// 保存数据DB文件到硬盘
    /// </summary>
    public void Save()
    {
    }
    /// <summary>
    /// 异步保存数据DB文件到硬盘
    /// </summary>
    public void SaveAsync()
    {
    }


    }
    }

    RedisManager  redis管理的类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using ServiceStack.Redis;

    namespace Cache.Redis
    {
    /// <summary>
    /// redis管理的类
    /// </summary>
    public class RedisManager
    {
    public static bool OpenRedis = System.Configuration.ConfigurationManager.AppSettings["OpenRedis"] == null ? false : Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["OpenRedis"]);
    /// <summary>
    /// redis配置文件信息
    /// </summary>
    private static RedisConfigInfo redisConfigInfo = RedisConfigInfo.GetConfig();


    /// <summary>
    /// 创建链接池管理对象
    /// </summary>
    public static PooledRedisClientManager CreateManager()
    {
    string[] writeServerList = SplitString(redisConfigInfo.WriteServerList, ",");
    string[] readServerList = SplitString(redisConfigInfo.ReadServerList, ",");

    return new PooledRedisClientManager(writeServerList, readServerList,
    new RedisClientManagerConfig
    {
    MaxWritePoolSize = redisConfigInfo.MaxWritePoolSize,
    MaxReadPoolSize = redisConfigInfo.MaxReadPoolSize,
    DefaultDb = redisConfigInfo.InitalDb,
    AutoStart = redisConfigInfo.AutoStart,
    }); //, redisConfigInfo.InitalDb
    }


    /// <summary>
    /// 得到连接数组
    /// </summary>
    /// <param name="strSource"></param>
    /// <param name="split"></param>
    /// <returns></returns>

    private static string[] SplitString(string strSource, string split)
    {
    return strSource.Split(split.ToArray());
    }

    }
    }

    Redis string get set的类

    using ServiceStack.Redis;
    using ServiceStack.Text;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace Cache.Redis
    {
    /// <summary>
    /// redis的string
    /// </summary>
    public class RedisStringOperator : RedisOperatorBase
    {

    public RedisStringOperator() : base() { }
    /// <summary>
    ///redis的string 存值
    /// </summary>
    public bool Set<T>(string key, T t)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.Set(key, t);
    }
    }

    }

    /// <summary>
    /// redis的string存值
    /// </summary>
    public bool Set<T>(string key, T t, DateTime expiresAt)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.Set(key, t, expiresAt);
    }
    }

    //return Redis.Set(key, t, expiresAt);
    }



    /// <summary>
    /// 存值
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    public bool Set(string key, string value)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.Set<string>(key, value);
    }
    }

    }
    /// <summary>
    /// 移除
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public bool Remove(string key)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.Remove(key);
    }
    }
    }
    /// <summary>
    /// 取值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="key"></param>
    /// <returns></returns>
    public T Get<T>(string key)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return default(T);
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.Get<T>(key);
    }
    }


    }

    /// <summary>
    /// 设置缓存过期
    /// </summary>
    public bool SetExpire(string key, DateTime datetime)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.ExpireEntryAt(key, datetime);
    }
    }
    }


    }
    }

    RedisHash的类

    using ServiceStack.Text;
    using System;
    using System.Collections.Generic;

    namespace Cache.Redis
    {
    public class RedisHashOperator : RedisOperatorBase
    {
    public RedisHashOperator() : base() { }
    /// <summary>
    /// 判断某个数据是否已经被缓存
    /// </summary>
    public bool ExistHashContainsEntry(string hashId, string key)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.HashContainsEntry(hashId, key);
    }
    }
    }
    /// <summary>
    /// 存储数据到hash表
    /// </summary>
    public bool SetInHash<T>(string hashId, string key, T t)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    var value = JsonSerializer.SerializeToString<T>(t);
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.SetEntryInHash(hashId, key, value);
    }
    }
    }

    /// <summary>
    /// 存储数据到hash表
    /// </summary>
    /// <param name="hashId"></param>
    /// <param name="key"></param>
    /// <param name="t"></param>
    /// <returns></returns>
    public bool SetInHash(string hashId, string key, string value)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.SetEntryInHash(hashId, key, value);
    }
    }
    }

    /// <summary>
    /// 移除hash中的某值
    /// </summary>
    public bool RemoveFromHash(string hashId, string key)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return true;
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.RemoveEntryFromHash(hashId, key);
    }
    }
    }
    ///// <summary>
    ///// 移除整个hash
    ///// </summary>
    //public static bool Remove(string key)
    //{
    // return Redis.Remove(key);
    //}

    /// <summary>
    /// 从hash表获取数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="hashId"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public T GetFromHash<T>(string hashId, string key)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return default(T);
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    string value = redieclient.GetValueFromHash(hashId, key);
    return JsonSerializer.DeserializeFromString<T>(value);
    }
    }

    //string value = Redis.GetValueFromHash(hashId, key);
    //return JsonSerializer.DeserializeFromString<T>(value);
    }

    /// <summary>
    /// 从hash表获取数据
    /// </summary>
    /// <param name="hashId"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static string GetFromHash(string hashId, string key)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return "";
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.GetValueFromHash(hashId, key);
    }
    }
    }


    /// <summary>
    /// 获取整个hash的数据
    /// </summary>
    public static List<T> GetAllFromHash<T>(string hashId)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return new List<T>();
    }
    var result = new List<T>();
    lock (lockobj)
    {

    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    var list = redieclient.GetHashValues(hashId);
    if (list != null && list.Count > 0)
    {
    list.ForEach(x =>
    {
    var value = JsonSerializer.DeserializeFromString<T>(x);
    result.Add(value);
    });
    }

    }
    }
    return result;
    }

    /// <summary>
    /// 根据hash获取keys
    /// </summary>
    /// <param name="hashId"></param>
    /// <returns></returns>
    public static List<string> GetHashKeys(string hashId)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return new List<string>();
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.GetHashKeys(hashId);
    }
    }
    }


    /// <summary>
    /// 获取整个hash的数据
    /// </summary>
    public static List<string> GetAllFromHash(string hashId)
    {
    if (!Cache.Redis.RedisManager.OpenRedis)
    {
    return new List<string>();
    }
    lock (lockobj)
    {
    using (var redieclient = RedisManager.CreateManager().GetClient())
    {
    return redieclient.GetHashValues(hashId);
    }
    }

    }

    }
    }

    比如string的set方法

    <configSections>
    <!--redis缓存-->
    <section name="RedisConfig" type="Cache.Redis.RedisConfigInfo,Cache" />
    </configSections>
    <!--ServiceStack.Redis 4.0以后的版本的格式 password@IP:port?&db=1&ssl=true&client=aaa&password=123&namespaceprefix=vvv&connecttimeout=10&sendtimeout=10&receivetimeout=10&retrytimeout=10&idletimeout=10-->
    <!--redis缓存 写入地址(如果没有密码则不用@以及@之前的值,如127.0.0.1:6379,有密码则51sole@127.0.0.1:6379) 读的地址 默认数据库是第几个 最大超时时间(秒) 最大写链接数 最大读的链接数 是否自动重启 缓存时间 是否写入日志 -->
    <RedisConfig WriteServerList="127.0.0.1:6379" ReadServerList="127.0.0.1:6379" InitalDb="3" PoolTimeOutSeconds="5000" MaxWritePoolSize="5" MaxReadPoolSize="5" AutoStart="true" LocalCacheTime="180" RecordeLog="false">
    </RedisConfig>

    string的 get 和set方法

    //
    // GET: /RedisTest/
    public ActionResult Index()
    {
    Cache.Redis.RedisStringOperator redistring = new Cache.Redis.RedisStringOperator();
    redistring.Set("test", 1);
    return View();
    }

    public ActionResult GetRedisValue()
    {
    Cache.Redis.RedisStringOperator redistring = new Cache.Redis.RedisStringOperator();
    redistring.Get<int>("test");
    }


  • 相关阅读:
    A站C值电影列表 4月27号更新
    【dmp文件还原到oralce数据库】
    批量上传图片
    Repeater嵌套
    生成json格式
    C#汉字转为Unicode编码
    Jquery+json绑定带层次下拉框(select控件)
    Asp.net绑定带层次下拉框(select控件)
    从数据库里面取值绑定到Ztree
    根据参数显示类别(三级联动,需要JSON数据)
  • 原文地址:https://www.cnblogs.com/zhian/p/5669964.html
Copyright © 2020-2023  润新知