日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis保存dataset

發布時間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。