win8风格网站模板,wordpress删除修订版本,网站优化试卷,南宁网站建设专家文章目录 分布式锁1、什么是分布式锁#xff1a;2、分布式锁应该具备哪些条件#xff1a; 基于数据库的分布式锁代码传送代码运行 分布式锁
1、什么是分布式锁#xff1a;
分布式锁#xff0c;即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题… 文章目录 分布式锁1、什么是分布式锁2、分布式锁应该具备哪些条件 基于数据库的分布式锁代码传送代码运行 分布式锁
1、什么是分布式锁
分布式锁即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题而分布式锁就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是分布式系统中竞争共享资源的最小粒度从线程升级成了进程。
2、分布式锁应该具备哪些条件
在分布式系统环境下一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 高性能的获取锁与释放锁 具备可重入特性可理解为重新进入由多于一个任务并发使用而不必担心数据错误 具备锁失效机制即自动解锁防止死锁 具备非阻塞锁特性即没有获取到锁将直接返回获取锁失败
基于数据库的分布式锁
核心代码
Slf4j
Component
public class ScheduleJob
{private String key job001;AutowiredJdbcTemplate jdbcTemplate;String ip;/*** 初始化*/PostConstructpublic void init(){long count jdbcTemplate.queryForObject(SELECT count(*) FROM t_schedule_lock WHERE key_name?, Long.class, key);if (count 0){jdbcTemplate.update(INSERT INTO t_schedule_lock(key_name, time) VALUES(?, now()), key);}try{ip InetAddress.getLocalHost().getHostAddress();}catch (UnknownHostException e){}}Scheduled(cron 0/10 * * * * ?)public void run(){try{if (getLock(9L)){log.info([{}] #### hello world ***********, ip);}else{log.info([{}] 没抢到骂骂咧咧的走了......, ip);}}catch (Exception e){log.error(e.getMessage(), e);}}/*** 获取lock,并更新time为下次执行时间 now() secondsBR* * 注意: 为了保证jdbcTemplate.update执行成功一般设置seconds稍小于Scheduled设置的运行间隔秒数* * return*/private boolean getLock(long seconds){return jdbcTemplate.update(UPDATE t_schedule_lock SET time adddate(now(), INTERVAL ? SECOND) WHERE key_name ? AND now() time, seconds, key) 0;}
}
代码传送
https://gitee.com/00fly/effict-side/tree/master/springboot-schedule
项目已经实现了maven插件打包镜像上传阿里云镜像仓库。
代码运行
下载docker文件下的这2个文件上传至带有docker-compose以及docker环境的服务器 运行命令
sh scale.shdocker psdocker logs -f containerId运行效果图 有任何问题和建议都可以向我提问讨论,大家一起进步谢谢!
-over-