Memcache分布式锁 转发 https://www.cnblogs.com/li150dan/p/9529090.html
在分布式缓存的应用中,会遇到多个客户端同时争用的问题。这个时候,需要用到分布式锁,得到锁的客户端才有操作权限

//引用
using Memcached.ClientLibrary;
namespace Memcache.AddLock
{
public class MemcacheHelper
{
//实例化Client
public MemcachedClient MClient; public MemcacheHelper()
{
//参数设置
string SockIOPoolName = "demo";
string[] MemcacheServiceList = { "127.0.0.1:11211" }; //设置连接池
SockIOPool SPool = SockIOPool.GetInstance(SockIOPoolName);
SPool.SetServers(MemcacheServiceList);
SPool.Initialize(); MClient = new MemcachedClient();
MClient.PoolName = SockIOPoolName;
//是否启用压缩数据:如果启用了压缩,数据压缩长于门槛的数据将被储存在压缩的形式
MClient.EnableCompression = false;
////压缩设置,超过指定大小的都压缩
//MClient.CompressionThreshold = 1024 * 1024;
} /// <summary>
/// 根据key存储对象
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool Set(string key, object value)
{
var result = MClient.Set(key, value);
return result;
} /// <summary>
/// 根据key存储对象,并且设置过期时间
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="timeOut"></param>
/// <returns></returns>
public bool Set(string key, object value, DateTime timeOut)
{
var result = MClient.Set(key, value, timeOut);
return result;
} /// <summary>
/// 根据key获取对应的对象
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public object Get(string key)
{
var result = MClient.Get(key);
return result;
} /// <summary>
/// 替换对应key的value
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool Replace(string key, object value)
{
var result = MClient.Replace(key, value);
return result;
} /// <summary>
/// 删除对应key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Delete(string key)
{
return MClient.Delete(key);
} /// <summary>
/// 删除对应key,并设置从内存中移除的时间点
/// </summary>
/// <param name="key"></param>
/// <param name="timeOut"></param>
/// <returns></returns>
public bool Delete(string key, DateTime timeOut)
{
return MClient.Delete(key, timeOut);
} /// <summary>
/// 判断key是否存在,存在返回true,不存在返回false
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool KeyExists(string key)
{
return MClient.KeyExists(key);
} /// <summary>
/// Memcache分布式锁
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns>当key存在返回false,当key不存在返回true</returns>
public bool Add(string key, object value)
{
return MClient.Add(key, value);
} /// <summary>
/// Memcache分布式锁,并且设置过期时间
/// Memcached分布式锁可以使用 Add 命令,该命令只有KEY不存在时,才进行添加,否则不会处理。Memcached 所有命令都是原子性的,并发下add 同一个KEY,只会一个会成功。
/// 利用这个原理,可以先定义一个锁 LockKEY,Add 成功的认为是得到锁。并且设置[过期超时] 时间,保证宕机后,也不会死锁。
/// 在完成具体操作后,判断锁 LockKEY 是否已超时。如果超时则不删除锁,如果不超时则 Delete 删除锁。
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="timeOut"></param>
/// <returns>当key存在返回false,当key不存在返回true</returns>
public bool Add(string key, object value, DateTime timeOut)
{
return MClient.Add(key, value, timeOut);
}
}
}

控制台程序:

//引用
using Memcached.ClientLibrary;
namespace Memcache.AddLock
{
/// <summary>
/// Memcache分布式锁简单实例
/// </summary>
public class Program
{
//创建一个公共类
public static MemcacheHelper memcache; public static void Main(string[] args)
{
memcache = new MemcacheHelper();
Console.WriteLine("线程开始前,输出" + memcache.Get("demoKey"));
var result = memcache.Delete("demoKey");
Console.WriteLine("线程开始前,输出" + memcache.Get("demoKey") + ",删除对应key返回:" + result);
Console.WriteLine("线程开始前,输出" + memcache.Delete("LockKey"));
memcache.Set("demoKey", "0");
//定义三个线程
Thread myThread1 = new Thread(new ParameterizedThreadStart(AddVal));
Thread myThread2 = new Thread(new ParameterizedThreadStart(AddVal));
Thread myThread3 = new Thread(AddVal);
myThread1.Start("1");
myThread2.Start("2");
myThread3.Start();
Console.WriteLine("等待两个线程结束");
Console.ReadKey();
} public static void AddVal(object num)
{
for (int i = 0; i < 500; i++)
{
//int result = int.Parse(memcache.Get("demoKey").ToString());
//memcache.Set("demoKey", (result + 1).ToString()); //如果0.5秒不释放锁 自动释放,避免死锁
if (memcache.Add("LockKey", "Hello World", DateTime.Now.AddSeconds(0.5)))
{
//得到锁
try
{
int result = int.Parse(memcache.Get("demoKey").ToString());
memcache.Set("demoKey", (result + 1).ToString()); //注意:这里最好加上主动去删除锁
//检查锁是否超时(直接去删除就可以)
memcache.Delete("LockKey");
}
catch (Exception ex)
{
//发生异常时也直接删除锁
memcache.Delete("LockKey");
}
}
else
{
i = i - 1; //没有得到锁时等待
}
}
Console.WriteLine("线程" + num + "结束,输出" + memcache.Get("demoKey"));
}
}
}

