C# 通过ServiceStack 操作Redis

 更新时间:2021年3月13日 15:00  点击:1446

作       者 : 明志德道

1.引用Nuget包 ServiceStack.Redis

我这里就用别人已经封装好的Reids操作类来和大家一起参考了下,看看怎么使用ServiceStack.Redis 操作Redis数据

RedisConfigInfo--redis配置文件信息

 /// <summary>
 /// redis配置文件信息
 /// 也可以放到配置文件去
 /// </summary>
 public sealed class RedisConfigInfo
 {
  /// <summary>
  /// 可写的Redis链接地址
  /// format:ip1,ip2
  /// 
  /// 默认6379端口
  /// </summary>
  public string WriteServerList = "127.0.0.1:6379";
  /// <summary>
  /// 可读的Redis链接地址
  /// format:ip1,ip2
  /// </summary>
  public string ReadServerList = "127.0.0.1:6379";
  /// <summary>
  /// 最大写链接数
  /// </summary>
  public int MaxWritePoolSize = 60;
  /// <summary>
  /// 最大读链接数
  /// </summary>
  public int MaxReadPoolSize = 60;
  /// <summary>
  /// 本地缓存到期时间,单位:秒
  /// </summary>
  public int LocalCacheTime = 180;
  /// <summary>
  /// 自动重启
  /// </summary>
  public bool AutoStart = true;
  /// <summary>
  /// 是否记录日志,该设置仅用于排查redis运行时出现的问题,
  /// 如redis工作正常,请关闭该项
  /// </summary>
  public bool RecordeLog = false;
 }

RedisManager --Redis管理中心   创建Redis链接

 /// <summary>
 /// Redis管理中心 创建Redis链接
 /// </summary>
 public class RedisManager
 {
  /// <summary>
  /// redis配置文件信息
  /// </summary>
  private static RedisConfigInfo RedisConfigInfo = new RedisConfigInfo();

  /// <summary>
  /// Redis客户端池化管理
  /// </summary>
  private static PooledRedisClientManager prcManager;

  /// <summary>
  /// 静态构造方法,初始化链接池管理对象
  /// </summary>
  static RedisManager()
  {
   CreateManager();
  }

  /// <summary>
  /// 创建链接池管理对象
  /// </summary>
  private static void CreateManager()
  {
   string[] WriteServerConStr = RedisConfigInfo.WriteServerList.Split(',');
   string[] ReadServerConStr = RedisConfigInfo.ReadServerList.Split(',');
   prcManager = new PooledRedisClientManager(ReadServerConStr, WriteServerConStr,
        new RedisClientManagerConfig
        {
         MaxWritePoolSize = RedisConfigInfo.MaxWritePoolSize,
         MaxReadPoolSize = RedisConfigInfo.MaxReadPoolSize,
         AutoStart = RedisConfigInfo.AutoStart,
        });
  }

  /// <summary>
  /// 客户端缓存操作对象
  /// </summary>
  public static IRedisClient GetClient()
  {
   return prcManager.GetClient();
  }
 }

RedisBase-- 是redis操作的基类,继承自IDisposable接口,主要用于释放内存

/// <summary>
 /// RedisBase类,是redis操作的基类,继承自IDisposable接口,主要用于释放内存
 /// </summary>
 public abstract class RedisBase : IDisposable
 {
  public IRedisClient iClient { get; private set; }
  /// <summary>
  /// 构造时完成链接的打开
  /// </summary>
  public RedisBase()
  { 
   iClient = RedisManager.GetClient();
  }

  //public static IRedisClient iClient { get; private set; }
  //static RedisBase()
  //{
  // iClient = RedisManager.GetClient();
  //}


  private bool _disposed = false;
  protected virtual void Dispose(bool disposing)
  {
   if (!this._disposed)
   {
    if (disposing)
    {
     iClient.Dispose();
     iClient = null;
    }
   }
   this._disposed = true;
  }
  public void Dispose()
  {
   Dispose(true);
   GC.SuppressFinalize(this);
  }

  public void Transcation()
  {
   using (IRedisTransaction irt = this.iClient.CreateTransaction())
   {
    try
    {
     irt.QueueCommand(r => r.Set("key", 20));
     irt.QueueCommand(r => r.Increment("key", 1));
     irt.Commit(); // 提交事务
    }
    catch (Exception ex)
    {
     irt.Rollback();
     throw ex;
    }
   }
  }


  /// <summary>
  /// 清除全部数据 请小心
  /// </summary>
  public virtual void FlushAll()
  {
   iClient.FlushAll();
  }

  /// <summary>
  /// 保存数据DB文件到硬盘
  /// </summary>
  public void Save()
  {
   iClient.Save();//阻塞式save
  }

  /// <summary>
  /// 异步保存数据DB文件到硬盘
  /// </summary>
  public void SaveAsync()
  {
   iClient.SaveAsync();//异步save
  }
 }

