SSDB分布式并发锁设计
来源:互联网 发布:淘宝查看付款排名 编辑:程序博客网 时间:2024/05/19 15:43
需求分析:
- 在分布式环境下,sychronized关键字并不能起到对资源加锁的作用,因为sychronized只能在同一个JVM中起作用,因此需要设计适合分布式应用部署的分布式并发锁,保证各个应用对同一资源的访问仍然有序进行
- SSDB能对分布式应用提供统一的基于内存的存储服务,而且性能很高,因此可被用来设计分布式锁,当然Redis也可以
详细设计:
- 基础:SSDB操作是单线程的,并且是原子的,因而不会有并发干扰问题,所有访问都是串行的
- 原理:
- 核心就是利用ssdb的incr操作,当第一个线程A来访问资源的时候,对key进行incr操作(此时key在ssdb中并没有值),结果为1,可以访问
- 再有线程B来访问资源时,如果第一个线程A还没有释放锁(del(key)),这时进行incr操作结果将大于1,表示资源已被锁住,不可访问
- 接下来线程B就每间隔一段时间循环执行incr操作,当第一个线程A释放锁(del(key))后,incr操作将返回1,此时获得锁,就可访问资源了
- 如下图所示
- 需注意的地方
- 为防止意外原因导致线程锁住资源不放,每次incr(key)获得结果为1后,需要对key设置过期时间(ssdb.expire),一旦超过这个时间锁仍未释放,则ssdb自动删除key,这样接下来的线程将获得锁,过期时间应根据具体业务情况而定,我设置的是默认60s,可以在具体使用时再定义
- 当一个线程获取锁后,不可能立即释放,因此另一个线程来循环获取锁时,没必要不间断运行,可隔一个较短的时间再去尝试获取锁,我设置的是100ms
代码
@Component("ssdbLock")public class SSDBLock{ @Resource(name = "ssdbTemplate") private SSDBTemplate ssdbTemplate; private String lockKey = "ssdb:lock"; private int ttl = 60; /** * 锁操作,默认key和过期时间 * @throws Exception */ public void lock() throws Exception{ lock(lockKey, ttl); } /** * 锁操作,指定key和过期时间 * @param lockKey * @param ttl * @throws Exception */ public void lock(String lockKey, int ttl) throws Exception{ boolean flag = getLock(lockKey, ttl); while(!flag){ Thread.sleep(WebConstants.DEFAULT_RETRY_LOCK_TERM); flag = getLock(lockKey, ttl); } } /** * 获取锁 * @param lockKey * @param ttl * @return * @throws Exception */ private boolean getLock(String lockKey, int ttl) throws Exception{ boolean lock = false; Long result = ssdbTemplate.incr(lockKey); if(result == 1){ lock = true; ssdbTemplate.expire(lockKey, ttl); } return lock; } /** * 释放锁,默认key */ public void unlock(){ try { ssdbTemplate.delete(lockKey); } catch (Exception e) { LoggerUtils.error(e); } } /** * 释放锁,指定key * @param lockKey */ public void unlock(String lockKey){ try { ssdbTemplate.delete(lockKey); } catch (Exception e) { LoggerUtils.error(e); } }}
0 0
- SSDB分布式并发锁设计
- SSDB分布式并发锁设计
- 基于SSDB的分布式锁
- ssdb get的设计问题
- java并发,分布式锁
- java并发 分布式锁
- ssdb
- ssdb
- SSDB
- 高并发服务端分布式系统设计概要
- 高并发服务端分布式系统设计概要
- 高并发服务端分布式系统设计概要
- 高并发服务端分布式系统设计概要
- 高并发服务端分布式系统设计概要
- 高并发服务端分布式系统设计概要
- redis并发问题 && 分布式锁
- 分布式并发
- 高并发服务端分布式系统设计概要(上)
- iOS 大型项目开发漫谈
- Spring MVC详解(四) Controller接口控制器详解(1)
- 整理网上资料---C标准库值篇二 :标准库源码下载地址、标准库手册下载地址
- ios禁用多按钮同时点下的效果
- 用浏览器跳转APP研究方案记录
- SSDB分布式并发锁设计
- Java虚拟机类加载机制浅谈
- 多线程编程2-NSOperation
- Spring Quartz Java工程版和Web工程版示例
- 微信开发第五篇手机端微信公众号自定义菜单及OAuth2.0授权页面
- Windows系统下,查看端口占用情况杀掉端口占用进程
- 关于linux内核中的"__attribute__ ((packed))"
- vi/vim 注释字体颜色的设置
- Spring MVC详解(四)接口控制器详解(2)