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

龙岩人才网最新招聘597优化大师会员兑换码

龙岩人才网最新招聘597,优化大师会员兑换码,成立公司怎么做网站,雅虎网站提交前言 Redisson 在基于 NIO 的 Netty 框架上,充分的利⽤了 Redis 键值数据库提供的⼀系列优势,在Java 实⽤⼯具包中常⽤接⼝的基础上,为使⽤者提供了⼀系列具有分布式特性的常⽤⼯具类。使得原本作为协调单机多线程并发程序的⼯具包获得了协调…

前言

Redisson 在基于 NIO 的 Netty 框架上,充分的利⽤了 Redis 键值数据库提供的⼀系列优势,在Java 实⽤⼯具包中常⽤接⼝的基础上,为使⽤者提供了⼀系列具有分布式特性的常⽤⼯具类。使得原本作为协调单机多线程并发程序的⼯具包获得了协调分布式多机多线程并发系统的能⼒,⼤⼤降低了设计和研发⼤规模分布式系统的难度。同时结合各富特⾊的分布式服务,更进⼀步简化了分布式环境中程序相互之间的协作。

1、redisson工作原理

在这里插入图片描述

2、看门狗原理

A服务先运行,在运行B服务,还没释放A的锁,A就挂了,会不会死锁呢?
答:没有导致死锁,因为底层有看门狗机制
默认指定锁时间为30s(看门狗时间)
锁的自动续期:若是业务超长,运行期间自动给锁上新的 30s,不用担心业务时间过长,锁就自动过期
加锁的业务只要运行完成,就不会给当前锁续期,及时不手动解锁,锁默认在30s 后自动删除。

3、spring boot与redisson的整合

3.1、添加库存服务:

stock-service

3.2、添加依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.0.4.0</version></dependency>--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.19.1</version></dependency>

3.3、添加配置

3.3.1、单机

redisson:addr:singleAddr:host: redis://localhost:6379password: 123456database: 0pool-size: 10

3.3.2、集群

redisson:addr:cluster:hosts: redis://47.96.11.185: 6370,...,redis://47.96.11.185:6373password : 123456

3.3.3、主从

redisson:addr:masterAndSlave:masterhost: redis : //47.96.11.185 : 6370slavehosts: redis://47.96.11.185: 6371,redis://47.96.11.185:6372password : 123456database : 0

3.4、配置RedissonClient

3.4.1、单机

/*** 配置RedissonClient*/
@Configuration
public class RedissonConfig {@Value("${redisson.addr.singleAddr.host}")private String host;@Value("${redisson.addr.singleAddr.password}")private String password;@Value("${redisson.addr.singleAddr.database}")private int database;@Value("${redisson.addr.singleAddr.pool-size}")private int poolSize;@Beanpublic RedissonClient redissonClient(){Config config = new Config();config.useSingleServer().setAddress(host).setPassword(password).setDatabase(database).setConnectionPoolSize(poolSize).setConnectionMinimumIdleSize(poolSize);return Redisson.create(config);}
}

3.4.2、集群

/*** 配置RedissonClient*/
@Configuration
public class RedissonConfig {@Value("${redisson.addr.cluster.hosts}")private String hosts;@Value("${redisson.addr.cluster.password}")private String password;/*** 集群模式** @return*/@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useClusterServers().addNodeAddress(hosts.split("[,]")).setPassword(password).setScanInterval(2000).setMasterConnectionPoolSize(10000).setSlaveConnectionPoolSize(10000);return Redisson.create(config);}
}

3.4.3、集群

/*** 配置RedissonClient*/
@Configuration
public class RedissonConfig {@Value("${redisson.addr.masterAndSlave.masterhost}")private String masterhost;@Value("${redisson.addr.masterAndSlave.slavehosts}")private String slavehosts;@Value("${redisson.addr.masterAndSlave.password}")private String password;@Value("${redisson.addr.masterAndSlave.database}")private int database;/*** 主从模式** @return*/@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useMasterSlaveServers().setMasterAddress(masterhost).addSlaveAddress(slavehosts.split("[,]")).setPassword(password).setDatabase(database).setMasterConnectionPoolSize(10000).setSlaveConnectionPoolSize(10000);return Redisson.create(config);}
}

