redis保存dataset
公司统一走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相关推荐
- laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到
laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...
- 14 Redis 保存时间序列数据
14 Redis 保存时间序列数据 前言 一.时间序列数据的读写特点 二.基于 Hash 和 Sorted Set 保存时间序列数据 三.基于 RedisTimeSeries 模块保存时间序列数据 总 ...
- 你的项目真的需要Session吗? redis保存session性能怎么样?
在web开发中,Session这个东西一直都很重要,至少伴随我10年之久, 前一段时间发生一个性能问题,因为Redis session 问题,后来想想 其实我的项目session 是不需要的. 先看看 ...
- redis 保存 array list 区别_Redis科普篇
这是学习Java的小姐姐第53篇原创文章 前言 hello,好久不见,又断更了一段时间.同事大部分离职了,但是活还是一样,所以只能硬着头皮顶上.现在总算歇会了,决定开启Redis源码系列,希望不要啪啪 ...
- redis 保存 array list 区别_为什么Redis的RDB备份不用多线程实现CopyOnWrite?
前言 这篇文章源于我昨天看到的一个有意思的问题. 快照持久化是个很耗时间的操作,而Redis采用fork一个子进程出来进行持久化.理论而言,fork出来的子进程会拷贝父进程所有的数据,这样当Redis ...
- php redis 用户会话,使用Redis保存用户会话Session详解
前言 PHP内置的绘画存储机制是把全部的会话数据保存在服务器上的文本文件里面,这些文件通常都是保存在服务器上的临时目录里.如果并发量大,读写效率非常低.而Redis对高并发的支持非常好,所以,可以使用 ...
- SpringBoot中使用Redis保存对象或集合
1,引入SpringBoot中Redis依赖 <!-- redis --> <dependency><groupId>org.springframework.boo ...
- Redis保存购物车信息
相关博客:https://hcshow.blog.csdn.net/article/details/118938917 原理 以客户id作为key,每位用户创建一个hash存储结构存储对应的购物车信息 ...
- 【Redis】如何使用Redis保存Java对象
前言 最近几天有同事在开发跑合微信版的过程中碰到了一个问题.由于微信端需要通过H5的入口进行账号的绑定,同时需要在会话过期之前定时轮询保持会话有效.这个时候需要在系统中保存微信的ApiConfig对象 ...
最新文章
- 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)...
- 复制到剪贴板的js代码(兼容ie、firefox、chorme、safari...什么都兼容!)
- 机器学习笔记:牛顿方法
- css 不换行_CSS样式更改——文本Content
- 【2012百度之星/初赛上】D:轮子上的度度熊
- php微信支付使用ajax,接入微信公众号支付,选择支付方式后,只弹出“error’”(php)...
- 如何用python删除异常值_Python机器学习:异常值查找和处理
- iview中position: 'fixed'最顶层z-index
- “Ceph浅析”系列之二——Ceph概况
- paip.svn 导入项目到SVN库
- oracle 11g rac进程起停
- 斗鱼tv鸿蒙电视版,斗鱼直播鸿蒙版
- HTML加载图片跨域
- 如何删除双系统(超级详细,手把手教学)
- 第二章笔记:计数初步
- 2018美团实习生招聘——K的倍数
- 在 CentOS 7.6 上打包 Android Package APK
- 什么是iu组装服务器,IU李知恩和“买家秀”在“教科书”级别的私有服务器共享是邻居...
- IEEE软件工程标准词汇表定义需求
- 【苦练基本功】代码整洁之道 pt3(第7章-第9章)