首先创建RedisConfig配置类

   #region 单例模式
//定义单例实体
private static RedisConfig _redisConfig = null; /// <summary>
/// 获取本逻辑类单例
/// </summary>
/// <returns></returns>
public static RedisConfig GetInstence()
{
if (_redisConfig == null)
{
_redisConfig = new RedisConfig();
}
return _redisConfig;
}
#endregion public RedisConfig()
{
WriteServerList = ConfigurationManager.AppSettings["WriteServerList"];
ReadServerList = ConfigurationManager.AppSettings["ReadServerList"];
MaxWritePoolSize = ConvertHelper.ToInt0(ConfigurationManager.AppSettings["MaxWritePoolSize"]);
MaxReadPoolSize = ConvertHelper.ToInt0(ConfigurationManager.AppSettings["MaxReadPoolSize"]);
AutoStart = ConfigurationManager.AppSettings["AutoStart"] == "true";
LocalCacheTime = ConvertHelper.ToInt0(ConfigurationManager.AppSettings["LocalCacheTime"]);
RecordeLog = ConfigurationManager.AppSettings["RecordeLog"] == "false";
} /// <summary>
/// 可写的Redis链接地址
/// </summary>
public string WriteServerList
{
get; set;
} /// <summary>
/// 可读的Redis链接地址
/// </summary>
public string ReadServerList
{
get;
set;
} /// <summary>
/// 最大写链接数
/// </summary>
public int MaxWritePoolSize
{
get;
set;
} /// <summary>
/// 最大读链接数
/// </summary>
public int MaxReadPoolSize
{
get;
set;
} /// <summary>
/// 自动重启
/// </summary>
public bool AutoStart
{
get;
set;
} /// <summary>
/// 本地缓存到期时间,单位:秒
/// </summary>
public int LocalCacheTime
{
get;
set;
} /// <summary>
/// 是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项
/// </summary>
public bool RecordeLog
{
get;
set;
} /// <summary>
/// 默认db
/// </summary>
public int DefaultDb
{
get;
set;
}
}

  

再创建一个操作工具类

