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

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

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

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

代码如下

  1   /// <summary>
  2         /// 获取缓存(从2进制流)
  3         /// </summary>
  4         /// <param name="key">缓存键</param>
  5         /// <returns></returns>
  6         public static object Get(string key)
  7         {
  8             byte[] buffer = _redisClient.Get(key);
  9             return GetObjFromBytes(buffer);
 10         }
 11
 12         /// <summary>
 13         /// 从二进制流得到对象(dataset专用,dataset要序列化为二进制才可保存)
 14         /// </summary>
 15         /// <param name="buffer"></param>
 16         /// <returns></returns>
 17         private static object GetObjFromBytes(byte[] buffer) {
 18             using (System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer))
 19             {
 20                 stream.Position = 0;
 21                 System.Runtime.Serialization.IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
 22                 Object reobj = bf.Deserialize(stream);
 23                 return reobj;
 24             }
 25         }
 26
 27         /// <summary>
 28         /// 获取DATASET缓存
 29         /// </summary>
 30         /// <param name="key">缓存键</param>
 31         /// <returns></returns>
 32         public static DataSet GetMemByDataSet(string key)
 33         {
 34             var item = Get(key);
 35             return (DataSet)item;
 36         }
 37         /// <summary>
 38         /// 获取DATASET缓存(如果没有,则调用Func<T>方法返回对象并加入到缓存)
 39         /// </summary>
 40         /// <param name="key">缓存键</param>
 41         /// <param name="func">委托方法,返回指定对象类型,用于缓存不存在时回调该方法获取数据并插入到缓存</param>
 42         /// <param name="minute">过期时间(分钟)</param>
 43         /// <returns></returns>
 44         public static DataSet GetMemByDataSet(string key, Func<DataSet> func, int minute)
 45         {
 46             DataSet item = GetMemByDataSet(key);
 47             if (item == null)
 48             {
 49                 item = func();
 50                 if (item != null)
 51                 {
 52                     SetMemByDataSet(key, item, minute);
 53                 }
 54             }
 55             return item;
 56         }
 57         /// <summary>
 58         /// 插入DATASET缓存
 59         /// </summary>
 60         /// <param name="key">缓存键</param>
 61         /// <param name="item">缓存对象</param>
 62         /// <param name="minute">过期时间(分钟)</param>
 63         public static void SetMemByDataSet(string key, DataSet ds, int minute)
 64         {
 65             DateTime expiryTime = DateTime.Now.AddMinutes(minute);
 66             System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
 67             System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
 68             formatter.Serialize(ms, ds);//把DataSet对象序列化到内存流
 69             byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
 70             ms.Close();//关闭内存流对象
 71             ms.Dispose();//释放资源
 72             _redisClient.Set(key, buffer, expiryTime);
 73         }
 74
 75         /// <summary>
 76         /// 插入dictionary dataset缓存。
 77         /// </summary>
 78         /// <param name="key">redis保存键</param>
 79         /// <param name="dicdss">Dictionary string 键 dataset 值 </param>
 80         /// <param name="minute">缓存时间</param>
 81         public static void SetDicDataSets(string key, Dictionary<string, DataSet> dicdss, int minute)
 82         {
 83             //dataset转为二进制流
 84             Dictionary<string, byte[]> ndic = new Dictionary<string, byte[]>();
 85             DateTime expiryTime = DateTime.Now.AddMinutes(minute);
 86             System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
 87             System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
 88             foreach (var dsentry in dicdss)
 89             {
 90                 formatter.Serialize(ms, dsentry.Value);//把DataSet对象序列化到内存流
 91                 byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
 92                 ndic.Add(dsentry.Key, buffer);
 93                 //清空流
 94                 ms.SetLength(0); ms.Position = 0;
 95             }
 96             ms.Close();//关闭内存流对象
 97             ms.Dispose();//释放资源
 98             _redisClient.Set(key, ndic, expiryTime);
 99         }
100
101         /// <summary>
102         /// 插入List. dictionary .dataset缓存。
103         /// </summary>
104         /// <param name="key">redis保存键</param>
105         /// <param name="dicdss">Dictionary string 键 dataset 值 </param>
106         /// <param name="minute">缓存时间</param>
107         public static void SetListDicDataSets(string key,List<Dictionary<string, DataSet>> Listdicdss, int minute)
108         {
109             DateTime expiryTime = DateTime.Now.AddMinutes(minute);
110             System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();//定义BinaryFormatter以序列化DataSet对象
111             List<Dictionary<string, byte[]>>  nlistdic=new List<Dictionary<string,byte[]>>();
112             System.IO.MemoryStream ms = new System.IO.MemoryStream();//创建内存流对象
113             foreach (var dicdss in Listdicdss) {
114                 //dataset转为二进制流
115                 Dictionary<string, byte[]> ndic = new Dictionary<string, byte[]>();
116                 foreach (var dsentry in dicdss)
117                 {
118                     formatter.Serialize(ms, dsentry.Value);//把DataSet对象序列化到内存流
119                     byte[] buffer = ms.ToArray();//把内存流对象写入字节数组
120                     ndic.Add(dsentry.Key, buffer);
121                     //清空流
122                     ms.SetLength(0); ms.Position = 0;
123                 }
124                 nlistdic.Add(ndic);
125             }
126             ms.Close();//关闭内存流对象
127             ms.Dispose();//释放资源
128             _redisClient.Set(key, nlistdic, expiryTime);
129         }
130         /// <summary>
131         /// 得到Dictionary【string, DataSet】
132         /// </summary>
133         /// <param name="key"></param>
134         /// <returns></returns>
135         public static List<Dictionary<string, DataSet>> GetListDicDataSets(string key)
136         {
137             List<Dictionary<string, DataSet>> resutl = new List<Dictionary<string, DataSet>>();
138             List<Dictionary<string, byte[]>> rebytes = Get<List<Dictionary<string, byte[]>>>(key);
139             foreach (var item in rebytes) {
140
141                 Dictionary<string, DataSet> dss = new Dictionary<string, DataSet>();
142                 foreach (var itementry in item)
143                 {
144                     DataSet ds = (DataSet)GetObjFromBytes(itementry.Value);
145                     dss.Add(itementry.Key, ds);
146                 }
147                 resutl.Add(dss);
148             }
149             return resutl;
150         }

