C#链接阿里云KVStore

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搜索结果如下:

C#链接阿里云KVStore_第1张图片

  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],不然有死循环就会造成内存溢出。

你可能感兴趣的:(C#链接阿里云KVStore)