public class RedisHelper
{
private int _isSafeModal = 0; #region 单例模式
private RedisHelper() { }
public static readonly RedisHelper Instance = new RedisHelper(); private RedisHelper(int isSafeModal = 0)
{
this._isSafeModal = isSafeModal;
}
#endregion /// <summary>
/// redis配置文件信息
/// </summary>
private readonly RedisConfig _redisConfigInfo = RedisConfig.GetInstence();
/// <summary>
/// 链接池管理对象
/// </summary>
private static PooledRedisClientManager _prcm; private static string[] SplitString(string strSource, string split)
{
return strSource.Split(split.ToArray());
} /// <summary>
/// 客户端缓存操作对象
/// </summary>
public IRedisClient GetClient()
{
if (_prcm == null)
_prcm = CreateManager();
return _prcm.GetClient();
} /// <summary>
/// 创建链接池管理对象
/// </summary>
private 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,
AutoStart = _redisConfigInfo.AutoStart,
//DefaultDb = _redisConfigInfo.DefaultDb,
DefaultDb = _isSafeModal == 1 ? 1 : _redisConfigInfo.DefaultDb
});
}
#region 获取指定key的缓存对象
/// <summary>
/// 获取指定key的缓存对象
/// </summary>
/// <typeparam name="T">泛型对象</typeparam>
/// <param name="key">缓存key</param>
/// <returns>返回指定对象</returns>
public T Get<T>(string key)
{
//链接Redis缓存管理对象
using (var redisClient = GetClient())
{
return redisClient.Get<T>(key.ToLower());
}
} /// <summary>
/// 获取指定key的缓存对象
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="isGetMinDate">缓存key</param>
/// <returns>返回指定对象</returns>
public DateTime GetDateTime(string key, bool isGetMinDate = true)
{
//链接Redis缓存管理对象
using (var redisClient = GetClient())
{
try
{
var dt = redisClient.Get<DateTime>(key);
if (dt == new DateTime(01, 01, 01))
{
if (isGetMinDate)
return DateTimeHelper.GetMinDate(); return DateTime.Now; }
return dt;
}
catch
{
if (isGetMinDate)
return DateTimeHelper.GetMinDate(); return DateTime.Now;
}
}
}
#endregion #region 设置缓存对象
/// <summary>
/// 设置缓存对象——默认一天后超时
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="value">指定对象值</param>
public void Set<T>(string key, T value)
{
//链接Redis缓存管理对象
using (var redisClient = GetClient())
{
redisClient.Set(key.ToLower(), value, DateTime.Now.AddDays(1));
}
} /// <summary>
/// 设置缓存对象
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="value">指定对象值</param>
/// <param name="expiresAt">有效时间</param>
public void Set<T>(string key, T value, DateTime expiresAt)
{
//链接Redis缓存管理对象
using (var redisClient = GetClient())
{
redisClient.Set(key.ToLower(), value, expiresAt);
}
} /// <summary>
/// 设置缓存对象
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="value">指定对象值</param>
/// <param name="expiresIn">有效时间</param>
public void Set<T>(string key, T value, TimeSpan expiresIn)
{
//链接Redis缓存管理对象
using (var redisClient = GetClient())
{
redisClient.Set(key.ToLower(), value, expiresIn);
}
} /// <summary>
/// 设置缓存对象
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="value">指定对象值</param>
/// <param name="timeout">有效时间</param>
public void Set<T>(string key, T value, int timeout)
{
Set<T>(key, value, new TimeSpan(0, 0, 0, timeout));
} /// <summary>
/// 设置缓存过期
/// </summary>
/// <param name="key"></param>
/// <param name="timeout"></param>
public bool SetExpire(string key, int timeout)
{
using (var redis = GetClient())
{
return redis.ExpireEntryIn(key.ToLower(), new TimeSpan(0, 0, timeout));
}
}
#endregion #region 删除指定缓存对象
/// <summary>
/// 清空所有缓存
/// </summary>
public void FlushAll()
{
//链接Redis缓存管理对象
using (var redisClient = GetClient())
{
redisClient.FlushDb();
}
} /// <summary>
/// 删除指定缓存对象
/// </summary>
/// <param name="key">缓存key</param>
public void Delete(string key)
{
//链接Redis缓存管理对象
using (var redisClient = GetClient())
{
redisClient.Remove(key.ToLower());
}
}
#endregion }

  

把缓存配置放进配置文件:

    <!-- Redis缓存配置 -->
<add key="WriteServerList" value="xxxxxxxxxx" />
<add key="ReadServerList" value="xxxxxxxxxxxxxx" />
<add key="MaxWritePoolSize" value="" />
<add key="MaxReadPoolSize" value="" />
<add key="AutoStart" value="true" />
<add key="LocalCacheTime" value="" />
<add key="RecordeLog" value="false" />
<!--默认缓存放置位置 -->
<add key="DefaultDb" value="" />