转载于:https://www.cnblogs.com/zihunqingxin/p/3503299.html

redis保存dataset相关推荐

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

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

  2. 14 Redis 保存时间序列数据

    14 Redis 保存时间序列数据 前言 一.时间序列数据的读写特点 二.基于 Hash 和 Sorted Set 保存时间序列数据 三.基于 RedisTimeSeries 模块保存时间序列数据 总 ...

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

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

  4. redis 保存 array list 区别_Redis科普篇

    这是学习Java的小姐姐第53篇原创文章 前言 hello,好久不见,又断更了一段时间.同事大部分离职了,但是活还是一样,所以只能硬着头皮顶上.现在总算歇会了,决定开启Redis源码系列,希望不要啪啪 ...

  5. redis 保存 array list 区别_为什么Redis的RDB备份不用多线程实现CopyOnWrite?

    前言 这篇文章源于我昨天看到的一个有意思的问题. 快照持久化是个很耗时间的操作,而Redis采用fork一个子进程出来进行持久化.理论而言,fork出来的子进程会拷贝父进程所有的数据,这样当Redis ...

  6. php redis 用户会话,使用Redis保存用户会话Session详解

    前言 PHP内置的绘画存储机制是把全部的会话数据保存在服务器上的文本文件里面,这些文件通常都是保存在服务器上的临时目录里.如果并发量大,读写效率非常低.而Redis对高并发的支持非常好,所以,可以使用 ...

  7. SpringBoot中使用Redis保存对象或集合

    1,引入SpringBoot中Redis依赖 <!-- redis --> <dependency><groupId>org.springframework.boo ...

  8. Redis保存购物车信息

    相关博客:https://hcshow.blog.csdn.net/article/details/118938917 原理 以客户id作为key,每位用户创建一个hash存储结构存储对应的购物车信息 ...

  9. 【Redis】如何使用Redis保存Java对象

    前言 最近几天有同事在开发跑合微信版的过程中碰到了一个问题.由于微信端需要通过H5的入口进行账号的绑定,同时需要在会话过期之前定时轮询保持会话有效.这个时候需要在系统中保存微信的ApiConfig对象 ...

最新文章

  1. 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)...
  2. 复制到剪贴板的js代码(兼容ie、firefox、chorme、safari...什么都兼容!)
  3. 机器学习笔记:牛顿方法
  4. css 不换行_CSS样式更改——文本Content
  5. 【2012百度之星/初赛上】D:轮子上的度度熊
  6. php微信支付使用ajax,接入微信公众号支付,选择支付方式后,只弹出“error’”(php)...
  7. 如何用python删除异常值_Python机器学习:异常值查找和处理
  8. iview中position: 'fixed'最顶层z-index
  9. “Ceph浅析”系列之二——Ceph概况
  10. paip.svn 导入项目到SVN库
  11. oracle 11g rac进程起停
  12. 斗鱼tv鸿蒙电视版,斗鱼直播鸿蒙版
  13. HTML加载图片跨域
  14. 如何删除双系统(超级详细,手把手教学)
  15. 第二章笔记:计数初步
  16. 2018美团实习生招聘——K的倍数
  17. 在 CentOS 7.6 上打包 Android Package APK
  18. 什么是iu组装服务器,IU李知恩和“买家秀”在“教科书”级别的私有服务器共享是邻居...
  19. IEEE软件工程标准词汇表定义需求
  20. 【苦练基本功】代码整洁之道 pt3(第7章-第9章)

热门文章

  1. 深入理解C语言变量和内存——整理篇
  2. windows与linux中的路径书写,斜杠、反斜杠用法总结
  3. linux下screen基本用法
  4. c++11 Type Alias
  5. c++-内存管理-内存对齐方式
  6. java网络文章博客抓取系统_java 后端博客系统文章系统——No3
  7. GitLab 安装笔记
  8. Acknowledgement Modes
  9. visio数据流线文字方向的问题
  10. 什么是JAVA内容仓库(Java Content Repository)