【笔记8-Redis分布式锁】从0开始 独立完成企业级Java电商网站开发(服务端)

news/2024/5/19 13:30:18/文章来源:https://chenchenchen.blog.csdn.net/article/details/104264098

Redis分布式锁

Redis分布式锁命令

  • setnx当且仅当 key 不存在。若给定的 key 已经存在,则 setnx不做任何动作。setnx 是『set if not exists』(如果不存在,则 set)的简写,setnx 具有原子性。 
  • getset先 get 旧值,后set 新值,并返回 key 的旧值(old value),具有原子性。当 key 存在但不是字符串类型时,返回一个错误;当key 不存在的时候,返回nil ,在Java里就是 null。 
  • expire 设置 key 的有效期 
  • del 删除 key

Redis分布式锁流程图

file

Redis分布式锁优化版流程图

file

Spring Schedule Redis分布式锁,构建分布式任务调度

@Component@Slf4jpublic class CloseOrderTask {private static final Loggerlog = LoggerFactory.getLogger(CloseOrderTask.class);@Autowiredprivate IOrderServiceiOrderService;@PreDestroy  // 关闭Tomcat之前执行删除锁,避免死锁public void delLock(){RedisShardedPoolUtil.del(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}// @Scheduled(cron = "0 */1 * * * ?")//每一分钟(每个一分钟的整数倍)public void closeOrderTaskV1(){int hour=Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));log.info("关闭订单定时任务启动");iOrderService.closeorder(hour);log.info("关闭订单定时任务结束");}//  @Scheduled(cron = "0 */1 * * * ?")//每一分钟(每个一分钟的整数倍)public void closeOrderTaskV2(){log.info("关闭订单定时任务启动");// 锁超时时间long lockTimeout=Long.parseLong(PropertiesUtil.getProperty("lock.timeout","5000"));// 不存在则设置Long setnxResult= RedisShardedPoolUtil.setnx(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,String.valueOf(System.currentTimeMillis() lockTimeout));if(setnxResult!=null&&setnxResult.intValue()==1){//如果返回值是1,代表设置成功,获取锁closeOrder(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}else{log.info("没有获得分布式锁:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}log.info("关闭订单定时任务结束");}@Scheduled(cron ="0 */1 * * * ?")//每一分钟(每个一分钟的整数倍)public void closeOrderTaskV3(){log.info("关闭订单定时任务启动");//锁超时时间long lockTimeout=Long.parseLong(PropertiesUtil.getProperty("lock.timeout","5000"));Long setnxResult= RedisShardedPoolUtil.setnx(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,String.valueOf(System.currentTimeMillis() lockTimeout));if(setnxResult!=null&&setnxResult.intValue()==1){//如果返回值是1,代表设置成功,获取锁closeOrder(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}else{//未获取到锁,继续判断,判断时间戳,看是否可以重置并获取到锁String lockValueStr=RedisShardedPoolUtil.get(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);if(lockValueStr!=null&&System.currentTimeMillis()>Long.parseLong(lockValueStr)){String getSetResult=RedisShardedPoolUtil.getSet(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,String.valueOf(System.currentTimeMillis() lockTimeout));//再次用当前时间戳getset//返回给定的key的旧值,-》旧值判断,是否可以获取锁//当key没有旧值时,即key不存在时,返回nil->获取锁//这里我们set了一个新的value值,获取旧的值if(getSetResult==null||(getSetResult!=null&& StringUtils.equals(lockValueStr,getSetResult))){//真正获取到锁closeOrder(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}else{log.info("没有获取到分布式锁:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}}else{log.info("没有获取到分布式锁:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}}log.info("关闭订单定时任务结束");}private void closeOrder(String lockName){RedisShardedPoolUtil.expire(lockName,50);//有效期5秒,防止死锁log.info("获取{} ,ThreadName:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,Thread.currentThread().getName());int hour=Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));//  iOrderService.closeorder(hour);RedisShardedPoolUtil.del(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);log.info("释放{} ,ThreadName:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,Thread.currentThread().getName());log.info("============================");}}

Tomcat集群快速入门

Nginx负载均衡配置、常用策略、场景及特点

  • 轮询(默认)

file

  • 权重

file

  • ip hash

file

  • url hash(第三方)

file

  • fail(第三方)

file

Nginx Tomcat搭建集群

https://blog.csdn.net/LeonJinhaiSun/article/details/97640796

Tomcat集群快速入门

https://blog.csdn.net/LeonJinhaiSun/article/details/97624274

https://blog.csdn.net/LeonJinhaiSun/article/details/97631761

参考:

https://www.jianshu.com/p/ca88c1f86069

https://blog.csdn.net/qq_20057315/article/details/81624821

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_751760.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多网站项目的 CSS 架构

复杂的 CSS 架构,可不是你在科班里能学到的东西。 我在互联网行业的第四份工作,是在我国一家领先的媒体新闻公司中任职一名 CSS/HTML 专家,我的主要职责就是开发可重用的、可扩展的、用于多网站的 CSS 架构。 在本文中,我将与大家…

部署网站(虚拟主机,MVC站点,前后台,百度编辑器)出现的问题

开发工具:Vs2010 数据库:Sql2008 部署主机:万网虚拟主机,支持.NET 4.0 / 4.5 SQL2008 等.. 出现问题1:无法访问页面 出现问题2:后台无法访问 出现问题3:使用的编辑器是百度的UM,有使用到的地方…

电商详情页缓存架构(一)电商网站的商品详情页架构

小型电商网站的商品详情页的页面静态化架构以及其缺陷 小型电商网站,一般使用页面静态化的方案,提前将数据渲染到模板中。 问题:每次模板变更,模板对应的所有数据需要全部重新渲染 大型电商网站的异步多级缓存构建 nginx 数据本…

云南楚雄做网站找哪家?

2019独角兽企业重金招聘Python工程师标准>>> 云南楚雄做网站哪家强? 点击进入:http://www.anline.cn 转载于:https://my.oschina.net/jiankian/blog/614142

一分钟了解阿里云产品:利用Rsync服务SLB下多台centos服务器网站文件同步更新...

易淘帮使用了SLB负载均衡,为了保证SLB下两台服务器下面的网站文件同步,易淘帮采用了rsync服务进行同步,每三分钟进行同步一次。 简单介绍下reync,rsync—remote synchronize是类unix系统下的数据镜像备份工具,它的特性…

从全球最大同性交友网站抄了一份不一样的2048小游戏

大家好,我是“前端点线面”,一位新生代农民工,欢迎关注我获取最新前端知识和《前端百题斩》pdf版(包括JS基础篇、浏览器篇、网络篇共计50个章节,5万多字),此外有喜欢划水的老铁们,可以加我进“前端划水群”…

10个大佬经常逛的小网站,各个爆款!!!

欢迎和号主【前端点线面】进群盘算法,此外本号干货满满:14个门类(100篇原创)内容(又干又硬)、《前端百题斩》pdf(助力薪资double)、20篇思维导图(知识系统化、记忆简单化…

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构,MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型,我们可以从中获取很多有关网站架构方面的知识,看了之后你会发现你原来的想法很可能…

【问底】徐汉彬:大规模网站架构的缓存机制和几何分形学

【导读】徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设。 在过去的工作中,徐汉彬从事各类缓存建设和优化,遇到问题无数&#xf…

npm的gh-pages结合github发布repository网站

如果你在使用github而且创建了一个新的仓库,你会发现,在仓库设置里面有结合github pages发布网站的设置,如下所示: 用过github pages都知道它可以做为静态网站来处理比如html和markdown的文件产生预览效果,我之前做过类…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

大型网站技术架构(四)网站的高性能架构

2019独角兽企业重金招聘Python工程师标准>>> 网站性能是客观的指标,可以具体体现到响应时间、吞吐量、并发数、性能计数器等技术指标。 1、性能测试指标 1.1 响应时间 指应用执行一个操作需要的时间,指从发出请求到最后收到响应数据所需要的时…

网站安全认证系统的设计变迁

网站在从小到大的发展历程中,安全认证系统是如何变迁的? 下面我们从其发展的几个阶段来分下: 阶段1: 起步,注册用户很少,两台服务器,一台应用服务器,一台数据库服务器。 用户登陆后在…

如何通过IP地址来访问网站

今天我们写极少量的代码,来实现用IP地址来访问一个网站。步骤如下: 打开命令提示符,输入以下代码: (这里用CSDN官网https://www.csdn.net/为例) 输入代码ping csdn.net /n 5 复制上面正在 Ping csdn.net […

网站推荐——洛谷

粉丝福利 【洛谷】(链接在最后)是一个我感觉非常良心的网站。自从五月以来,我一直在学习C语言,明年参加CSP大赛,自然少不了刷题。 这个网站我觉得最好的地方,就是它有很多比赛的题库: 有很多…

SEO和SEM策略:建立工作关系

SEO和SEM策略:建立工作关系 原文地址http://www.semorseo.com/1601.html SEO和SEM策略之间的关系将互联网营销的两个方面联系在一起。通过凝聚力,SEO和SEM关系导致更有效的整体策略。许多策略可以利用您的SEO来帮助您的SEM,反之亦然。 创建有…

Java小应用目录快速变网站

1. 简介 快速将一个目录变成静态站点的Java小应用 2. 程序下载 https://github.com/broncho/oss/raw/master/blog/directory-website-1.0.0.jar 3. 依赖环境 JRE 1.6 4. 使用说明 5. 运行 转载于:https://blog.51cto.com/aiilive/2285524

chrome v69 设置网站允许 flash

为什么80%的码农都做不了架构师?>>> **问题描述:**升级 Chrome V69 以后,发现之前通过 Setting -> Content Settings -> Flash -> Allow 列表里添加的允许运行 flash 的网站列表已经没有了,而且也没有了新增…

微软正式发布Azure Storage上的静态网站

微软正式宣布了Azure Storage上的静态网站,提供了从托管在Azure Storage上的HTML、CSS和JavaScript文件提供内容的能力。静态网站包含内容固定的Web页面,同时仍然允许利用JavaScript等客户端代码来创建丰富的用户体验。 有了这个新功能,继用于…

网站推广必备手册:SEO教程:搜索引擎优化入门与进阶(第2版)

网站推广必备手册:SEO教程:搜索引擎优化入门与进阶(第2版)【作  者】吴泽欣 [同作者作品] [作译者介绍] 【丛 书 名】 图灵程序设计丛书 【出 版 社】 人民邮电出版社 【书 号】 9787115213389 【上架时间】 2009-11-19 【出版日期】 2009 年12月 【开 本】 16开 编…