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

怎么判断一个网站做的好不好如何销售自己产品方法有哪些

怎么判断一个网站做的好不好,如何销售自己产品方法有哪些,做网站有没有效果,重庆锅炉网站建设公司1. 库存超卖问题重现 下面这段代码在多线程下存在线程安全问题! 超卖的主要原因是下面的步骤不是原子性的。 判断库存是否充足。库存扣减 public String deductProduct(String userId) {int stock Integer.parseInt(stringRedisTemplate.opsForValue().get(&quo…

1. 库存超卖问题重现

下面这段代码在多线程下存在线程安全问题!
超卖的主要原因是下面的步骤不是原子性的。

  1. 判断库存是否充足。
  2. 库存扣减
public String deductProduct(String userId) {int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));log.info("开始扣减库存");//加锁,分布式锁if (stock > 0) {int stockAfterDeduction = stock - 1;stringRedisTemplate.opsForValue().set("stock", String.valueOf(stockAfterDeduction));log.info("扣减库存成功,现库存为 {}", stockAfterDeduction);} else {log.error("库存不足,现库存为:{}", stock);}return "操作成功!";
}

==> 单机情况下,可以加锁(synchronized | ReentrantLock)解决这个线程安全问题。


但是在分布式场景下,必须使用分布式锁解决这个问题。

2. 手写简单分布式锁

set key value nx ex

2.1 可以基于set nx ex实现一个简单的分布式锁

public interface ILock {/*** 尝试获取锁* @param timeoutSecond 锁持有的超时时间,过期后自动删除* @return 是否加锁成功*/boolean tryLock(long timeoutSecond);/*** 释放锁*/void unLock();
}

2.2 分布式锁-实现加锁和解锁流程

public class SimpleRedisLock implements ILock {private static final String KEY_PREFIX = "lock:";//分布式中,集群的标识符uuid,用于表示集群中的每个节点private static final String ID_PREFIX = UUID.randomUUID().toString(true) + ":";//解锁的lua脚本,用于防止锁误删private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;private final String name; //锁的名字private final StringRedisTemplate stringRedisTemplate;public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {this.name = name;this.stringRedisTemplate = stringRedisTemplate;}static {//初始化 unlock.lua脚本文件UNLOCK_SCRIPT = new DefaultRedisScript<>();UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));UNLOCK_SCRIPT.setResultType(Long.TYPE);}@Overridepublic boolean tryLock(long timeoutSecond) {//获取线程标识,uuid + thread-idString threadId = ID_PREFIX + Thread.currentThread().getId();Boolean isLock = stringRedisTemplate.opsForValue()//基于set nx ex实现分布式锁.setIfAbsent(KEY_PREFIX + name, threadId, timeoutSecond, TimeUnit.SECONDS);return Boolean.TRUE.equals(isLock);}@Overridepublic void unLock() {//删除锁,要防止锁误删(lua脚本)stringRedisTemplate.execute(UNLOCK_SCRIPT,Collections.singletonList(KEY_PREFIX + name),ID_PREFIX + Thread.currentThread().getId());}
}

2.3 lua脚本实现

if (redis.call('get', KEYS[1]) == ARGV[1])
then-- 一致的话,就删除锁return redis.call('del', KEYS[1])
end

2.4 分布式锁实战

public String deductProduct(@PathVariable String userId) {ILock lock = new SimpleRedisLock("product", stringRedisTemplate);//尝试加锁boolean isLock = lock.tryLock(60);if (!isLock) {log.error("线程加锁失败: {}", Thread.currentThread().getId());return "加锁失败";}try {int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));log.info("开始扣减库存");if (stock > 0) {int stockAfterDeduction = stock - 1;stringRedisTemplate.opsForValue().set("stock", String.valueOf(stockAfterDeduction));log.info("扣减库存成功,现库存为 {}", stockAfterDeduction);} else {log.error("库存不足,现库存为:{}", stock);}return "操作成功!";}finally {lock.unLock();}
}

3. Redisson框架

uuid(区分不同的jvm服务)+线程id(区分jvm服务上面的线程)

3.1 导入pom坐标

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version>
</dependency>

3.2 配置Redisson客户端

@Configuration
public class RedissonConfig {@Value("${spring.redis.host}")public String host;@Value("${spring.redis.port}")public String port;@Value("${spring.redis.password}")private String password;@Beanpublic RedissonClient redissonClient() {// 单机redis配置Config config = new Config();String redisAddress = "redis://" + host + ":" + port;config.useSingleServer().setAddress(redisAddress).setPassword(password);// 设置分布式锁 watch dog超时时间// config.setLockWatchdogTimeout()return Redisson.create(config);}
}

3.3 使用分布式锁

public class HelloController {private RedissonClient redissonClient;public String deductProduct(String userId) {//获取分布式锁的锁对象RLock lock = redissonClient.getLock("product");//加分布式锁lock.lock(); //set nx ex 30stry {//业务逻辑}finally {//释放锁lock.unlock();}}
}

3.4 Redission源码分析

在这里插入图片描述

3.5 Redis主从架构下,分布式锁失效

Redis的集群架构保证AP,Zookeeper的集群架构保证CP。
但是Redis在主从情况下会出现锁丢失的问题,如何解决呢? => 红锁RedLock
在这里插入图片描述

http://www.dtcms.com/wzjs/112592.html

相关文章:

  • 珠海市做网站公司深圳网络营销推广服务
  • 万网域名注册登录seo精华网站
  • 做标准件网站网站排名大全
  • 电商型网站设计企业站长之家源码
  • 蛋糕网站案例杭州百度推广优化排名
  • 网站建设项目及费用提高工作效率的软件
  • 奉节网站建设哪家公司做推广优化好
  • 商城网站管理系统百度开放平台
  • thinkphp5来做网站吗冯耀宗seo博客
  • h5可以做网站吗免费产品推广软件
  • 网站管理员的联系方式宁波seo公司排名
  • 海南中小企业网站建设微信scrm系统
  • 网站建设公司豆瓣最近热点新闻事件2023
  • 广东响应式网站东莞网站提升排名
  • 用jsp做网站竞猜世界杯
  • 菏泽去哪了做网站网络黄页推广大全
  • java做的网站php百度助手app免费下载
  • 莱芜人才网招聘网嘉兴seo优化
  • dedecms 做网站新闻热点事件2021(最新)
  • 还有那个网站可以做兼职呢长沙做网站的公司有哪些
  • 网站上的flv视频看不了营销策划公司 品牌策划公司
  • 汕头市网络推广平台河源市seo点击排名软件价格
  • 深圳企业营销型网站seo内部优化具体做什么
  • 网站建设规划方案网站seo分析报告
  • 珠海网站建设在哪里短视频平台推广
  • 久久建筑网官网平台兰州seo网站建设
  • 怎么做淘宝企业网站抖音推广渠道有哪些
  • 浦城 做网站怎样做一个自己的网站
  • 网站建设 软件开发的公司排名网络推广外包怎么接单
  • 互联网渠道重庆seo顾问服务