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 ...
随机推荐
- tcp_tw_recycle参数引发的数据库连接异常
[问题描述] 开发反馈有个应用在后端数据库某次计划性重启后经常会出现数据库连接异常问题,通过监控系统的埋点数据,发现应用连接数据库异常有两类表现: 其一:连接超时 131148.00ms To ...
- Skyshop.Detail Maps
Secondary Maps(Detail Maps) & Detail Mask 增加模型细节,而不需要使用单张的超大贴图. 应用:增加皮肤细节,比如毛孔:砖墙添加细小的裂缝和青苔:大型金属 ...
- 设备树的规范(dts)
设备树的官方文档: https://www.devicetree.org/specifications/ 一.理论部分 如何看下面这张图: 1)从根节点开始看起,即 / 2)在根节点中有属性以及设备节 ...
- Ansible 自动化运维工具
Ansible 自动化运维工具 Ansible是什么? Ansible是一个"配置管理工具"也是一个"自动化运维工具" Ansible 作用: Ansible是 ...
- ssh 到服务器然后输入中文保存到本地变成乱码
很有可能是 默认的编码导致的 尝试执行 echo $LANG 如果是 en_US vim 输入中文有较大概率是 GBK 编码 尝试把这个加入到 ~/.bashrc export LANG=zh_CN. ...
- poi基本使用
poi基本使用 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi< ...
- Failed to register dubbo:
无法把dubbo注册到zookeeper,我的错误原因是引入的curator的版本过高,curator中会引入zookeeper,而dubbo的版本又过低,所以无法注册进zookeeper,把cura ...
- javascript专题系列--尾调用和尾递归
最近在看<冴羽的博客>,讲真,确实受益匪浅,已经看了javascript 深入系列和专题系列的大部分文章,可是现在才想起来做笔记.所以虽然很多以前面试被问得一脸懵逼的问题都被“一语惊醒梦中 ...
- 生成指定python项目中所有的依赖文件
一. pipreqs工具 这个工具的好处是可以通过对项目目录的扫描,自动发现使用了那些类库,自动生成依赖清单. 缺点是可能会有些偏差,需要检查并自己调整下. 安装: pip install pipre ...
- 洛谷 P4053 [JSOI2007]建筑抢修
传送门 思路 首先题意比较容易明白: n个建筑需要修复,只能同时修一个建筑,每个建筑修复需要t1时间,且必须在t2时间前修完,否则此建筑报废 问最多能修好多少个建筑 如果一个建筑在规定时间内没有修好的 ...