运行结果效果图说明:


Memcache分布式锁 转发 https://www.cnblogs.com/li150dan/p/9529090.html的更多相关文章
- MemCache在.NET中使用Memcached.ClientLibrary详解 转发 https://www.cnblogs.com/li150dan/p/9529112.html
本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法 首先下载客户端的3个dll,ICSharpCode.SharpZipLib.d ...
- Memcache分布式锁
在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限 下面通过一个简单例子介绍: 这里引用的是Memcached.ClientLibrary.d ...
- ElasticSearch(站内搜索) 转发 https://www.cnblogs.com/xibei666/p/5929970.html
简介 Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据.它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合.Elasticse ...
- .net core redis 驱动推荐,为什么不使用 StackExchange.Redis 转发 https://www.cnblogs.com/kellynic/p/9325816.html
前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 ...
- Cordova入门系列(二)分析第一个helloworld项目 转发 https://www.cnblogs.com/lishuxue/p/6015420.html
Cordova入门系列(二)分析第一个helloworld项目 版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了如何创建一个cordova android项目,这章我们介绍一下创建的 ...
- Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html
Cordova入门系列(三)Cordova插件调用 版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了cordova android项目是如何运行的,这一章我们介绍cordova的核心 ...
- Cordova入门系列(一)创建项目 转发 https://www.cnblogs.com/lishuxue/p/6008678.html
版权声明:本文为博主原创文章,转载请注明出处 Cordova是什么? 初学Cordova的人,虽然了解一点点,知道Cordova是用来将html, css, js变成app的,但并不知道到底是怎么用的 ...
- ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html
ActiveMQ安装配置及使用 ActiveMQ介绍 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JM ...
- Topshelf:一款非常好用的 Windows 服务开发框架 转发https://www.cnblogs.com/happyframework/p/3601995.html
背景 多数系统都会涉及到“后台服务”的开发,一般是为了调度一些自动执行的任务或从队列中消费一些消息,开发 windows service 有一点不爽的是:调试麻烦,当然你还需要知道 windows s ...
随机推荐
- 2017-11-09 中英文代码对比系列之Java一例
原文: https://zhuanlan.zhihu.com/p/30905033. 作者为本人. 这个系列将对同一段代码进行中文命名和英文命名两个版本的比较. 目的包括, 演示中文命名, 发现命名时 ...
- Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)
LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...
- MFC 键盘响应
键盘响应 插入函数:在...对话框/menu中进入建立类模式,建立preTranslateMessage(MSG * pMsg) 在CXXXView类中,添加: BOOL CMy9_1View::Pr ...
- 【效率工具】史上最好用的SSH一键登录脚本,超强更新!
说明 虽然已经是凌晨,但丝毫不能掩盖我激动的心情,今天完成了对GotoSSH的一次大更新,新增了两个肥肠实用的功能,我只能说,是真的好用,话不多说,先来看效果图: 普通的一键登录: 一键登录跳板机,然 ...
- CSS回顾(常见问题解决)
一.margin的塌陷解决: BFC (block format context)块级格式化上下文格式 display:inline-block float:left / right overflow ...
- python里用变量命名改善代码质量
编程时,总会遇到各种各样的变量,取一个好的变量名能够有效提高代码的可读性,而且python是一种,动态类型的语言,良好的变量名,能够在编写代码或者再次阅读代码时提高效率. 1. 变量名不要太宽泛,要有 ...
- [20181109]12c sqlplus rowprefetch参数5
[20181109]12c sqlplus rowprefetch参数5.txt --//这几天一直在探究设置sqlplus参数rowprefetch与arraysize的关系,有必要做一些总结以及一 ...
- js获取地址栏中的数据
window.location.href:设置或获取整个 URL 为字符串window.location.pathname:设置或获取对象指定的文件名或路径window.location.search ...
- NVIDIA显卡笔记本安装ubuntu驱动以及分辨率之详解
随着对ubuntu的了解,突然想在自己的笔记本上装一个双系统.在网上查了安装方法之后,发现因为nvidia显卡的原因会出现一些问题,结果在我自己装了之后发现问题要比看到的多,再看了无数个帖子之后,最终 ...
- webApi添加视图出现/Index.cshtml”处的视图必须派生自 WebViewPage 或 WebViewPage<TModel>。
是因为webApi Views文件夹下缺乏web.config文件,从mvc项目相同目录拷贝一个web.Config文件放入 删除多余的namespaces 即可 web.config配置如下: &l ...