C#链接阿里云OCS
一、阿里云OCS简单介绍
阿里云OCS兼容Memcached,因为OCS就相当于Memcached的服务器端,我们代码只是当作客户端,链接上服务器端就行了。阿里云OCS介绍详情见 http://www.aliyun.com/product/ocs?spm=5176.2020520107.0.0.s2zgFk#Help 。
二、C#客户端链接OCS
1.阿里云文档上介绍的是用Enyim.Caching去链接OCS。那我们项目中就用nuget去下载Enyim.Caching包。nuget搜索Enyim,搜索到的结果如下图,第一个是nolog版本的,第二个是带log的,随便一个都可以。
nuget搜索结果如下:

2.安装成功以后,再链接OCS,写个初始化memcached的代码,代码如下。
using Enyim.Caching;
using Enyim.Caching.Configuration;
using Enyim.Caching.Memcached;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace OCS
{
public class MemCached
{
private static MemcachedClient MemClient; static readonly object padlock = new object();
//线程安全的单例模式
public static MemcachedClient getInstance(string hostName,string userName,string password)
{
if (MemClient == null)
{
lock (padlock)
{
if (MemClient == null)
{
MemClientInit(hostName,userName,password);
}
}
}
return MemClient;
} static void MemClientInit(string hostName,string userName,string password)
{
try
{
//初始化缓存
MemcachedClientConfiguration memConfig = new MemcachedClientConfiguration();
IPAddress newaddress = IPAddress.Parse(Dns.GetHostEntry(hostName).AddressList[].ToString());
IPEndPoint ipEndPoint = new IPEndPoint(newaddress, ); // 配置文件 - ip
memConfig.Servers.Add(ipEndPoint);
// 配置文件 - 协议
memConfig.Protocol = MemcachedProtocol.Binary;
// 配置文件-权限
memConfig.Authentication.Type = typeof(PlainTextAuthenticator);
memConfig.Authentication.Parameters["zone"] = "";
memConfig.Authentication.Parameters["userName"] = userName;
memConfig.Authentication.Parameters["password"] = password;
//下面请根据实例的最大连接数进行设置
memConfig.SocketPool.MinPoolSize = ;
memConfig.SocketPool.MaxPoolSize = ;
MemClient = new MemcachedClient(memConfig);
}
catch (Exception)
{
MemClient = null;
}
}
}
}
3.再写个服务去调用上面的初始化代码,创建MemcachedClient的实例去调用客户端代码。下面代码中的构造函数中的_setting.HostAddress, _setting.AccessId, _setting.AccessKey分别对应的是,OCS的链接地址,链接密码和OCS的实例ID。
using Enyim.Caching;
using Enyim.Caching.Memcached;
using Enyim.Caching.Memcached.Results;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using Zupo.Core.Caching;
using ServiceStack.Text;
using Newtonsoft.Json; namespace OCS
{
public class OCSService
{
IOCSSetting _setting; private MemcachedClient client; public OCSService(IOCSSetting setting)
{
this._setting = setting;
this.client = MemCached.getInstance(_setting.HostAddress, _setting.AccessId, _setting.AccessKey);
} /// <summary>
/// 是否链接上服务器
/// </summary>
protected bool LinkServer
{
get
{
return client == null ? false : true;
}
} protected IGetOperationResult ExecuteGet(string key)
{
return client.ExecuteGet(key);
} /// <summary>
/// 根据key获得缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
protected object Get(string key)
{
return client.Get(key);
} /// <summary>
/// 根据key获得缓存 泛型方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
protected T Get<T>(string key)
{
try
{
//JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//string objectStr = client.Get(key).ToString();
var obj = client.Get(key);
if (obj != null)
{
return JsonConvert.DeserializeObject<T>(obj.ToString());
}
return default(T);
//return objectStr.FromJson<T>();
}
catch (Exception)
{
this.Remove(key);
return default(T);
}
} /// <summary>
/// 根据key获得缓存 泛型方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
protected List<T> GetList<T>(string key)
{
var objectStr = client.Get(key).ToString(); //return objectStr.FromJson<List<T>>();
return JsonConvert.DeserializeObject<List<T>>(objectStr);
} /// <summary>
/// 根据数组key获得数据 IDictionary
/// </summary>
/// <param name="keys"></param>
/// <returns></returns>
protected IDictionary<string, object> GetByKeys(string[] keys)
{
return client.Get(keys);
} /// <summary>
/// 该key值缓存是否存在
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Contains(string key)
{
object value; return client.TryGet(key, out value);
} /// <summary>
/// 存储,有的话直接覆盖
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
protected bool Set(string key, object value)
{
return client.Store(StoreMode.Set, key, value);
} /// <summary>
/// 存储,有的话直接覆盖
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
protected bool Set<T>(string key, T value)
{
try
{
//执行序列化
//string objectStr = value.ToJson();
string objectStr = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
return client.Store(StoreMode.Set, key, objectStr);
}
catch(Exception)
{
return false;
} } /// <summary>
/// 存储,有的话直接覆盖
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
protected bool Set<T>(string key, List<T> value)
{
//执行序列化
//string objectStr = value.ToJson();
string objectStr = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
return client.Store(StoreMode.Set, key, objectStr);
} /// <summary>
/// 存储,有的话直接覆盖
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="expire">失效时间:TimeSpan</param>
/// <returns></returns>
protected bool SetExpires(string key, object value, TimeSpan expire)
{
try
{
//string objectStr = value.ToJson();
string objectStr = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
return client.Store(StoreMode.Set, key, objectStr, expire);
}
catch(Exception)
{
return false;
} } /// <summary>
/// 存储,有的话直接覆盖
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="expire">失效时间:TimeSpan</param>
/// <returns></returns>
protected bool SetExpires<T>(string key, T value, TimeSpan expire)
{
//执行序列化
//string objectStr = value.ToJson();
string objectStr = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
return client.Store(StoreMode.Set, key, objectStr, expire);
} /// <summary>
/// 删除cached
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public void Remove(string key)
{
client.Remove(key);
} /// <summary>
/// Removes items by pattern
/// 该方法未实现
/// </summary>
/// <param name="pattern">pattern</param>
public virtual void RemoveByPattern(string pattern)
{
var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
//var keysToRemove = new List<String>(); //var allkeys = client.
//foreach (var key in allkeys)
// if (regex.IsMatch(key))
// keysToRemove.Add(key); //foreach (string key in keysToRemove)
//{
// Remove(key);
//}
} /// <summary>
/// 清空ocs缓存
/// </summary>
/// <returns></returns>
public void Clear()
{
client.FlushAll();
}
}
}
MemcachedClient
三、使用注意点
因为OCS只支持key/value的格式进行存储,所以我项目中先运用了Newtonsoft.Json去先对对象序列化,再存入到OCS上,读取的时候再反序列化读取。代码如下:
/// <summary>
/// 存储,有的话直接覆盖
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
protected bool Set<T>(string key, T value)
{
try
{
//执行序列化
string objectStr = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
return client.Store(StoreMode.Set, key, objectStr);
}
catch(Exception)
{
return false;
} }
代码中设置了JsonSerializerSettings,因为项目用的是EF,一些对象里面的属性可能是另外一个对象还有是一些死循环的属性,所以数据量会比较大,直接执行序列化会内存溢出的,所以要在对象里面不需要序列化的属性上加上[JsonIgnore],忽略此属性或字段序列化。
那么反序列化获取数据代码如下:
/// <summary>
/// 根据key获得缓存 泛型方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
protected T Get<T>(string key)
{
try
{
var obj = client.Get(key);
if (obj != null)
{
return JsonConvert.DeserializeObject<T>(obj.ToString());
}
return default(T);
}
catch (Exception)
{
this.Remove(key);
return default(T);
}
}
C#链接阿里云OCS的更多相关文章
- 【阿里云产品公测】在Laravel4框架中使用阿里云OCS缓存
作者:阿里云用户 supechina Laravel 是我最近用得非常多而且越用就越喜欢的一款PHP框架,由于没有向下兼容的历史包袱,完全面向对象的风格,借助 Facades 优雅的 IoC Cont ...
- 阿里云 OCS SDK for NodeJS介绍
阿里云 OCS SDK for NodeJS介绍 阿里云技术团队:熊亮 阿里云 SDK for NodeJS 是为 NodeJS 开发者提供使用阿里云各项服务的统一入口,由阿里云UED团队负责开发维护 ...
- 云计算之路-阿里云上:愚人节被阿里云OCS愚
今天是愚人节,而我们却被阿里云OCS愚,很多地方的缓存一直不过期,造成很多页面中的数据一直不更新.这篇博文将向您分享我们这两天遇到的OCS问题. 阿里云OCS(Open Cache Service)是 ...
- C#链接阿里云KVStore
KVStore的简单介绍 阿里云KVStore兼容Redis.因为KVStore就相当于Redis的服务器端,我们代码只是当作客户端,链接上服务器端就行了,阿里云的KVStore详情文档见,https ...
- 数据库工具链接阿里云MySQL数据库
数据库工具:Toad for MySQL ssh工具:XShell 5 跳板机配置: 配置通道: 源主机:数据库工具链接的地址: 侦听接口:数据库工具侦听接口: 目标主机:数据库阿里云地址: 目标端口 ...
- .Net程序测试使用阿里云OCS开放缓存服务
首先需要有一个阿里的OCS实例和ECS云服务器 请确认这两个是在同一个可用区的,这个很重要! 这两个可以在阿里云官网申请得到 拿到OCS之后 进入OCS控制台,点击下面的客户端下载选择.Net客 ...
- 使用Xshell链接阿里云服务
1.下载Xshell,进入xshell官网 https://xshell.en.softonic.com/,选择免费版本进行下载,在该页面https://www.netsarang.com/zh/fr ...
- navicat链接阿里云mysql报80070007: SSH Tunnel: Server does not support diffie-hellman-group1-sha1 for keyexchange
http://www.jianshu.com/p/200572ed066c navicat 链接数据库 使用navicat 的ssh通道连接数据库回遇到权限问题 错误代码如下: 80070007: ...
- 本机ubuntu链接阿里云服务器(也是ubuntu)
首先在本机安装ssh工具,并修改配置文件(参考:http://www.cnblogs.com/herd/p/5009067.html) 第一步:ssh 100.121.156.32(即:服务器的ip地 ...
随机推荐
- SQL中JOIN 的用法
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...
- ipcs, ipcrm
ipcs ipcs -m #查看系统中已经存在的共享内存 ------ Shared Memory Segments -------- key shmid owner perms bytes natt ...
- Java 代码的基本知识(摘)
(摘自:Java经典入门教程) http://wenku.baidu.com/link?url=IoWI58cD5vzeHN-NL4pN7Gren-RfzydrhjDlETAByC9L-9ANinyL ...
- MySQL事务学习-->隔离级别
MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...
- hw 要的是螺丝钉
日前突然接到华为HR的电话,叫我去面试。本来我的工作和工资收入等各方面在本地也还算可以,没有想要跳槽。但是本着去看看有没有更好机会的想法就去了。 9:30到了现场后,在那里等了很久,一个考官上来问了 ...
- SQLServer中比较末尾带有空格的字符串遇到的坑
最近发现SQLServer中比较字符串的时候 如果字符串末尾是空格 那么SQLServer会无视那些空格直接进行比较 这和程序中平时的字符串判断逻辑不统一 );set @a=N'happycat198 ...
- finereport与OA系统集成的完全方案
随着社会信息化高速发展,企业信息化也得到了一定提高,而如何提高办公效率已经成为企业一项重要而紧迫的任务,传统的纸质报表等档案不仅浪费纸张.不易存档.不易调阅.不易统计,如何更有效.更快速提升办公效率和 ...
- I am back-电商网站开发&jQuery
hi 之前有将近两周的时间没有更新,除了懒就是其他的事情耽误了.现在好了,回家了,虽然家里停水,外面又有积雪,天寒地冻的,但诸多不便,都比不过有点闲的好. 开搞每个学PHP的必经之路——电商网站的开发 ...
- 获取当前时间 和 10s倒计时案例
1.获取当前的时间,时间没分每秒都在走,(把握现在,将来会是美好的!) <title>获取当前时间</title> <script type="text/jav ...
- java 27 - 4 反射之 通过反射获取成员变量并使用
类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...