公司统一走redis缓存,也将之前的memcache迁移到redis
碰到问题是redis的dataset缓存。

memcache底层封装了dataset的序列化。

而redis引的DLL包,未支持。所以封装一个类,提供dataset的set,get功能。

dataset以转为byte[]保存,读取byte[] 转为dataset

代码如下

   /// <summary>
/// 获取缓存(从2进制流)
/// </summary>
/// <param name="key">缓存键</param>
/// <returns></returns>
public static object Get(string key)
{
byte[] buffer = _redisClient.Get(key);
return GetObjFromBytes(buffer);
} /// <summary>
/// 从二进制流得到对象(dataset专用,dataset要序列化为二进制才可保存)
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
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;
}
} /// <summary>
/// 获取DATASET缓存
/// </summary>
/// <param name="key">缓存键</param>
/// <returns></returns>
public static DataSet GetMemByDataSet(string key)
{
var item = Get(key);
return (DataSet)item;
}
/// <summary>
/// 获取DATASET缓存(如果没有,则调用Func<T>方法返回对象并加入到缓存)
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="func">委托方法,返回指定对象类型,用于缓存不存在时回调该方法获取数据并插入到缓存</param>
/// <param name="minute">过期时间(分钟)</param>
/// <returns></returns>
public static DataSet GetMemByDataSet(string key, Func<DataSet> func, int minute)
{
DataSet item = GetMemByDataSet(key);
if (item == null)
{
item = func();
if (item != null)
{
SetMemByDataSet(key, item, minute);
}
}
return item;
}
/// <summary>
/// 插入DATASET缓存
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="item">缓存对象</param>
/// <param name="minute">过期时间(分钟)</param>
public static void SetMemByDataSet(string key, DataSet ds, int minute)
{
DateTime expiryTime = DateTime.Now.AddMinutes(minute);
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, ds);//把DataSet对象序列化到内存流
byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
ms.Close();//关闭内存流对象
ms.Dispose();//释放资源
_redisClient.Set(key, buffer, expiryTime);
} /// <summary>
/// 插入dictionary dataset缓存。
/// </summary>
/// <param name="key">redis保存键</param>
/// <param name="dicdss">Dictionary string 键 dataset 值 </param>
/// <param name="minute">缓存时间</param>
public static void SetDicDataSets(string key, Dictionary<string, DataSet> dicdss, int minute)
{
//dataset转为二进制流
Dictionary<string, byte[]> ndic = new Dictionary<string, byte[]>();
DateTime expiryTime = DateTime.Now.AddMinutes(minute);
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
foreach (var dsentry in dicdss)
{
formatter.Serialize(ms, dsentry.Value);//把DataSet对象序列化到内存流
byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
ndic.Add(dsentry.Key, buffer);
//清空流
ms.SetLength(); ms.Position = ;
}
ms.Close();//关闭内存流对象
ms.Dispose();//释放资源
_redisClient.Set(key, ndic, expiryTime);
} /// <summary>
/// 插入List. dictionary .dataset缓存。
/// </summary>
/// <param name="key">redis保存键</param>
/// <param name="dicdss">Dictionary string 键 dataset 值 </param>
/// <param name="minute">缓存时间</param>
public static void SetListDicDataSets(string key,List<Dictionary<string, DataSet>> Listdicdss, int minute)
{
DateTime expiryTime = DateTime.Now.AddMinutes(minute);
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
List<Dictionary<string, byte[]>> nlistdic=new List<Dictionary<string,byte[]>>();
System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
foreach (var dicdss in Listdicdss) {
//dataset转为二进制流
Dictionary<string, byte[]> ndic = new Dictionary<string, byte[]>();
foreach (var dsentry in dicdss)
{
formatter.Serialize(ms, dsentry.Value);//把DataSet对象序列化到内存流
byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
ndic.Add(dsentry.Key, buffer);
//清空流
ms.SetLength(); ms.Position = ;
}
nlistdic.Add(ndic);
}
ms.Close();//关闭内存流对象
ms.Dispose();//释放资源
_redisClient.Set(key, nlistdic, expiryTime);
}
/// <summary>
/// 得到Dictionary【string, DataSet】
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static List<Dictionary<string, DataSet>> GetListDicDataSets(string key)
{
List<Dictionary<string, DataSet>> resutl = new List<Dictionary<string, DataSet>>();
List<Dictionary<string, byte[]>> rebytes = Get<List<Dictionary<string, byte[]>>>(key);
foreach (var item in rebytes) { Dictionary<string, DataSet> dss = new Dictionary<string, DataSet>();
foreach (var itementry in item)
{
DataSet ds = (DataSet)GetObjFromBytes(itementry.Value);
dss.Add(itementry.Key, ds);
}
resutl.Add(dss);
}
return resutl;
}

