ServiceStack.Redis简单封装
首先创建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简单封装的更多相关文章
- ServiceStack.Redis高效封装和简易破解
1.ServiceStack.Redis封装 封装的Redis操作类名为RedisHandle,如下代码块(只展示部分代码),它的特点: 1)使用连接池管理连接,见代码中的PooledClientMa ...
- DotNet Core 使用 StackExchange.Redis 简单封装和实现分布式锁
前言 公司的项目以前一直使用 CSRedis 这个类库来操作 Redis,最近增加了一些新功能,会存储一些比较大的数据,内测的时候发现其中有两台服务器会莫名的报错 Unexpected respons ...
- redis数据库操作的C++简单封装
用c++简单封装了redis的基本操作(hiredis) 接口包括:①链接和断开连接.②设置键值对(set).③查询键值对(get).④删除键值对(del).⑤将所有键显示出来 若任何一处发生错误,返 ...
- 用C#封装的ServiceStack.redis操作类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Redis客户端ServiceStack.Redis的简单使用
在nuget中下载ServiceStack.Redis,但是运行之后会出现一个问题: Exception: "Com.JinYiWei.Cache.RedisHelper"的类型初 ...
- 『性能』ServiceStack.Redis 和 StackExchange.Redis 性能比较
背景 近来,需要用到 Redis 这类缓存技术 —— MongoDB 和 Redis 没有进行过比较. 我也懒得在这些细节上 纠结那么多 —— 按照网友给出的文章,听从网友建议,选择 Redis. R ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- C# Redis分布式锁(基于ServiceStack.Redis)
相关的文章其实不少,我也从中受益不少,但是还是想自己梳理一下,毕竟自己写的更走心! 首先给出一个拓展类,通过拓展方法实现加锁和解锁. 注:之所以增加拓展方法,是因为合理使用拓展类(方法),可以让程序更 ...
- .Net使用Redis详解之ServiceStack.Redis(七)
序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习. Redi ...
随机推荐
- Phoenix 无法启动报错: java.net.BindException: Address already in use
一.问题描述 i. 登录Ambari发现有一个节点的 Phoenix 无法启动 ii. 在Ambari上点击“Start”,监控 Phoenix 日志文件 iii. Phoenix 日志如下: [ro ...
- 【分布式搜索引擎】Elasticsearch之开启Elasticsearch的用户名密码验证
一.首先在elasticsearch配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启 xpack.security.ena ...
- Jenkins-Master-slave架构(八)
一.增加slave节点 1.1 查看当前节点 系统管理-节点管理 1.2 新建节点 1.3 配置节点信息 可以选择只允许运行绑定到这台机器的job 1.4 保存后,使节点上线即可. 二.配置任务 ...
- http异步通信
get 请求1)创建一个XMLHttpRequest对象2)调用该对象的open方法3)如果是get请求,设置回调函数onreadystatechange = callback4)Send如果是pos ...
- ReportMachine打印条形码的问题
ReportMachine打印条形码的问题 最近用RM报表来打印条形码,调试过程非常顺利,扫描枪识别也很正常,唯独斑马打印机的走纸不准确是个问题,正好客户不想用这种纸型,并定制了新纸型,心想等新纸型到 ...
- java web问题总结
1.java web上传附图页面空,无返回 原因:前端页面与后台端口不一致,无页面可返回 2.上传excel导入数据时,只能导入第一条,后面的数据无法导入,缓存设置过小.
- 通过Socket实现TCP编程(十二)
原文链接:https://www.cnblogs.com/hysum/p/7531529.html Socket通信 : TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 基于TCP ...
- [RN] React-Native中Array渲染的优化
React-Native中Array渲染的优化 例如用Push加进去的数据: constructor(props){ super(props); this.state = { b ...
- 第02组 Beta冲刺(4/4)
队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...
- 推荐一款运动步行App爱步行
推荐一款运动步行App爱步行 1 介绍 爱步行,是一款倡导健步运动.绿色生活.提升散步乐趣的APP,让大众在享受运动的同时,让用户的每一步都能产生价值.爱步行以步数为基础,用户在每天的行走过程中,可以 ...