程序员的资源宝库

网站首页 > gitee 正文

C#链接阿里云KVStore 调用阿里云api

sanyeah 2024-03-29 17:58:55 gitee 10 ℃ 0 评论

KVStore的简单介绍

  阿里云KVStore兼容Redis。因为KVStore就相当于Redis的服务器端,我们代码只是当作客户端,链接上服务器端就行了,阿里云的KVStore详情文档见,https://docs.aliyun.com/#/pub/kvstore/key-value-store/kvstore-introduction。

C#客户端链接OCS

  1.阿里云文档上介绍的是用ServiceStack去链接KVStore。那我们项目中就用nuget去下载ServiceStack包。nuget搜索ServiceStack,搜索到的结果如下图,安装图中标识的就可以了。这个应该是最新的V4版本,当提醒你需要用商业版的时候,可以去还原之前的V3版本,具体还原方法见,https://github.com/ServiceStackV3/ServiceStackV3。

  nuget搜索结果如下:

  2.安装好以后,写链接和调用kvstore的代码。其中_setting.AccessId, _setting.AccessKey, _setting.HostAddress,分别是KVStore的实例ID,链接密码和链接地址。

  1 using ServiceStack.Redis;
  2 //using ServiceStack.Text;
  3 using ServiceStack.Common;
  4 using System;
  5 using System.Collections.Generic;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9 using System.Web.Script.Serialization;
 10 using Zupo.Core.Caching;
 11 using System.Text.RegularExpressions;
 12 
 13 
 14 namespace KVStore
 15 {
 16     public class KVStoreService
 17     {
 18 
 19         IKVStoreSetting _setting;
 20         private IRedisClient redisClient;
 21         private bool linkServer = true;
 22 
 23         public KVStoreService(IKVStoreSetting setting)
 24         {
 25             try
 26             {
 27                 this._setting = setting;
 28                 //连接池模式
 29                 //string[] testReadWriteHosts = new[] {
 30                 //string.Format("redis://:{0}:{1}@{2}:6379",_setting.AccessId,_setting.AccessKey,_setting.HostAddress)/*redis://:实例id:密码@访问地址:端口*/
 31                 //};
 32                 //RedisClientManagerConfig RedisConfig = new RedisClientManagerConfig();
 33                 //RedisConfig.AutoStart = true;
 34                 //RedisConfig.MaxReadPoolSize = 60;
 35                 //RedisConfig.MaxWritePoolSize = 60;
 36                 ////RedisConfig.VerifyMasterConnections = false;//需要设置
 37                 ////PooledRedisClientManager redisPoolManager = new PooledRedisClientManager(10/*连接池个数*/, 10/*连接池超时时间*/, testReadWriteHosts);
 38                 //PooledRedisClientManager redisPoolManager = new PooledRedisClientManager(10/*连接池个数*/, 10/*连接池超时时间*/, testReadWriteHosts);
 39                 //redisClient = redisPoolManager.GetClient();//获取连接
 40                 ////RedisNativeClient redisNativeClient = (RedisNativeClient)redisClient;
 41                 ////redisNativeClient.Client = null;//KVStore不支持client setname所以这里需要显示的把client对象置为null
 42                 //var dbSize = redisClient.DbSize;
 43 
 44                 //单链接模式
 45                 //string host = _setting.HostAddress;/*访问host地址*/
 46                 //string password = string.Format("{0}:{1}", _setting.AccessId, _setting.AccessKey);/*实例id:密码*/
 47                 //redisClient = new RedisClient(host, 6379, password);
 48                 //var dbSize = redisClient.DbSize;
 49 
 50                 RedisClientManagerConfig RedisConfig = new RedisClientManagerConfig();
 51                 RedisConfig.AutoStart = true;
 52                 RedisConfig.MaxReadPoolSize = 60;
 53                 RedisConfig.MaxWritePoolSize = 60;
 54                 RedisConfig.DefaultDb = 1;  //默认第一个db
 55 
 56                 PooledRedisClientManager prcm = new PooledRedisClientManager(new List<string>() { string.Format("{0}:{1}@{2}:6379", _setting.AccessId, _setting.AccessKey, _setting.HostAddress) },
 57                     new List<string>() { string.Format("{0}:{1}@{2}:6379", _setting.AccessId, _setting.AccessKey, _setting.HostAddress) }, RedisConfig);
 58                 redisClient = prcm.GetClient();
 59             }
 60             catch (Exception)
 61             {
 62                 linkServer = false;
 63             }
 64         }
 65 
 66         /// <summary>
 67         /// 是否处于链接状态
 68         /// </summary>
 69         protected bool LinkServer
 70         {
 71             get
 72             {
 73                 return linkServer;
 74             }
 75         }
 76 
 77         /// <summary>
 78         /// 根据传入的key-value添加一条记录,当key已存在返回false
 79         /// </summary>
 80         /// <typeparam name="T"></typeparam>
 81         /// <param name="key"></param>
 82         /// <param name="value"></param>
 83         /// <returns></returns>
 84         protected bool Add<T>(string key, T value)
 85         {
 86             return redisClient.Add<T>(key, value);
 87         }
 88 
 89         /// <summary> 
 90         /// 根据传入的key-value添加一条记录,当key已存在返回false
 91         /// </summary>
 92         /// <typeparam name="T"></typeparam>
 93         /// <param name="key"></param>
 94         /// <param name="value"></param>
 95         /// <param name="expiresIn">TimeSpan</param>
 96         /// <returns></returns>
 97         protected bool AddExpires<T>(string key, T value, TimeSpan expiresIn)
 98         {
 99             return redisClient.Add<T>(key, value, expiresIn);
100         }
101 
102         /// <summary>
103         /// 获取
104         /// </summary>
105         /// <typeparam name="T"></typeparam>
106         /// <param name="key"></param>
107         /// <returns></returns>
108         protected T Get<T>(string key)
109         {
110             try
111             {
112                 return redisClient.Get<T>(key);
113             }
114             catch(Exception ex)
115             {
116                 throw ex;
117             }
118         }
119 
120         protected List<T> GetList<T>(string key)
121         {
122             return redisClient.Get<List<T>>(key);
123         }
124 
125         /// <summary>
126         /// 根据传入的多个key获取多条记录的值
127         /// </summary>
128         /// <typeparam name="T"></typeparam>
129         /// <param name="keys"></param>
130         /// <returns></returns>
131         protected IDictionary<string, T> GetAll<T>(IEnumerable<string> keys)
132         {
133             return redisClient.GetAll<T>(keys);
134         }
135 
136         /// <summary>
137         /// 根据传入的key移除一条记录
138         /// </summary>
139         /// <param name="key"></param>
140         /// <returns></returns>
141         public void Remove(string key)
142         {
143             redisClient.Remove(key);
144         }
145 
146         /// <summary>
147         /// 根据传入的多个key移除多条记录
148         /// </summary>
149         /// <param name="keys"></param>
150         protected void RemoveAll(IEnumerable<string> keys)
151         {
152             redisClient.RemoveAll(keys);
153         }
154 
155         /// <summary>
156         /// Removes items by pattern
157         /// </summary>
158         /// <param name="pattern">pattern</param>
159         public void RemoveByPattern(string pattern)
160         {
161             var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
162             var keysToRemove = new List<String>();
163 
164             var allkeys = redisClient.GetAllKeys();
165             foreach (var key in allkeys)
166                 if (regex.IsMatch(key))
167                     keysToRemove.Add(key);
168 
169             foreach (string key in keysToRemove)
170             {
171                 Remove(key);
172             }
173         }
174 
175 
176         /// <summary>
177         /// 清空kv-store缓存
178         /// </summary>
179         /// <returns></returns>
180         public void Clear()
181         {
182             var allkeys = redisClient.GetAllKeys();
183             redisClient.RemoveAll(allkeys);
184         }
185 
186         /// <summary>
187         /// 根据传入的key覆盖一条记录的值,当key不存在不会添加
188         /// </summary>
189         /// <typeparam name="T"></typeparam>
190         /// <param name="key"></param>
191         /// <param name="value"></param>
192         /// <returns></returns>
193         protected bool Replace<T>(string key, T value)
194         {
195             return redisClient.Replace<T>(key, value);
196         }
197 
198         /// <summary>
199         ///  根据传入的key修改一条记录的值,当key不存在则添加 
200         /// </summary>
201         /// <typeparam name="T"></typeparam>
202         /// <param name="key"></param>
203         /// <param name="value"></param>
204         /// <returns></returns>
205         protected bool Set<T>(string key, T value)
206         {
207             try
208             {
209                 return redisClient.Set<T>(key, value);
210             }
211             catch(Exception ex)
212             {
213                 throw ex;
214             }
215         }
216 
217         protected bool Set<T>(string key, List<T> value)
218         {
219             try
220             {
221                 JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
222                 //执行序列化
223                 string objectStr = jsonSerializer.Serialize(value);
224 
225                 return redisClient.Set(key, value);
226             }
227             catch (Exception ex)
228             {
229                 throw ex;
230             }
231         }
232 
233         /// <summary>
234         /// 根据传入的key修改一条记录的值,当key不存在则添加
235         /// </summary>
236         /// <typeparam name="T"></typeparam>
237         /// <param name="key"></param>
238         /// <param name="value"></param>
239         /// <param name="expiresIn">TimeSpan</param>
240         /// <returns></returns>
241         protected bool SetExpires<T>(string key, T value, TimeSpan expiresIn)
242         {
243             return redisClient.Set<T>(key, value, expiresIn);
244         }
245 
246         /// <summary>
247         /// 根据传入的多个key覆盖多条记录
248         /// </summary>
249         /// <typeparam name="T"></typeparam>
250         /// <param name="values"></param>
251         protected void SetAll<T>(IDictionary<string, T> values)
252         {
253             redisClient.SetAll<T>(values);
254         }
255 
256         /// <summary>
257         /// 判断Key在本数据库内是否已被使用(包括各种类型、内置集合等等)
258         /// </summary>
259         /// <param name="key"></param>
260         /// <returns></returns>
261         public bool Contains(string key)
262         {
263             return redisClient.ContainsKey(key);
264         }
265 
266         /// <summary>
267         /// 获取所有的Keys集合
268         /// </summary>
269         /// <returns></returns>
270         protected List<string> GetAllKeys()
271         {
272             return redisClient.GetAllKeys();
273         }
274 
275         /// <summary>
276         /// 重命名一个Key,值不变
277         /// </summary>
278         /// <param name="fromName"></param>
279         /// <param name="toName"></param>
280         protected void RenameKey(string fromName, string toName)
281         {
282             redisClient.RenameKey(fromName, toName);
283         }
284 
285         /// <summary>
286         /// 清除本数据库的所有数据
287         /// </summary>
288         protected void FlushDb()
289         {
290             redisClient.FlushAll();
291         }
292 
293         /// <summary>
294         /// 根据Key获取当前存储的值是什么类型:
295         /// </summary>
296         /// <param name="key">None = 0 String = 1 List = 2 Set = 3 SortedSet = 4 Hash = 5</param>
297         /// <returns></returns>
298         protected RedisKeyType GetEntryType(string key)
299         {
300             return redisClient.GetEntryType(key);
301         }
302 
303         /// <summary>
304         /// 添加一个项到内部的List<T>
305         /// </summary>
306         /// <param name="listId"></param>
307         /// <param name="value"></param>
308         protected void AddItemToList(string listId, string value)
309         {
310             redisClient.AddItemToList(listId, value);
311         }
312 
313         /// <summary>
314         ///  添加一个项到内部的HashSet<T> 
315         /// </summary>
316         /// <param name="setId"></param>
317         /// <param name="item"></param>
318         protected void AddItemToSet(string setId, string item)
319         {
320             redisClient.AddItemToSet(setId, item);
321         }
322 
323         /// <summary>
324         /// 一次过将参数中的List<T>中的多个值添加入内部的List<T>
325         /// </summary>
326         /// <param name="listId"></param>
327         /// <param name="values"></param>
328         protected void AddRangeToList(string listId, List<string> values)
329         {
330             redisClient.AddRangeToList(listId, values);
331         }
332 
333         /// <summary>
334         /// 一次过将参数中的HashSet<T>中的多个值添加入内部的HashSet<T>
335         /// </summary>
336         /// <param name="setId"></param>
337         /// <param name="items"></param>
338         protected void AddRangeToSet(string setId, List<string> items)
339         {
340             redisClient.AddRangeToSet(setId, items);
341         }
342 
343         /// <summary>
344         /// 获取指定ListId的内部List<T>的所有值
345         /// </summary>
346         /// <param name="listId"></param>
347         /// <returns></returns>
348         protected List<string> GetAllItemsFromList(string listId)
349         {
350             return redisClient.GetAllItemsFromList(listId);
351         }
352 
353         /// <summary>
354         ///  获取指定SetId的内部HashSet<T>的所有值 
355         /// </summary>
356         /// <param name="setId"></param>
357         /// <returns></returns>
358         protected HashSet<string> GetAllItemsFromSet(string setId)
359         {
360             return redisClient.GetAllItemsFromSet(setId);
361         }
362 
363         /// <summary>
364         /// 根据ListId和下标获取一项
365         /// </summary>
366         /// <param name="listId"></param>
367         /// <param name="listIndex"></param>
368         /// <returns></returns>
369         protected string GetItemFromList(string listId, int listIndex)
370         {
371             return redisClient.GetItemFromList(listId, listIndex);
372         }
373     }
374 }
View Code      

使用注意点

  这个可以直接上传list和set等类型的数据,它也支持泛型方法,但因为网络传输肯定是要先序列化的,跟OCS一样的问题,所以我项目用的是EF,所以得先去忽略不需要序列化的字段和属性等,加上[IgnoreDataMember],不然有死循环就会造成内存溢出。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表