当前位置: 首页 > news >正文

iis网站拒绝显示此网页公司企业网站建设多少钱

iis网站拒绝显示此网页,公司企业网站建设多少钱,东莞网站建设哪里好,建设网站注意哪几点1前言 日常开发中,难免遇到一些并发的场景,为了保证接口执行的一致性,通常采用加锁的方式,因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized这些就先放到一边了,Redis的setnx锁存在无法抱保证…

1前言

日常开发中,难免遇到一些并发的场景,为了保证接口执行的一致性,通常采用加锁的方式,因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized这些就先放到一边了,Redis的setnx锁存在无法抱保证原子性的问题就暂时搁且到一边,直接上大招Redisson也是我最近开发项目中基本都在用的缓存,并且也都是用它的分布式锁机制。

2Redisson分布式锁常规使用

关于Redisson的一些基本概念,本章就不做太详细的说明了,有兴趣的小伙伴可以自己去了解下,主要说下加锁的常规使用,Redisson分布式锁是基于Redis的Rlock锁,实现了JavaJUC包下的Lock接口。

Lock

public void getLock(){//获取锁RLock lock = redisson.getLock("Lxlxxx_Lock");try {// 2.加锁lock.lock();} catch (InterruptedException e) {e.getStackTrace();} finally {// 3.解锁lock.unlock();System.out.println("Finally,释放锁成功");}

getLock获取锁,lock.lock进行加锁,会出现的问题就是lock拿不到锁一直等待,会进入阻塞状态,显然这样是不好的。

TryLock

返回boolean类型,和Reentrantlock的tryLock是一个意思,尝试获取锁,获取到就返回true


RLock lock = redisson.getLock(name);
try {if (lock.tryLock(2, 10, TimeUnit.SECONDS)) {//执行业务逻辑} else {System.out.println("已存在");}
} catch (InterruptedException e) {e.printStackTrace();
}finally {
//判断当前线程持有的锁是不是处于锁定状态,锁定状态再进行释放if (this.redissonLock.isHeldByCurrentThread(lockName)) {this.redissonLock.unlock(lockName);}
}

3自定义注解实现锁机制

通常我们都会将redisson实例注入到方法类里面,然后调用加锁方法进行加锁,如果其他业务方法也需要加锁执行,将会产生很多重复代码,由此采用AOP切面的方式,只需要通过注解的方式就能将方法进行加锁处理。另外,搜索公众号Linux就该这样学后台回复“猴子”,获取一份惊喜礼包。

自定义注解

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface DistributedLock {String key() default "";int leaseTime() default 10;boolean autoRelease() default true;String errorDesc() default "系统正常处理,请稍后提交";int waitTime() default 1;
}

切面类实现

@Aspect
@Component
public class DistributedLockHandler {private static final Logger log = LoggerFactory.getLogger(DistributedLockHandler.class);@AutowiredRedissonLock redissonLock;public DistributedLockHandler() {}@Around("@annotation(distributedLock)")public Object around(ProceedingJoinPoint joinPoint, DistributedLock distributedLock) throws Throwable {String lockName = this.getRedisKey(joinPoint, distributedLock);int leaseTime = distributedLock.leaseTime();String errorDesc = distributedLock.errorDesc();int waitTime = distributedLock.waitTime();Object var8;try {boolean lock = this.redissonLock.tryLock(lockName, (long)leaseTime, (long)waitTime);if (!lock) {throw new RuntimeException(errorDesc);}var8 = joinPoint.proceed();} catch (Throwable var12) {log.error("执行业务方法异常", var12);throw var12;} finally {if (this.redissonLock.isHeldByCurrentThread(lockName)) {this.redissonLock.unlock(lockName);}}return var8;}/***  获取加锁的key* @param joinPoint* @param distributedLock* @return*/private String getRedisKey(ProceedingJoinPoint joinPoint, DistributedLock distributedLock) {String key = distributedLock.key();Object[] parameterValues = joinPoint.getArgs();MethodSignature signature = (MethodSignature)joinPoint.getSignature();Method method = signature.getMethod();DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();String[] parameterNames = nameDiscoverer.getParameterNames(method);if (StringUtils.isEmpty(key)) {if (parameterNames != null && parameterNames.length > 0) {StringBuffer sb = new StringBuffer();int i = 0;for(int len = parameterNames.length; i < len; ++i) {sb.append(parameterNames[i]).append(" = ").append(parameterValues[i]);}key = sb.toString();} else {key = "redissionLock";}return key;} else {SpelExpressionParser parser = new SpelExpressionParser();Expression expression = parser.parseExpression(key);if (parameterNames != null && parameterNames.length != 0) {EvaluationContext evaluationContext = new StandardEvaluationContext();for(int i = 0; i < parameterNames.length; ++i) {evaluationContext.setVariable(parameterNames[i], parameterValues[i]);}try {Object expressionValue = expression.getValue(evaluationContext);return expressionValue != null && !"".equals(expressionValue.toString()) ? expressionValue.toString() : key;} catch (Exception var13) {return key;}} else {return key;}}}
}

具体使用

方法头加自定义注解,key参数代表需要加锁的key,errorDesc获取锁失败提示报错信息。

这边我将项目通过修改端口启动了两个服务,分别是8460和8461

通过postman调用这两个服务,模拟两个服务同时获取一把锁的场景,其中一个服务拿到锁,

可以看到端口8460服务先拿到锁,8461服务tryLock获取锁失败,实现了加锁逻辑

分布式锁的使用场景还是需要多注意下,根据业务场景来,并发量不大的情况下,其实没有

http://www.yayakq.cn/news/470027/

相关文章:

  • 山东济南网站建设如何网上赚点零花钱
  • 做电源的网站怎么制作相册
  • 东莞网站制作的公司电影网站的建设
  • 石材做网站细节福田做棋牌网站建设哪家技术好
  • 江苏城市建设职业学院网站做药品网站有哪些内容
  • 襄阳网站建设网站核心推广思路
  • 网站 扁平化句容建设局网站
  • 中山网站搭建竞价推广工具
  • 建设电子商务网站市场分析建设医药网站前要做什么审核
  • 可以注销的网站微信小程序免300元认证费
  • 做网站的公司盐城网络信息有限公司
  • 服装网站建设发展状况产品的seo是什么意思
  • 淘宝店铺装网站导航怎么做WordPress单栏二次元主题
  • 阿里云添加网站做ghost系统的网站有哪些
  • 贵金属网站模板桥梁建设杂志网站
  • 广西省住房和城乡建设厅网站ps做游戏下载网站
  • 自己建设论坛网站wordpress调整上传文件
  • 临沂做商城网站建设网页设计网站开发培训
  • dede做漫画网站的案例济南seo网络优化公司
  • 做网站用什么比较好菲律宾做网站
  • 现在 做网站 技术路线自己的网站打不开了
  • 做网站需要icp搜索引擎关键词seo优化公司
  • 高端网站制作上海站霸科技制作excel表格全步骤
  • asp网站 上传空间网站是怎么建设的
  • 专业俄语网站设计wordpress前台慢
  • 虚拟主机建设网站绑定域名没有办公地点怎么注册自己的公司
  • 定制家具品牌排行榜前十名宁波seo咨询
  • 宁夏建设厅网站6泉州关键词优化
  • 网站建设推广公司需要哪些岗位公司 网站制作
  • 网站建设优惠中网站app建设需要资源