RedisStringService--String类型操作帮助类

 /// <summary>
 /// key-value 键值对:value可以是序列化的数据
 /// </summary>
 public class RedisStringService : RedisBase
 {
  #region 赋值
  /// <summary>
  /// 设置key的value
  /// </summary>
  public bool Set<T>(string key, T value)
  {
   //iClient.Db =2;
   return base.iClient.Set<T>(key, value);
  }
  /// <summary>
  /// 设置key的value并设置过期时间
  /// </summary>
  public bool Set<T>(string key, T value, DateTime dt)
  {
   //iClient.Db = 2;
   return base.iClient.Set<T>(key, value, dt);
  }
  /// <summary>
  /// 设置key的value并设置过期时间
  /// </summary>
  public bool Set<T>(string key, T value, TimeSpan sp)
  {
   //iClient.Db = 2;
   return base.iClient.Set<T>(key, value, sp);
  }
  /// <summary>
  /// 设置多个key/value 可以一次保存多个key value ---多个key value 不是分多次,是一个独立的命令;
  /// </summary>
  public void Set(Dictionary<string, string> dic)
  {
   //iClient.Db = 2;
   base.iClient.SetAll(dic);
  }

  #endregion

  #region 追加
  /// <summary>
  /// 在原有key的value值之后追加value,没有就新增一项
  /// </summary>
  public long Append(string key, string value)
  {
   return base.iClient.AppendToValue(key, value);
  }
  #endregion

  #region 获取值
  /// <summary>
  /// 获取key的value值
  /// </summary>
  public string Get(string key)
  {
   return base.iClient.GetValue(key);
  }
  /// <summary>
  /// 获取多个key的value值
  /// </summary>
  public List<string> Get(List<string> keys)
  {
   return base.iClient.GetValues(keys);
  }
  /// <summary>
  /// 获取多个key的value值
  /// </summary>
  public List<T> Get<T>(List<string> keys)
  {
   return base.iClient.GetValues<T>(keys);
  }
  #endregion

  #region 获取旧值赋上新值
  /// <summary>
  /// 获取旧值赋上新值
  /// </summary>
  public string GetAndSetValue(string key, string value)
  {
   return base.iClient.GetAndSetValue(key, value);
  }
  #endregion

  #region 辅助方法
  /// <summary>
  /// 获取值的长度
  /// </summary>
  public long GetLength(string key)
  {
   return base.iClient.GetStringCount(key);
  }
  /// <summary>
  /// 自增1,返回自增后的值 保存的是10 调用后,+1 返回11
  /// </summary>
  public long Incr(string key)
  {
   return base.iClient.IncrementValue(key);
  }
  /// <summary>
  /// 自增count,返回自增后的值 自定义自增的步长值
  /// </summary>
  public long IncrBy(string key, int count)
  {
   return base.iClient.IncrementValueBy(key, count);
  }
  /// <summary>
  /// 自减1,返回自减后的值,Redis操作是单线程操作;不会出现超卖的情况
  /// </summary>
  public long Decr(string key)
  {
   return base.iClient.DecrementValue(key);
  }
  /// <summary>
  /// 自减count ,返回自减后的值
  /// </summary>
  /// <param name="key"></param>
  /// <param name="count"></param>
  /// <returns></returns>
  public long DecrBy(string key, int count)
  {
   return base.iClient.DecrementValueBy(key, count);
  }
  #endregion
 }

nuget包是外国人写的,在国内并没有完整的中文文档,也没有专门的人来翻译、封装它,所以上面的代码方法不是很全,还有很多api方法需要自己去官网找然后自己封装。

在这里,上面的封装我就放一边,还是给大家演示ServiceStack原生的API如何使用

2. string 类型的使用

     public static RedisClient client = new RedisClient("127.0.0.1", 6379);

    //1.存入键值对
    bool a = client.Set("key_name", "value_11");
    //2. 根据key获取值
    string data1= client.GetValue("key_name");
    //3. 在原有的value上进行追加
    long data2 = client.AppendToValue("key_name", "value_11");
    // 4.获取值的长度
    var data3=client.GetStringCount("key_name");
    //5. 数值自增/减,返回自增、自减后的值
    client.Set("小明分数", 100);
    //自增20,可以自增负值
    var data4= client.IncrementValueBy("小明分数", 20);
    //自减50
    var data5 = client.DecrementValueBy("小明分数", 50);
    //6. 插入实体和读取实体
    UserInfo userInfo = new UserInfo() { Id = 3, Age = 50, Name = "zxl", Pwd = "123456" };
    client.Set("UserInfo_Id_3", userInfo);   
    UserInfo data6 = client.Get<UserInfo>("UserInfo_Id_3");
    //7. 一次性添加多个key-value集合
    Dictionary<string, string> dic = new Dictionary<string, string>() {
     { "101", Guid.NewGuid().ToString("N")},
     { "102", Guid.NewGuid().ToString("N")},
     { "103", Guid.NewGuid().ToString("N")},
     { "104", Guid.NewGuid().ToString("N")},
     { "105", Guid.NewGuid().ToString("N")},
     { "106", Guid.NewGuid().ToString("N")}
    };    
    client.SetAll(dic);
    //8.获取多个key的 value值集合
    List<string> keys = new List<string>(){ "101", "103", "105" };
    List<string> data8= client.GetValues(keys);

    //9. 重命名key
    client.Rename("106", "1066");
    //10. 设置key的过期时间(30秒后自动销毁)
    bool b2= client.Expire("102", 30);

    //11. 删除单个key
    bool d1 = client.Remove("101");//删除成功,返回true
    bool d2 = client.Remove("ffff"); //删除不存在的数据,返回false

//13.清除全部数据 请小心
client.FlushAll();

以上就是C# 通过ServiceStack 操作Redis的详细内容,更多关于C# ServiceStack 操作Redis的资料请关注猪先飞其它相关文章!

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • Redis连接池配置及初始化实现

    这篇文章主要介绍了Redis连接池配置及初始化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25