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

wordpress仿站教程2018html网页模板怎么使用

wordpress仿站教程2018,html网页模板怎么使用,网站建设基本要素,吉安市建设局施工管理站网站基于redisson实现分布式锁 之前背过分布式锁几种实现方案的八股文#xff0c;但是并没有真正自己实操过。现在对AOP有了更深一点的理解#xff0c;就自己来实现一遍。 1、分布式锁的基础知识 分布式锁是相对于普通的锁的。普通的锁在具体的方法层面去锁#xff0c;单体应…基于redisson实现分布式锁 之前背过分布式锁几种实现方案的八股文但是并没有真正自己实操过。现在对AOP有了更深一点的理解就自己来实现一遍。 1、分布式锁的基础知识 分布式锁是相对于普通的锁的。普通的锁在具体的方法层面去锁单体应用情况下各个进入的请求都只能进入到一个应用里面也就能达到锁住方法的效果。 而分布式的系统将一个项目部署了多个实例通过nginx去做请求转发将请求分到各个实例。不同实例之间共用代码共用数据库这些。比如一个请求进入A实例获得了锁如果继续有请求进入A实例则会排队等待。但如果请求进入的是B实例呢B实例的锁和A实例没有关系那么进入B实例的请求也会获取到锁然后进入方法。这样锁的作用就没有达到。这种情况下就引出了分布式锁这是专门为了解决分布式系统的并发问题的。做法是让不同的实例都能使用同一个锁。比如redisredis内部是单线程的把锁放在redis这样就可以多个实例共用一个锁。 2、Redisson Redisson是架设在Redis基础上的一个Java驻内存数据网格In-Memory Data Grid。充分的利用了Redis键值数据库提供的一系列优势基于Java实用工具包中常用接口为使用者提供了一系列具有分布式特性的常用工具类。 利用Redisson可以很轻松就实现分布式锁。 3、实现的几个点 如何动态将拼接key所需的参数值传入到切面 有两种方案一种是通过给参数加上注解来标识那些参数是作为key使用的。在切面内通过获取方法的参数上的注解来获取所需的参数值。 另一种是通过定义key的参数名在切面获取方法参数的参数名进行对比一样的就是所需的参数。 获取锁失败如何重试 Redisson提供了重试的能力以及重试等待时长等。 4、代码实现 前置操作项目引入Redis 引入Redisson依赖 dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.13.6/version/dependency项目yaml文件 spring:#reids配置redis:database: 1host: 127.0.0.1port: 6379# redisson配置redisson:# 数据库编号database: 1# 节点地址address: redis://127.0.0.1:6379编写Redisson配置文件 package com.yumoxuan.myapp.config; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RedissonConfig {Value(${spring.redis.redisson.address})public String address;Value(${spring.redis.redisson.database})public Integer database;Beanpublic RedissonClient getRedissonClient(){Config confignew Config();config.useSingleServer().setAddress(address).setDatabase(database);return Redisson.create(config);} }定义分布式锁注解 package com.yumoxuan.myapp.core.aspect.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.concurrent.TimeUnit;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface DistributedLock {/*** 锁的名称* return*/String name() default ;/*** 锁的参数key* return*/String[] key() default {};/*** 锁过期时间* return*/int expireTime() default 30;/*** 锁过期时间单位* return*/TimeUnit timeUnit() default TimeUnit.SECONDS;/*** 等待获取锁超时时间* return*/int waitTime() default 10; }切面实现 package com.yumoxuan.myapp.core.aspect; import com.yumoxuan.myapp.core.aspect.annotation.DistributedLock; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; Slf4j Aspect Component public class DistributedLockAspect {Resourcepublic RedissonClient redissonClient;Pointcut(annotation(com.yumoxuan.myapp.core.aspect.annotation.DistributedLock))public void pointcut() {}Around(pointcut())public Object around(ProceedingJoinPoint point) throws Throwable {MethodSignature signature (MethodSignature) point.getSignature();Method method signature.getMethod();DistributedLock annotation method.getAnnotation(DistributedLock.class);String name annotation.name();String key name;String[] keys annotation.key();int expireTime annotation.expireTime();TimeUnit timeUnit annotation.timeUnit();int waitTime annotation.waitTime();Object[] args point.getArgs(); // 参数值String[] paramNames signature.getParameterNames(); // 参数名for (int i 0; i args.length; i) {String paramName paramNames[i];for (int j 0; j keys.length; j) {if (paramName.equals(keys[j])) {key key : args[i];}}}log.info(Thread.currentThread().getId() key:key);RLock lock redissonClient.getLock(key);boolean res false;Object obj null;try {if (waitTime -1) {res true;lock.lock(expireTime, timeUnit);} else {res lock.tryLock(waitTime, expireTime, timeUnit);}if (res) {obj point.proceed();} else {log.error(分布式锁获取异常);}} finally {//释放锁if (res) {lock.unlock();}}return obj;} }验证效果 ApiOperation(valuemy_app_user-添加, notesmy_app_user-添加)PostMapping(value /add)DistributedLock(name 添加分布式锁,key {userId})public Result? add(RequestBody MyAppUser myAppUser, String userId) {log.info(Thread.currentThread().getId() new Date());try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}return Result.ok();}如下图76.77的key是一样的从打印的时间上看两次打印时间相差了5秒说明后者被阻塞。而68的线程key和另外两个不一样所以没有被阻塞在76和77的中间就运行了。符合分布式锁的效果。 5、拓展 要实现一个功能完善的分布式锁其实还有很多内容。 比如锁要过期了但事务未执行完毕则需要进行锁续期这个可以通过守护线程实现。
http://www.w-s-a.com/news/258302/

相关文章:

  • 网站建设主体设计要求微信公众号缴费
  • 网站建设的税率WordPress多用户建站
  • 专业门户网站的规划与建设网络培训
  • 东莞汽车总站停止营业crm管理系统在线使用
  • 深圳网站建设公司哪个网络优化是做什么的
  • 大连地区做网站自己怎么做电影网站
  • 成都APP,微网站开发手机要访问国外网站如何做
  • 网站app建设用discuz做的手机网站
  • vs 2008网站做安装包公众号登录超时
  • 银川做网站推广wordpress dux会员中心
  • 双辽做网站wordpress怎么写html代码
  • 建站公司哪家好 知道万维科技西安都有哪些公司
  • 设计网站官网入口佛山 品牌设计
  • 专用网站建设wordpress mega
  • 网站建设与优化推广方案内容网站整站下载带数据库后台的方法
  • 做网站PAAS系统外链是什么意思
  • 网页设计专业设计课程googleseo排名公司
  • 网站百度百科那些免费网站可以做国外贸易
  • 做视频的网站有哪些南京计算机培训机构哪个最好
  • ppt做视频 模板下载网站商业街网站建设方案
  • 佛山网站定制开发星光影视园网站建设案例
  • wordpress子站点商务网页设计与制作微课版答案
  • 山东省住房城乡和建设厅网站软件开发主要几个步骤
  • 可以接项目做的网站网站源码php
  • 杭州广众建设工程有限公司网站网页游戏人气排行榜
  • 上海网站开发建设最简单的网站代码
  • 东莞做网站建设免费网站建设案例
  • 莱州建设局网站wordpress的主题下载地址
  • 二级网站域名长沙企业关键词优化服务质量
  • 在家有电脑怎么做网站wordpress 入门主题