Redis 通用方法 存储DataTable DataRow DataSet
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using ServiceStack.Redis;
using System.Data; namespace Utils
{
public static class HttpCache<T>
{
#region Redis
//redis IP地址
private static string RedisIP = System.Configuration.ConfigurationSettings.AppSettings["RedisIP"];
//redis密码(不填表示没有密码)
private static string RedisPassword = System.Configuration.ConfigurationSettings.AppSettings["RedisPassword"];
//redis端口(不填默认6379)
private static int RedisPort = Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["RedisPort"]);
//redis库索引号(整数,默认有5个库,从0开始,不填表示0)
private static int DbIndex = Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["RedisDbIndex"]);
//redis 是否使用缓存开关
private static int isOpenCache = Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings["IsOpenRedis"]); private static PooledRedisClientManager prcm = CreateManager(
new string[] { (RedisPassword.Trim() == string.Empty ? "" : RedisPassword + "@") + RedisIP + ":" + RedisPort + " " },
new string[] { (RedisPassword.Trim() == string.Empty ? "" : RedisPassword + "@") + RedisIP + ":" + RedisPort + " " });
private static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
{
// 支持读写分离,均衡负载
RedisClientManagerConfig clientConfig = new RedisClientManagerConfig(); clientConfig.MaxWritePoolSize = ;
clientConfig.MaxReadPoolSize = ;
clientConfig.AutoStart = true;
clientConfig.DefaultDb = DbIndex;
PooledRedisClientManager clientManager = new PooledRedisClientManager(readWriteHosts, readOnlyHosts, clientConfig);
return clientManager;
} /// <summary>
/// 是否使用缓存开关
/// </summary>
private static bool IsOpenCache
{
get
{
if (isOpenCache != ) return false;
return true;
}
} /// <summary>
/// 加入缓存
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="key">Key(键值命名规范:RK_字段名_表名_条件字段1_值_条件字段n_值......,键值全部小写,表名不加dbo前缀)</param>
/// <param name="value">对象</param>
/// <param name="Timer">缓存时间(除了XianZhiAccounts的过期时间为一小时,其余的过期时间都为两天)</param>
/// <returns>是否缓存成功</returns>
/// 对于datatable 的缓存 需要特殊处理
public static bool SaveCaChe(string key, T value)
{
bool result = false;
try
{
if (IsOpenCache)
{
if (!(value is DataTable) && !(value is DataSet) && !(value is DataRow))
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<T>(key, value, DateTime.Now.AddHours());
}
}
else
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<byte[]>(key, SetBytesFormT(value), DateTime.Now.AddHours());
}
}
}
}
catch { }
return result;
}
public static bool SaveCaChe(string key, T value, int Timer)
{
bool result = false;
try
{
if (IsOpenCache)
{
if (!(value is DataTable) && !(value is DataSet) && !(value is DataRow))
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<T>(key, value, TimeSpan.FromMinutes(Timer));
}
}
else
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<byte[]>(key, SetBytesFormT(value), DateTime.Now.AddHours());
}
}
}
}
catch { }
return result;
}
public static bool SaveBaseCaChe(string key, T value)
{
bool result = false;
try
{
if (IsOpenCache)
{
if (!(value is DataTable) && !(value is DataSet) && !(value is DataRow))
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<T>(key, value, DateTime.Now.AddHours());
}
}
else
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<byte[]>(key, SetBytesFormT(value), DateTime.Now.AddHours());
}
}
}
}
catch { }
return result;
}
public static bool SaveBaseCaChe(string key, T value, int Timer)
{
bool result = false;
try
{
if (IsOpenCache)
{
if (!(value is DataTable) && !(value is DataSet) && !(value is DataRow))
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<T>(key, value, TimeSpan.FromMinutes(Timer));
}
}
else
{
using (IRedisClient Redis = prcm.GetClient())
{
result = Redis.Set<byte[]>(key, SetBytesFormT(value), TimeSpan.FromMinutes(Timer));
}
}
}
}
catch { }
return result;
} /// <summary>
/// 获取缓存内容
/// </summary>
/// <param name="key">Key</param>
/// <returns></returns>
public static T GetCaChe(string key)
{
try
{
if (!IsOpenCache) return default(T);
using (IRedisClient Redis = prcm.GetClient())
{
return Redis.Get<T>(key);
}
}
catch
{
string str = string.Empty;
return default(T);
}
}
public static T GetBaseCaChe(string key)
{
try
{
if (!IsOpenCache) return default(T);
using (IRedisClient Redis = prcm.GetClient())
{
return Redis.Get<T>(key);
}
}
catch
{
string str = string.Empty;
return default(T);
}
}
/// <summary>
/// 对于datatable 的缓存 需要特殊处理
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static T GetBaseCaChe<T>(string key) where T : class
{
try
{
if (!IsOpenCache) return default(T);
if (!(typeof(T).ToString() == "System.Data.DataTable")
&& !(typeof(T).ToString() == "System.Data.DataSet")
&& !(typeof(T).ToString() == "System.Data.DataRow"))
{
using (IRedisClient Redis = prcm.GetClient())
{
return Redis.Get<T>(key);
}
}
else
{
using (IRedisClient Redis = prcm.GetClient())
{
byte[] buffer = Redis.Get<byte[]>(key);
return GetObjFromBytes(buffer) as T;
}
}
}
catch
{
string str = string.Empty;
return default(T);
}
} /// <summary>
/// 删除缓存
/// </summary>
/// <param name="key">Key</param>
/// <returns></returns>
public static bool DeleteCache(string key)
{
try
{
if (!IsOpenCache) return false;
using (IRedisClient Redis = prcm.GetClient())
{
return Redis.Remove(key);
}
}
catch { return false; }
} /// <summary>
/// 批量删除缓存
/// </summary>
/// <param name="keys">Key</param>
/// <returns></returns>
public static void DeleteCache(List<string> keys)
{
try
{
if (!IsOpenCache) return;
using (IRedisClient Redis = prcm.GetClient())
{
Redis.RemoveAll(keys);
}
}
catch { return; }
} /// <summary>
/// 清空缓存
/// </summary>
public static void ClearCache()
{
try
{
if (!IsOpenCache) return;
using (IRedisClient Redis = prcm.GetClient())
{
Redis.FlushAll();
}
}
catch { return; }
}
/// <summary>
/// 是否包含KEY缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool IsContain(string key)
{
try
{
if (!IsOpenCache) return false;
using (IRedisClient Redis = prcm.GetClient())
{
return Redis.ContainsKey(key);
}
}
catch { return false; }
} public static byte[] SetBytesFormT(T t)
{
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
formatter.Serialize(ms, t);//把DataSet对象序列化到内存流
byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
ms.Close();//关闭内存流对象
ms.Dispose();//释放资源
return buffer;
} private static object GetObjFromBytes(byte[] buffer)
{
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer))
{
stream.Position = ;
System.Runtime.Serialization.IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
Object reobj = bf.Deserialize(stream);
return reobj;
}
}
#endregion
}
}
公司统一走redis缓存,也将之前的memcache迁移到redis
碰到问题是redis的dataset缓存。
memcache底层封装了dataset的序列化。
而redis引的DLL包,未支持。所以封装一个类,提供dataset的set,get功能。
dataset以转为byte[]保存,读取byte[] 转为dataset
Redis 通用方法 存储DataTable DataRow DataSet的更多相关文章
- DataTable,DataSet,DataRow与DataView
DataTable和DataSet可以看做是数据容器,比如你查询数据库后得到一些结果,可以放到这种容器里,那你可能要问:我不用这种容器,自己读到变量或数组里也一样可以存起来啊,为什么用容器?原因是,这 ...
- DataSet & DataTable &DataRow 深入浅出
本篇文章适合有一定的基础的人去查看 ,最好学习过一定net 编程基础在来查看此文章. 1.概念 DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖 ...
- DataTable数据赋值给Model通用方法
注:该文属本人原创,今后项目中发现该方法存在BUG会实时更新,转载记得附上原文出处,方便大家获得最新代码. 相信大家在做项目中,经常会根据不同的表new各种不同的Model,当需要对Model进行实例 ...
- php Session存储到Redis的方法
当然要写先安装php的扩展,可参考这篇文章:Redis及PHP扩展安装 修改php.ini的设置 复制代码 代码如下: session.save_handler = redis session.sav ...
- .NET基础架构方法—DataTableToExcel通用方法
p { display: block; margin: 3px 0 0 0; } --> .NET架构基础方法—DataTableToExcel通用方法(NPOI) 今天封装DataTaleTo ...
- 精简Docker镜像的五种通用方法
http://dockone.io/article/8163 精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而 ...
- 【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)
DataTable与Excel之间的互导 1.项目添加NPOI的引用 NPOI项目简介: NPOI是一个开源的C#读写Excel.WORD等微软OLE2组件文档的项目,特点是可以在没有安装Office ...
- datatable和dataset的区别
DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表.插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库,DataT ...
- .Net中List<T> 泛型转成DataTable、DataSet
在开发过程过程中有时候需要将List<T>泛型转换成DataTable.DataSet,可以利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. 1.List<T& ...
随机推荐
- Python基础入门必备知识
1 标识符标识符是编程时使用的名字,用于给变量.函数.语句块等命名,Python 中标识符由字母.数字.下划线组成,不能以数字开头,区分大小写. 以下划线开头的标识符有特殊含义,单下划线开头的标识符, ...
- 【一起学源码-微服务】Ribbon 源码一:Ribbon概念理解及Demo调试
前言 前情回顾 前面文章已经梳理清楚了Eureka相关的概念及源码,接下来开始研究下Ribbon的实现原理. 我们都知道Ribbon在spring cloud中担当负载均衡的角色, 当两个Eureka ...
- fiddler 手机 https 抓包
fiddler手机抓包原理fiddler手机抓包的原理与抓pc上的web数据一样,都是把fiddler当作代理,网络请求走fiddler,fiddler从中拦截数据,由于fiddler充当中间人的角色 ...
- 你的IDEA过期了?跃哥四大招帮你稳住
作者:Dimple Solgan:当你的才华还无法撑起你的野心时候,那应该静下心来好好学习 前天晚上在群里风风火火组建了两个学习小组,一个是面向Java初学,一个是面向Python初学,把我搞的兴奋不 ...
- Dubbo RPC调用参数校验---错误message自动返回
Dubbo 的RPC调用中Consumer 和 Provider端都可以对调用的方法做传参验证,参数的验证可以通过JSR303规范 (Java Specification Requests) 提到的 ...
- 用Decorator实现依赖注入,像Java一样写后台
最近闲来无事,突发奇想,也顺便练练手,于是就萌生了,能否用typescript的decorator写一个Nodejs SpringMVC,通过依赖注入,自动实现文件加载,实例化等.然后就有了这个项目. ...
- 深入浅出 JVM 系列(一)什么是 JVM?它处于什么位置?
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- Http GetPost网络请求
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System ...
- Go Web 编程之 程序结构
概述 一个典型的 Go Web 程序结构如下,摘自<Go Web 编程>: 客户端发送请求: 服务器中的多路复用器收到请求: 多路复用器根据请求的 URL 找到注册的处理器,将请求交由处理 ...
- 悄摸直播(一)—— 推流器的实现(获取笔记本摄像头画面,转流推流到rtmp服务器)
悄摸直播 -- JavaCV实现本机摄像头画面远程直播 推流器 一.功能说明 获取pc端的摄像头流数据 + 展示直播效果 + 推流到rtmp服务器 二.代码实现 /** * 推流器 * @param ...