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& ...
随机推荐
- 【转载】你不知道的 console,让 JS 调试更简单
对于前端工程师,肯定不会对console陌生,但是,又能深入了解多少呢? Chrome控制台-开发者工具 windows按F12, MAC按Command + Option + C或Command + ...
- redis集群数据迁移txt版
./redis-trib.rb create --replicas 1 192.168.112.33:8001 192.168.112.33:8002 192.168.112.33:8003 192. ...
- win10纯净版安装及其常用软件集锦(2020新年湘岳阳万江波整理)
win10纯净版安装及其常用软件集锦 1.安装win10纯净版:链接:https://pan.baidu.com/s/1L9yl-LNxxDQbEN_TGswzcA 提取码:u0pt 2.安装WPS2 ...
- j接近50道经典SQL练习题,附建表SQL解题SQL
说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...
- swoole通往大神之路——swoole任务中心说明及进程任务架构搭建
Swoole多任务处理中心 如果你还不会用swoole就out了,swoole通往大神之路——swoole任务中心说明及进程任务架构搭建 教学视频: www.bilibili.com/video/av ...
- 删除centos自带的openjdk
[wj@master hadoop]$ rpm -qa | grep javajava-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64python-javapa ...
- 【原理】从零编写ILI9341驱动全过程(基于Arduino)
最近在淘宝入手了一块ILI9341彩色屏幕,支持320x240分辨率.之前一直很好奇这类单片机驱动的彩色屏幕的原理,就打算自己写一个驱动,从电流层面操控ILI9341屏幕.话不多说,我们开始吧( ̄▽ ̄ ...
- a标签点击触发 layer open 只显示背景解决
问题:公司网站突然说有个查看信息的点击不好使了,有时候点击无反应,但是href执行了,有时候弹出只有背景,不显示内容.网上找了a标签的各种方法尝试后,均不能解决. 代码:类似如下,method()方法 ...
- 干货!SQL性能优化,书写高质量SQL语句
写SQL语句的时候我们往往关注的是SQL的执行结果,但是是否真的关注了SQL的执行效率,是否注意了SQL的写法规范? 以下的干货分享是在实际开发过程中总结的,希望对大家有所帮助! 1. limit分页 ...
- Spring Cloud Eureka------详解
一 Eureka服务治理体系 1.1 服务治理 服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Cl ...