公司统一走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. Python列表中去重的多种方法

    怎么快速的对列表进行去重呢,去重之后原来的顺序会不会改变呢? 去重之后顺序会改变 set去重 列表去重改变原列表的顺序了 l1 = [1,4,4,2,3,4,5,6,1] l2 = list(set( ...

  2. spring手动回滚当前事务

    通常情况下,主动回滚事务,可以手动抛异常即可,不抛异常可以如下方式回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackO ...

  3. 吴裕雄--天生自然ShellX学习笔记:Shell 传递参数

    在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 实例 以下实例我们向脚本传递三个参数, ...

  4. UML-操作契约是什么?

    1.例子 发现: 1).操作契约也是用例模型的一部分. 2).SSD+用例文本+领域模型---->操作契约 2.定义 1).契约有哪些部分? 操作:操作的名称和参数(就是SSD中的系统操作) 交 ...

  5. 拉格朗日插值Python代码实现

    1. 数学原理 对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为: 其中每个lj(x)为拉格朗日基本多项式(或称插值基函数),其表 ...

  6. ant design for vue 关于table的一些问题

    1.为table添加分页: :pagination="pagination" pagination: { defaultPageSize: 10, showTotal: (tota ...

  7. 关于本人:-D(必读)

    关于本人 本人目前从事iOS开发,但心中也有一个全栈的梦想,希望与大家共勉! 关于博客内容 自己会不时分享一些iOS方面的技术点.总结的一些经验及工具类.还有学习其他语言过程中的笔记.技术.总结及心得 ...

  8. 时间API

    1. 时间API 我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970-01-01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还 ...

  9. 计量经济与时间序列_ACF与PACF标准差(均标准误)的计算(含代码)

    1   我们对于acf和pacf值计算完毕之后,在需要计算两个数值的标准差. 2   acf和pacf的标准差计算略有不同.acf的标准差是一个移动过程,而pacf是一个相对固定过程. 3   我们继 ...

  10. spring启动,spring mvc ,要不要xml配置,基于注解配置

    老项目是09-11年搞的,用的是spring+struts2,没有用注解,全xml配置.web.xml中也配置了一大堆. 现在启动新项目,在项目中用spring+springmvc ,主要用注解,也用 ...