软件编程
位置:首页>> 软件编程>> C#编程>> C# 通过ServiceStack 操作Redis

C# 通过ServiceStack 操作Redis

作者:明志德道  发布时间:2023-12-13 06:18:01 

标签:C#,ServiceStack,Redis
目录
  • 1.引用Nuget包 ServiceStack.Redis

  • 2. string 类型的使用

作       者 : 明志德道

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 类型的使用

C# 通过ServiceStack 操作Redis


    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);

C# 通过ServiceStack 操作Redis

C# 通过ServiceStack 操作Redis


   //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

C# 通过ServiceStack 操作Redis


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

C# 通过ServiceStack 操作Redis

来源:https://www.cnblogs.com/for-easy-fast/p/14527233.html

0
投稿

猜你喜欢

  • 我们知道多线程因为同时处理子线程的能力,对于程序运行来说,能够达到很高的效率。不过很多人对于多线程的执行方法还没有尝试过,本篇我们将为大家介
  • 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错。为了更便于使用,笔者整
  • 本文实例讲述了Java中的异常和处理机制。分享给大家供大家参考,具体如下:简介程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期
  • @Conditional的使用@Conditional可以根据条件来判断是否注入某些Bean。package com.morris.spri
  • 本文实例讲述了.net的序列化与反序列化的实现方法。分享给大家供大家参考。具体方法如下:1.序列化与反序列化概述C#中如果需要:将一个结构很
  • hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们
  • 本文实例讲述了C#域名解析简单实现方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
  • @Transactional是我们在用Spring时候几乎逃不掉的一个注解,该注解主要用来声明事务。它的实现原理是通过Spring AOP在
  •  MyBatis介绍MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software
  • Remote Debug 综述当我们的后台项目部署到服务器上时,由于环境和本地不同,有时候也会有一些奇奇怪怪的问题出现。只依赖服务器上的日志
  • 又忙了一周,事情差不多解决了,终于有可以继续写我的博客了(各位看官久等了)。这次我们来谈一谈Java里的一个很有意思的东西——回调。什么叫回
  • 最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指
  • 我们深知在操作Java流对象后要将流关闭,但往往事情不尽人意,大致有以下几种不能一定将流关闭的写法:1.在try中关流,而没在finally
  • 本文实例为大家分享了springboot实现异步任务的具体代码,供大家参考,具体内容如下1.什么异步任务同步:一定要等任务执行完了,得到结果
  • ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它
  • 在hibernate5中,有了一些新的变动:  新引导 APISpatial/GIS 支持Java 8 支持扩展 AUTO
  • 什么是接口?说到接口,USB大家肯定不陌生~接口是一种标准、规范.注意:接口一旦制定好,使用者和实现者都必须遵循的标准.接口的语法: (JD
  • 本文实例为大家分享了java + dom4j.jar提取xml文档内容的具体代码,供大家参考,具体内容如下资源下载页:点击下载本例程主要借助
  • 首先,确保 IDEA 软件正确安装完成,Java 开发工具包 JDK 安装完成。IDEA 的 Java 项目 (Project) 则相当于
  • @Bean修饰的方法参数的注入方法参数默认注入方式为Autowired,即先根据类型匹配,若有多个在根据名称进行匹配。1:复杂类型可以通过@
手机版 软件编程 asp之家 www.aspxhome.com