redis保存dataset的更多相关文章

  1. Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  2. laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到

    laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...

  3. [PHP] Laravel使用redis保存SESSION

    Laravel使用redis保存SESSION 首先确认服务器已经安装redis服务,php安装了redis扩展. 1.打开config/database.php.在redis配置项中增加sessio ...

  4. 你的项目真的需要Session吗? redis保存session性能怎么样?

    在web开发中,Session这个东西一直都很重要,至少伴随我10年之久, 前一段时间发生一个性能问题,因为Redis session 问题,后来想想 其实我的项目session 是不需要的. 先看看 ...

  5. 在Tomat7上使用Redis保存Session

    源博客http://my.oschina.net/gccr/blog/321083 当用户量大.应用服务器使用集群来布署时,使用Tomcat默认自带的Session就不能满足需求了.当然解决方法有很多 ...

  6. php用redis保存session

    1.修改php.ini中session配置: ini_set('session.save_handler', 'redis');ini_set('session.save_path', 'tcp:// ...

  7. CentOS7下Nginx搭建反向代理,并使用redis保存session

    1.启动两个tomcat,端口分别为8080,8081 2.配置nginx,vim /usr/local/nginx/conf/nginx.conf 添加如下配置: 3.启动nginx或热加载 启动: ...

  8. linux系统中 redis 保存数据的5种形式 linux后端模式启动 jedis无法通过IP地址和端口号访问如何修改linux防火墙

    vim修改redis.conf配置文件(我的已经复制到虚拟机的/usr/local/redis/bin目录下)为daemonize yes, 以后端模式启动 ./redis-server redis. ...

  9. mysql表如何使用redis保存?

    mysql表: userid username password email 9 Lisi 111111 lisi@163.com 对应redis存储: 127.0.0.1:6379> set ...

随机推荐

  1. Salt常用命令二

    ############################模块############################ 查看模块列表——module salt ‘minion’  sys.list_mo ...

  2. luffy项目:基于vue与drf前后台分离项目(2)

    user模块User表 创建user模块 前提:在 luffy 虚拟环境下 1.终端从项目根目录进入apps目录 >: cd luffyapi & cd apps 2.创建app > ...

  3. Python笔记_第二篇_面向过程_第二部分_2.路径、栈和队列、内存修改

    这一部分分三个主题进行讲解,主要为后面的模块.包.第三方库的概念补充一些相关的内容. 1. 路径(Path): 相对路径和绝对路径. 举例1:我们先导入一个os库(模块)来观察一下路径 import ...

  4. CodeForces 992B Nastya Studies Informatics + Hankson的趣味题(gcd、lcm)

    http://codeforces.com/problemset/problem/992/B  题意: 给你区间[l,r]和x,y 问你区间中有多少个数对 (a,b) 使得 gcd(a,b)=x lc ...

  5. ubuntu Elasticsearch环境搭建

    https://www.cnblogs.com/pigzhu/p/4705870.html

  6. VS2010无法调试页面问题

    图片: VS2010报:未能将脚本调试器附加到计算机XXX上的进程iexplore.exe . 已附加了一个调试器”.启动调试失败. 解决:1.以管理员身份打开CMD; 2.运行:regsvr32.e ...

  7. Sex linkage

    I.8 Sex linkage 单倍体:性别决定基因(S\s)和与性别决定基因连锁的等位基因(A\a)存在于同一套遗传物质上,其配子结合和减数分裂图示如下: 如果性别是由染色体区域决定的,自然选择会避 ...

  8. 可用的 .net core 支持 RSA 私钥加密工具类

    首先说明 MS并不建议私钥加密,而且.net 于安全的考虑,RSACryptoServiceProvider类解密时只有同时拥有公钥和私钥才可以,原因是公钥是公开的,会被多人持有,这样的数据传输是不安 ...

  9. 1051: [HAOI2006]受欢迎的牛 (tarjan强连通分量+缩点)

    题目大意:CodeVs2822的简单版本 传送门 $Tarjan$强连通分量+缩点,若连通块的个数等于一则输出n:若缩点后图中出度为0的点个数为1,输出对应连通块内的点数:否则输出0: 代码中注释部分 ...

  10. Office 365 共享邮箱/日历

    一.共享邮箱 Office 365共享邮箱对于客户通过电子邮箱提出的问题,共享邮箱是一个很好的处理方式,组织中的多人可以分担监控邮箱和回复的责任,使得客户的问题更快地得到答复,而相关电子邮件都存储在一 ...