配置思路: 连接池管理对象(PooledRedisClientManager)  、Redis客户端操作对象(使用接口IRedisClient)

      1.创建一个创建连接池管理对象(PooledRedisClientManager)

  

 private PooledRedisClientManager CreatePool()
{
string[] WriteList = config.Write.Split(new char[] { ','});
string[] ReadList = config.Read.Split(new char[] { ',' });
return new PooledRedisClientManager(WriteList, ReadList, new RedisClientManagerConfig
{
MaxReadPoolSize = config.MaxReadPoolSize,
MaxWritePoolSize = config.MaxWritePoolSize,
AutoStart = true,
DefaultDb= DefalutDb
});
}

      2.使用PooledRedisClientManager对象创建客户端缓存操作对象

  

 public IRedisClient GetRedis()
{
if (_prcm == null)
{
_prcm = CreatePool();
}
return _prcm.GetClient();
}

      3.创建连接池管理对象 、 客户端缓存操作对象创建完成后就可以用客户端缓存操作对象封装一些方法了0.0

 如:

  

  public T Get<T>(string key)
{
using (var redisClient = GetRedis())
{
return redisClient.Get<T>(key);
}

测试下

看看Redis

List类型

看下redis

刚搞Redis,理解有限,如有不对请不吝赐教~

ServiceStack.Redis简单封装的更多相关文章

  1. ServiceStack.Redis高效封装和简易破解

    1.ServiceStack.Redis封装 封装的Redis操作类名为RedisHandle,如下代码块(只展示部分代码),它的特点: 1)使用连接池管理连接,见代码中的PooledClientMa ...

  2. DotNet Core 使用 StackExchange.Redis 简单封装和实现分布式锁

    前言 公司的项目以前一直使用 CSRedis 这个类库来操作 Redis,最近增加了一些新功能,会存储一些比较大的数据,内测的时候发现其中有两台服务器会莫名的报错 Unexpected respons ...

  3. redis数据库操作的C++简单封装

    用c++简单封装了redis的基本操作(hiredis) 接口包括:①链接和断开连接.②设置键值对(set).③查询键值对(get).④删除键值对(del).⑤将所有键显示出来 若任何一处发生错误,返 ...

  4. 用C#封装的ServiceStack.redis操作类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. Redis客户端ServiceStack.Redis的简单使用

    在nuget中下载ServiceStack.Redis,但是运行之后会出现一个问题: Exception: "Com.JinYiWei.Cache.RedisHelper"的类型初 ...

  6. 『性能』ServiceStack.Redis 和 StackExchange.Redis 性能比较

    背景 近来,需要用到 Redis 这类缓存技术 —— MongoDB 和 Redis 没有进行过比较. 我也懒得在这些细节上 纠结那么多 —— 按照网友给出的文章,听从网友建议,选择 Redis. R ...

  7. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  8. C# Redis分布式锁(基于ServiceStack.Redis)

    相关的文章其实不少,我也从中受益不少,但是还是想自己梳理一下,毕竟自己写的更走心! 首先给出一个拓展类,通过拓展方法实现加锁和解锁. 注:之所以增加拓展方法,是因为合理使用拓展类(方法),可以让程序更 ...

  9. .Net使用Redis详解之ServiceStack.Redis(七)

    序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习. Redi ...

随机推荐

  1. Promise的三兄弟:all(), race()以及allSettled()

    摘要: 玩转Promise. 原文:Promise 中的三兄弟 .all(), .race(), .allSettled() 译者:前端小智 Fundebug经授权转载,版权归原作者所有. 从ES6 ...

  2. Git的认识与使用

    Git教程 https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576 Git与SVN区别 Git 不仅仅是个版本控制系统,它也是 ...

  3. tornado的请求与响应

    tornado请求与响应相关 一.配置文件config.py 中的settings 有哪些配置: debug:设置tornado是否工作再调试模式下,默认为false 即工作再生产模式下 true的特 ...

  4. Django RestFramework(DRF)类视图

    基础视图 1.基础函数视图(@api_view) DRF提供了一种函数基础视图来装饰Django的普通视图,我们可以使用request来接受请求和response响应.一个小例子: from rest ...

  5. jersey实现RESTful接口PUT方法JSON数据传递

    项目中使用的是org.json包 maven中的配置如下: xml <!-- https://mvnrepository.com/artifact/org.json/json --> &l ...

  6. super与this用法

    super注意点: 1.当super调用父类的构造方法,必须在构造方法的第一个: 2.super必须只能出现在子类的方法或者构造方法中: 3.super和this不能同时调用构造方法: 4.super ...

  7. c语言的布尔量

    #include <stdio.h> #include <stdbool.h> int main() { bool b = true; bool t = false; ; }

  8. 多线程(五)多线程同步_Event事件

    事件和互斥体同样属于内核同步对象,它和互斥体以及临界区在功能上有以下区别 前面的互斥体和临界区主要作用在于确保控制多个线程之间对共享资源访问,保证共享资源的完整性 事件主要作用是通知其它线程一个操作己 ...

  9. 20180711模拟赛T3——聚变

    文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...

  10. Codeforces.1029D.Isolation(DP 分块)

    题目链接 \(Description\) 给定长为\(n\)的序列\(A_i\)和一个整数\(K\).把它划分成若干段,满足每段中恰好出现过一次的数的个数\(\leq K\).求方案数. \(K\le ...