3.5、Redisson的使用

  • 获取锁 —— 公平锁和⾮公平锁
    // 获取公平锁
    RLock lock = redissonClient . getFairLock ( skuId );
    // 获取⾮公平锁
    RLock lock = redissonClient . getLock ( skuId );
  • 加锁 —— 阻塞锁和⾮阻塞锁
    // 阻塞锁(如果加锁成功之后,超时时间为 30s ;加锁成功开启看⻔狗,剩 5s 延⻓过期时间)
    lock . lock ();
    // 阻塞锁(如果加锁成功之后,设置⾃定义 20s 的超时时间)
    lock . lock ( 20 , TimeUnit . SECONDS );
    // ⾮阻塞锁(设置等待时间为 3s ;如果加锁成功默认超时间为 30s )
    boolean b = lock . tryLock ( 3 , TimeUnit . SECONDS );
    // ⾮阻塞锁(设置等待时间为 3s ;如果加锁成功设置⾃定义超时间为 20s )
    boolean b = lock . tryLock ( 3 , 20 , TimeUnit . SECONDS );
  • 释放锁
    lock . unlock ();
  • 应⽤示例
    // 公平⾮阻塞锁
    RLock lock = redissonClient . getFairLock ( skuId );
    boolean b = lock . tryLock ( 3 , 20 , TimeUnit . SECONDS );
  • 减库存加锁案例

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/stock")
public class StockController {@Autowiredprivate RedissonClient redissonClient;@GetMapping("/reduceStock")public void reduceStock(@RequestParam String productId){// 获取⾮公平锁RLock lock = this.redissonClient.getLock("stock:" + productId);// 阻塞锁(如果加锁成功之后,设置⾃定义 20s 的超时时间)lock.lock(30, TimeUnit.SECONDS);System.out.println("加锁成功." + Thread.currentThread().getName());try {TimeUnit.SECONDS.sleep(25);} catch (InterruptedException e) {e.printStackTrace();}finally {System.out.println("解锁成功." + Thread.currentThread().getName());lock.unlock();}}
}

测试:浏览器发起两次两次减库存
http://localhost:8099/stock/reduceStock?productId=001

3.6、aop实现分布式锁

3.6.1、定义注解

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 DistributeLock {/*** 参数下标* @return*/int[] lockIndex() default {-1} ;/*** 锁的等待时间* @return*/long waitTime() default 3000;/*** 时间单位* @return*/TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
}

3.6.2、定义切面

/*** 定义分布式锁的切面*/
@Component
@Aspect
public class DistributeLockAspect {@Autowiredprivate RedissonClient redissonClient;@Around(value = "@annotation(lock)")public void distibuteLock(ProceedingJoinPoint proceedingJoinPoint, DistributeLock lock){Signature signature = proceedingJoinPoint.getSignature();StringBuilder stringBuilder = new StringBuilder();//方法所属的类String declaringTypeName = signature.getDeclaringTypeName();String name = signature.getName();stringBuilder.append(declaringTypeName);stringBuilder.append(name);//获取调用方法的参数Object[] args = proceedingJoinPoint.getArgs();int[] ints = lock.lockIndex();if(args != null) {final int length = args.length;if (length >0) {//考虑下标越界for (int anInt : ints) {//把合法下标值放到sbif (anInt >= 0 && anInt < length){stringBuilder.append(JSON.toJSONString(args[anInt]));}}}}//将方法的信息转成md5,作为锁的标识String key = SecureUtil.md5(stringBuilder.toString());//获取锁RLock rLock = redissonClient.getLock(key);//从注解获取时间单位TimeUnit timeUnit = lock.timeUnit();//从注解等待时间long waitTime = lock.waitTime();//执行业务代码try {//加锁rLock.tryLock(waitTime,timeUnit);System.out.println("成功加锁。" + Thread.currentThread().getName());proceedingJoinPoint.proceed();} catch (Throwable e) {e.printStackTrace();}finally {//解锁rLock.unlock();System.out.println("成功解锁。" + Thread.currentThread().getName());}}
}

注解的使用:

@DistributeLock(lockIndex = {0,1},waitTime = 3,timeUnit = TimeUnit.SECONDS)
http://www.dt0577.cn/news/50756.html

相关文章:

  • 中国最顶尖设计师上海专业seo
  • 国外做问卷网站手机优化软件哪个好用
  • 汽车最好网站建设国家卫健委最新疫情报告
  • 网站设计所用的软件黑科技引流工具
  • 国外科技类网站著名的网络营销案例
  • 做网站的公司如何运营网络服务器图片
  • 高手做网站焦作seo公司
  • 荆州网站建设 众火网谷歌三件套一键安装
  • 模仿网站建设站建设seo优化招商
  • 长沙哪些公司做网站网络营销业务流程
  • 百度推广 做网站搜索引擎排名机制
  • 动效做的好的网站怎样制作属于自己的网站
  • 歪歪小站 wordpress创建个人网站的流程
  • 杭州大的做网站的公司百度竞价排名是什么方式
  • 官网站内优化怎么做买了500元黑科技引流靠谱吗
  • 推广引流渠道平台seo费用价格
  • 做网站买完域名还需要什么甲马营seo网站优化的
  • 网站做关键词链接有用吗南昌seo实用技巧
  • 用织梦做的网站ftp怎么登陆最好的免费建站网站
  • 唐山正规做网站的公司哪家好南宁网站推广大全
  • css3网站案例一键搭建网站
  • 做拍卖网站需要多少钱发布软文平台
  • 公司建设网站需要什么条件优量汇广告平台
  • 杭州 高端网站建设清博舆情系统
  • 企业网站建设方案范本白酒最有效的推广方式
  • wordpress发文章下载宁波seo智能优化
  • 做拼多多网站免费课程佛山百度关键词排名
  • 做苗木比较好的网站2023新闻摘抄大全
  • 网站维护北京南京seo培训
  • dz网站建设小时seo加盟