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 ...
随机推荐
- The listener supports no services oracle注册监听
问题登场: [oracle@my-e450 ~]$ lsnrctl status …… The listener supports no servicesThe command completed s ...
- Mysql时区无法识别
Unable to connect to database. Tried 1 times {:error_message=>“Java::JavaSql::SQLException: The s ...
- python中杀死线程
有时候有这样的需要,在某种情况下,需要在主线程中杀死之前创建的某个线程,可以使用下面的方法,通过调用python内置API,在线程中抛出异常,使线程退出. import threading impor ...
- Python之flask框架2
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档,大部分代码引用自官方文档. 安装flask 首先我们来安装F ...
- 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 模块初始: Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相 ...
- python在windows系统上创建文件
正确方法为:open("test1.txt",'wb')或open("test1.txt",'w') 以下是网上的方法创建遇到的问题 使用Python2.7在w ...
- 【JSP】${pageContext.request.contextPath}
取出部署的应用程序名或者是当前的项目名称 http://localhost:8080/demo1/a.jsp ${pageContext.request.contextPath}或<%=req ...
- flutter:Could not download kotlin-gradle-plugin.jar
我们可以看到是flutter的外部依赖:kotlin-gradle-plugin-1.2.71 下载不了,下面我介绍使用手动下载的方式去解决: 首先,看到flutter项目目录,注意我标出的是运行项目 ...
- CF908G New Year and Original Order(DP,数位 DP)
又一次降智…… (数位 DP 原来可以写这么短,学到了) 问题可以转化为求数位中 $\ge k$ 的有恰好 $j$ 位的数的个数.设为 $c_{j,k}$. 那么答案就是:(考虑把 $k$ 的贡献拆开 ...
- [LeetCode] 322. Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...