C# 通过ServiceStack 操作Redis

 更新时间:2021年03月13日 10:35:36   作者:明志德道  
这篇文章主要介绍了C# 通过ServiceStack 操作Redis的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

作       者 : 明志德道

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的资料请关注脚本之家其它相关文章!

相关文章

  • C#微信开发第一章

    C#微信开发第一章

    这篇文章主要为大家详细介绍了C#微信开发第一章,很有参考价值和实用性,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • LINQ投影操作符Select与限制操作符where介绍

    LINQ投影操作符Select与限制操作符where介绍

    这篇文章介绍了LINQ投影操作符Select与限制操作符where,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#数据库操作类AccessHelper实例

    C#数据库操作类AccessHelper实例

    这篇文章主要介绍了C#数据库操作类AccessHelper实例,可实现针对access数据库的各种常见操作,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C# Winfrom实现Skyline画直线功能的示例代码

    C# Winfrom实现Skyline画直线功能的示例代码

    这篇文章主要介绍了C# Winfrom实现Skyline画直线功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • unity实现动态排行榜

    unity实现动态排行榜

    这篇文章主要为大家详细介绍了unity实现动态排行榜,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C#编程实现向并口设备发送指令、获取并口设备的状态

    C#编程实现向并口设备发送指令、获取并口设备的状态

    这篇文章主要介绍了C#编程实现向并口设备发送指令、获取并口设备的状态,本文直接给出实例代码,需要的朋友可以参考下
    2015-06-06
  • .NET操作NPOI实现Excel的导入导出

    .NET操作NPOI实现Excel的导入导出

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作,下面小编为大家介绍了如何操作NPOI实现Excel的导入导出,需要的可以参考一下
    2023-09-09
  • 超炫酷的WPF实现Loading控件效果

    超炫酷的WPF实现Loading控件效果

    这篇文章主要介绍了超炫酷的WPF实现Loading控件效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

    C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

    这篇文章主要介绍了C# 文件上传下载(Excel导入,多线程下载)功能的实现代码,需要的朋友可以参考下
    2017-08-08
  • C#如何使用Task类解决线程的等待问题

    C#如何使用Task类解决线程的等待问题

    这篇文章主要介绍了C#如何使用Task类解决线程的等待问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06

最新评论