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的更多相关文章

  1. DataTable,DataSet,DataRow与DataView

    DataTable和DataSet可以看做是数据容器,比如你查询数据库后得到一些结果,可以放到这种容器里,那你可能要问:我不用这种容器,自己读到变量或数组里也一样可以存起来啊,为什么用容器?原因是,这 ...

  2. DataSet & DataTable &DataRow 深入浅出

    本篇文章适合有一定的基础的人去查看 ,最好学习过一定net 编程基础在来查看此文章. 1.概念 DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖 ...

  3. DataTable数据赋值给Model通用方法

    注:该文属本人原创,今后项目中发现该方法存在BUG会实时更新,转载记得附上原文出处,方便大家获得最新代码. 相信大家在做项目中,经常会根据不同的表new各种不同的Model,当需要对Model进行实例 ...

  4. php Session存储到Redis的方法

    当然要写先安装php的扩展,可参考这篇文章:Redis及PHP扩展安装 修改php.ini的设置 复制代码 代码如下: session.save_handler = redis session.sav ...

  5. .NET基础架构方法—DataTableToExcel通用方法

    p { display: block; margin: 3px 0 0 0; } --> .NET架构基础方法—DataTableToExcel通用方法(NPOI) 今天封装DataTaleTo ...

  6. 精简Docker镜像的五种通用方法

    http://dockone.io/article/8163 精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而 ...

  7. 【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)

    DataTable与Excel之间的互导 1.项目添加NPOI的引用 NPOI项目简介: NPOI是一个开源的C#读写Excel.WORD等微软OLE2组件文档的项目,特点是可以在没有安装Office ...

  8. datatable和dataset的区别

    DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表.插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库,DataT ...

  9. .Net中List<T> 泛型转成DataTable、DataSet

    在开发过程过程中有时候需要将List<T>泛型转换成DataTable.DataSet,可以利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. 1.List<T& ...

随机推荐

  1. mysql主从之binlog的工作模式

    一 三种模式介绍 1.1 查看mysql主库的binlog格式 binlog仅在主库设置即可,从库无需设置 binlog的默认方式为STATEMENT ( show variables like '% ...

  2. 曹工杂谈--使用mybatis的同学,进来看看怎么在日志打印完整sql吧,在数据库可执行那种

    前言 今天新年第一天,给大家拜个年,祝大家新的一年里,技术突突突,头发长长长! 咱们搞技术的,比较直接,那就开始吧.我给大家看看我demo工程的效果(代码下边会给大家的): 技术栈是mybatis/m ...

  3. mongodb安装及安装MongoDB报错Verify that you have sufficient privileges to start system services解决方法

    1.点击安装包mongodb-win32-x86_64-2012plus-4.2.2-signed进行安装 2.点击next 3.接受协议,点击next 4.点击自定义安装 选择安装路径,建议默认C盘 ...

  4. $vjudge-$基本算法专题题解

    考完期末又双叒回来刷普及题辣$kk$ 然后放个链接趴还是$QwQ$ [X]$A$ 因为是嘤文($bushi$所以放个题意趴$QwQ$ 就汉诺塔问题,只是说有四个塔$A,B,C,D$,要求输出有1-12 ...

  5. 一文详解滑动平均法、滑动平均模型法(Moving average,MA)

    任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI.算法.编程和大数据知识分享,以及免费的SSR节点和 ...

  6. 「洛谷P1198」 [JSOI2008]最大数 解题报告

    P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...

  7. 使用tushare 库查阅交易日历

    资料参考:https://tushare.pro/ 交易日历 接口:trade_cal描述:获取各大交易所交易日历数据,默认提取的是上交所 tushare的版本和更新: 执行命令: pip insta ...

  8. echo 传义序列

    echo 传义序列:\a 警示字符\b 退格\c 输出中忽略最后的换行符\f 清屏\n 换行\r 回车\t 水平制表符\v 垂直制表符\\ 反斜杠字符\0ddd 将字符表示成1到3位的八进制数值

  9. 关于AWD线下攻防的经验

    备份:     1.备份源码,使用图像化工具连接ssh后,我喜欢用winscp,         找到根目录后,直接右键后台下载就行.           找根目录这里,有时候比赛不给根目录位置,上次 ...

  10. 前端页面表格排序 jQuery Table 基础

    通常来说, 排序的方式有两种, 一种是我们在查询的时候就排好序,然后将数据渲染到前台页面上, 但是这样做有个弊端,就是在争对做好了缓存处理的系统, 在查询相同数据的时候进行排序,可能不能成功, 因为进 ...