设为首页 收藏本站
查看: 970|回复: 0

[经验分享] Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式

[复制链接]

尚未签到

发表于 2015-9-1 07:02:32 | 显示全部楼层 |阅读模式
  在上一篇文章里面 ( Windows系统下Memcached缓存系列一:Couchbase(服务器端)和CouchbaseClient(c#客户端)的安装教程 ),我们介绍了服务器端的安装和客户端的安装,以及一个简单的例子,这一篇介绍详细的使用方法.
  这次以一个web项目为例.
  配置文件配置调用
  第一步:首先上一下配置文件,在web.config文件里面的 configuration 节点中  添加以下配置
<!--配置缓存开始-->
<configSections>
<section name=&quot;couchbase&quot; type=&quot;Couchbase.Configuration.CouchbaseClientSection, Couchbase&quot;/>
</configSections>
<couchbase>
<servers bucket=&quot;default&quot; bucketPassword=&quot;&quot;>
<add uri=&quot;http://127.0.0.1:8091/pools&quot;/>
<!--<add uri=&quot;http://192.168.0.3:8091/pools&quot;/>-->
</servers>
</couchbase>
<!--配置缓存结束-->

  可以看到Servers节点下只添加了一个URI,而且是我的本机。这个地方通常会配置多个URI列表,是客户端获取信息的集群配置。默认的Couchbase 服务端安装是创建一个名为default、没有密码的存储区(bucket),所以这里存储区密码(bucketpassword)的属性为可选。如果你创建了一个已认证的存储区,你必须在上面的设置中配置那个值。这里暂时就先使用默认的进行吧。
  第二步: 编写缓存接口,实例化客户端,增删改查
  在实际开发中,创建客户端的实例是昂贵的。 客户端会增加开销,因为它创建连接池并设置线程获得集群配置。 因此,最好的做法是创建一个单一的客户端实例,也就是单列。
  我们创建一个类,这个类的静态属性就是我们的实例。 下面是代码
  2.1 缓存接口





public interface ICacheManager
{
bool AddCache(string key, object obj);
T GetCache<T>(string key) where T : class;
bool ClearCache(string key);
bool AddCache(string key, object obj, int minutes);
void FlushAll();
}

2.2 缓存的实现,以及单例


//缓存工厂
public  class MemCacheFactory : ICacheManager   //继承缓存的接口
{
private static readonly object SyncRoot = new object();    //程序运行时创建一个静态的只读对象(用于下面的加锁)
#region 缓存工厂的基础属性字段,静态构造方法
private static readonly CouchbaseClient _instance;
//静态构造函数,在类初始化的时候执行,不用加 public / private 没有意义,因为这个是由.net自动来调用
//在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类
static MemCacheFactory()
{
_instance = new CouchbaseClient();
}
private static CouchbaseClient Instance
{
get { return _instance; }
}
#endregion
#region CRUD 接口的实现
#region AddCache 添加缓存(以序列化保存)
/// <summary>
/// 添加缓存
/// </summary>
/// <param name=&quot;key&quot;></param>
/// <param name=&quot;obj&quot;></param>
/// <returns></returns>
public bool AddCache(string key, object obj)
{
//注意:如果我们直接是用obj来保存,则缓存会帮我们自动加密
//如果我们按照下面的方法,先序列化后,再保存,那么就不会加密
string jsonobj = JsonConvert.SerializeObject(obj);
return Instance.Store(StoreMode.Set, key, jsonobj);  
}
#endregion
#region AddCache 添加缓存并设置时间(以序列化保存)
/// <summary>
/// AddCache 添加缓存并设置时间(以序列化保存)
/// </summary>
/// <param name=&quot;key&quot;></param>
/// <param name=&quot;obj&quot;></param>
/// <param name=&quot;minutes&quot;></param>
/// <returns></returns>
public bool AddCache(string key, object obj, int minutes)
{
string jsonobj = JsonConvert.SerializeObject(obj);
return Instance.Store(StoreMode.Set, key, jsonobj, DateTime.Now.AddMinutes(minutes));
}
#endregion
#region GetCache 获得缓存(并且是已经反序列化的)
/// <summary>
/// 获得缓存
/// </summary>
/// <typeparam name=&quot;T&quot;></typeparam>
/// <param name=&quot;key&quot;></param>
/// <returns></returns>
public T GetCache<T>(string key) where T : class
{
string jsonobj = Instance.Get<String>(key);
if (string.IsNullOrEmpty(jsonobj))
return null;
return (T) JsonConvert.DeserializeObject(jsonobj, typeof (T));
}
#endregion
#region ClearCache 清除缓存
/// <summary>
/// 清除缓存
/// </summary>
/// <param name=&quot;key&quot;></param>
/// <returns></returns>
public bool ClearCache(string key)
{
return Instance.Remove(key);
}
#endregion
#region FlushAll 设置缓存过期(失效后通过get就取不出来了)
/// <summary>
/// 设置缓存过期(失效后通过get就取不出来了)
/// </summary>
public void FlushAll()
{
Instance.FlushAll();
}
#endregion
#endregion
#region 工厂的单例
private static MemCacheFactory _shareInstance;
public static MemCacheFactory GetCurrentMemCache()
{
if (_shareInstance == null)
lock (SyncRoot)
{
_shareInstance = new MemCacheFactory();
}
return _shareInstance;
}
#endregion

}

  StoreMode.Add ,StoreMode.Replace 和 StoreMode.Set 的区别
  Add ,表示添加一个新的key
  Replace ,表示更新一个已经存在的key
  set ,表示如果key不存在则添加、存在则更新。
  如果我们不使用set,而是用 Add和Replace的话,可能会报错,报错的原因如下  :如果key已经存在那么Add就会失败,如果key不存在Replace操作会失败。
  所以建议还是用 Set吧
  
  
  (注意里面有意思的地方,obj的值如果是序列化的,则服务器上显示的是序列化的值,不加密.  如果obj的值不序列化,那么服务器会加密)
  也就是如果我们的添加保存的方法里面,把obj进行了序列化,那么服务器上显示的值,就是序列化后的字符串

public bool AddCache(string key, object obj, int minutes)
{
string jsonobj = JsonConvert.SerializeObject(obj);
return Instance.Store(StoreMode.Set, key, jsonobj, DateTime.Now.AddMinutes(minutes));
}
DSC0000.png
  如果我们保存的obj就是一个对象的话,那么服务器上显示的就是这个对象加密过的数据

public bool AddCache(string key, object obj, int minutes)
{
//string jsonobj = JsonConvert.SerializeObject(obj);
//return Instance.Store(StoreMode.Set, key, jsonobj, DateTime.Now.AddMinutes(minutes));
return Instance.Store(StoreMode.Set, key, obj, DateTime.Now.AddMinutes(minutes));
}
DSC0001.png
  总结: 支持中文的key,如果保存的值是一个对象,那么服务器上保存的是对象加密后的值,如果保存的是一个序列化的字符串,则服务器上保存的是字符串.

如果我们保存的序列化的值,我们通过Json属性来更改,会怎么样? 例如下面有这样的类,上面用JsonProperty打了标签,保存到缓存会怎么样?

public class Person
{
[JsonProperty(&quot;id&quot;)]
public string  Name { get; set; }
[JsonProperty(&quot;myaddress&quot;)]
public string  Address { get; set; }
}
  保存到缓存里面
DSC0002.png
  如果是我们获取到缓存之后,是使用  .Name 还是 .id 呢?  答案是:还是用 .Name

var temp=MemCacheFactory.GetCurrentMemCache().GetCache<Person>(txtkey);
litResult.Text = temp.Name
  最后写一下使用方法

protected void btnAdd_Click(object sender, EventArgs e)
{
string txtkey = txtKey.Text.Trim();
string txtvalue = txtValue.Text.Trim();
MemCacheFactory.GetCurrentMemCache().AddCache(txtkey, txtvalue);
Response.Redirect(&quot;add.aspx&quot;);
}
  
  疑问: 好像是不能使用  FlushAll的

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-108058-1-1.html 上篇帖子: Memcached详解 下篇帖子: Memcached 源码分析——从 main 函数说起
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表