zoukankan      html  css  js  c++  java
  • 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         }
  • 相关阅读:
    什么是JAVA内容仓库(Java Content Repository)(3)
    Documentum 中 Type定义与存储
    洛谷 P1421 小玉买文具
    校内 第一届ACM校赛——热身赛
    洛谷 P1307 数字反转
    洛谷P1579 哥德巴赫猜想(升级版)
    51单片机 第三节 独立按键
    51单片机 第四节 数码管
    校内 第一届ACM校赛——正赛
    51单片机 第二节 点亮LED
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/3503299.html
Copyright © 2011-2022 走看看