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. Apache Derby-01介绍DERBY

    1.DERBY是什么: Apache Derby 是IBM于2004年贡献给Apache软件基金会的数据库,于2005年正式成为开源项目,Derby作为一个基于JAVA的关系型数据库框架,他拥有许多便 ...

  2. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  3. The fourth day of Crawler learning

    爬取58同城 from bs4 import BeautifulSoupimport requestsurl = "https://qd.58.com/diannao/35200617992 ...

  4. redis 本地安装

    1.redis介绍 Redis是有名的NoSql数据库,一般Linux都会默认支持.但在Windows环境中,可能需要手动安装设置才能有效使用.简单介绍一下Windows下Redis服务的安装方法. ...

  5. Python学习3月5号【python编程 从入门到实践】---》笔记(3)4

    1.字典 #####修改字典里面的KEYS数值和VALUES数值要用中括号# alien_0={'color':'green','point':5}# alien_0['color']='red'# ...

  6. 「SP25784」BUBBLESORT - Bubble Sort 解题报告

    SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...

  7. 你确定你了解什么是linux系统?

    1.什么是linux发行版 就Linux的本质来说,它只是操作系统的核心,负责控制硬件.管理文件系统.程序进程等,并不给用户提供各种工具和应用软件.所谓工欲善其事,被必先利其器,一套在优秀的操作系统核 ...

  8. Ant Design框架中不同的组件访问不同的models中的数据

    Ant Design框架中不同的组件访问不同的models中的数据 本文记录了我在使用该框架的时候踩过的坑,方便以后查阅. 一.models绑定 在某个组件(控件或是页面),要想从某个models中获 ...

  9. 如何修改Docker已运行实例的端口映射

    如何修改Docker已运行实例的端口映射 Docker的端口映射,往往出现在两个阶段需要处理: 1.是在docker启动前就已经确定好,哪个docker实例映射哪个端口(往往这个情况比较,需要提前做规 ...

  10. React Native的缓存和下载

    一般我们有3种数据需要缓存和下载:纯文本(比如API返回,状态标记等),图片缓存和其他静态文件. 纯文本 纯文本还是比较简单的,RN官方模块AsyncStorage就够了.它就跟HTML5里面的Loc ...