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 ...
随机推荐
- idea编辑器快捷键调整
习惯了Eclipse中的删除快捷键,idea中的快捷键用着不是很适应,于是乎调整了下. idea编辑器快捷键调整: 默认:删除代码行:Ctrl+Y复制代码行:Ctrl+D在当前行之前添加一行: Ctr ...
- Python mysql 创建连接
安装 pymysql 模块 pip3 install pymysql # python2, 默认无 pip 命令 # python3, 默认自带 pip3 命令 mysql基本操作 # 导入 pymy ...
- vue从入门到进阶:简介(一)
前言 用了这么久的vue了,但是一直没有时间写个系列文章,现在抽一定时间总结下vue的知识点. 首先,Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript ...
- input的type类型
对部分生僻的input属性值解释: type="reset": 可以一键清空form表单里面所有的数据 <form> <input type="text ...
- Java 开源博客 Solo 1.9.0 发布 - 新皮肤
这个版本主要是改进了评论模版机制,让大家更方便皮肤制作,并发布了一款新皮肤:9IPHP. Solo 是一款一个命令就能搭建好的 Java 开源博客系统,并内置了 15+ 套精心制作的皮肤.除此之外,S ...
- 苹果8plus怎么录屏视频
现在越来越多的手机控,不管在什么地方,什么时候,都是低头看手机的居多,因为手机信息量太大了,一部手机就可以了解最新咨询,但是作为苹果8plus怎么录制手机屏幕,你们知道吗?今天就和大家一起分享苹果8p ...
- Android--手势及触摸事件的注意点(一)
实现onInterceptTouchEvent方法可以用来拦截父ViewGroup传递下来的所有触屏事件,可以将所有触屏事件交由此ViewGroup自身的onTouchEvent来处理,也可以继续传递 ...
- MFC Bresesnham算法
Bresesnham算法绘制直线段 Bresenham算法的意义:高效的将图形光栅化.其计算过程中均采用加法运算,故大大减少了程序的开销. 绘制直线段(MFC中) //传入参数:起点.终点,颜色 vo ...
- Android ListView的item背景色设置以及item点击无响应等相关问题
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的ite ...
- 跨域调用接口的方法之一:$.ajaxSetup()
跨域查询接口的数据,之前在公司时有发生过,产生的原因是,本地请求的域名或IP地址不一致,解除方法,也是修改域名和IP地址.比如: 接口中的数据来自IP地址:192.168.1.23/get.php 如 ...