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 ...
随机推荐
- bat延迟执行脚本,利用choice实现定时执行功能
choice是选择语句,具体语法另外再讲.今天利用它来实现定时执行功能.废话少说直接上代码: 示例一: @echo off for %%a in (我 是 一 个 中 国 人) do ping -n ...
- 关于SQLite数据库 字段 DateTime 类型
这两天刚接触SQLite 数据库 还没有太过于深入的了解 , 于是出现了一个问题 : 我在 C#中 ,使用SQLiteHelper 查询SQLite数据库数据时,报了这个错误: System.Form ...
- Golang 需要避免踩的 50 个坑(三)
前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...
- Eyoo大学生交友平台
团队简介 团队名称 golden express 队员学号列表 王伟 201731062214 刘冬 201731062227 张旭 201731062129 秦裕航 201731062432 (组长 ...
- Codeforces Round #590 (Div. 3) F
传送门 题意: 给出一个只含前\(20\)个字符的字符串,现在可以选择一段区间进行翻转,问区间中字符各不相同时,最长长度为多少. 思路: 首先,容易将题意转换为选择两个字符各不相同的区间,然后长度相加 ...
- 整合SpringTask实现定时任务
一.框架介绍 SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用. 二.Corn表达式 概述 Cron表达式是一个字符串,包括 ...
- RaxML使用
1.下载 https://github.com/stamatak/standard-RAxML 2.How many Threads shall I use? 重要的是要知道,RAxML PThrea ...
- 从Java官网下载最新的文档(包含API文档)
Java学习资料(适合c转java的同学): Java中带包(创建及引用)的类的编译 - 小明快点跑 JAVA 对象引用,以及对象赋值 - 飘来荡去. Java官网下载页:https://www.or ...
- CSP-S考前救急(考试前还是别复习了,事实证明复习了也没考到...
“不要为明天而忧虑,因为明天自有明天的忧虑:一天的难处一天当就够了.” 念念不忘,必有回响. 考试结束前15分钟停止写代码.然后按照以下顺序进行检查: -检查文件名是否写错-检查是否打开文件输入输出 ...
- SVN+vs2017
安装VirtualSvn Server https://www.visualsvn.com/ 安装visualsvn到VS2017 https://www.visualsvn.com/visualsv ...