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

外贸零售网站建设数据分析师考试

外贸零售网站建设,数据分析师考试,公司logo注册多少钱,秦皇岛市卫生学校官网集群环境下的秒杀问题 前序 【Redis场景1】用户登录注册 【Redis场景2】缓存更新策略(双写一致) 【Redis场景3】缓存穿透、击穿问题 【Redis场景拓展】秒杀问题-全局唯一ID生成策略 【Redis场景4】单机环境下秒杀问题 在单机环境下的并发问题,我们可以使用相关…

集群环境下的秒杀问题

前序

【Redis场景1】用户登录注册

【Redis场景2】缓存更新策略(双写一致)

【Redis场景3】缓存穿透、击穿问题

【Redis场景拓展】秒杀问题-全局唯一ID生成策略

【Redis场景4】单机环境下秒杀问题


在单机环境下的并发问题,我们可以使用相关锁来解决;但是在集群环境中,笔者测试通过Nginx做的反向代理和负载均衡,请求的时候锁会出现失效的问题。

原因:我们部署多个服务(存在多个tomcat服务器),每个tomcat都有一个属于自己的jvm.每个锁在同容器中有效,但是跨容器后就无法实现互斥效果。

引出分布式锁:

  1. 分布式就是指数据和程序可以不位于一个服务器上,而是分散到多个服务器,以网络上分散分布的地理信息数据及受其影响的数据库操作为研究对象的一种理论计算模型。
  2. 分布式锁提供了多个服务器节点访问共享资源互斥的一种手段。

一个最基本的分布式锁需要满足:

  • 互斥 :任意一个时刻,锁只能被一个线程持有;
  • 高可用 :锁服务是高可用的。并且,即使客户端的释放锁的代码逻辑出现问题,锁最终一定还是会被释放,不会影响其他线程对共享资源的访问。
  • 可重入:一个节点获取了锁之后,还可以再次获取锁

分布式锁的实现:

  1. 基于redis中的SETNX 实现分布式锁
  2. 基于Zookeeper的节点唯一性和有序性实现互斥的分布式锁
  3. 基于MySQL本身的互斥锁机制

基于Redis的分布式锁

基本实现

GitHub完整代码:https://github.com/xbhog/hm-dianping/tree/20230211-xbhog-redisCloud

锁接口实现:20230211-xbhog-redisCloud

/*** @author xbhog* @describe:* @date 2023/2/16*/
public interface ILock {boolean tryLock(Long timeOutSec);void unLock();
}

加锁解锁实现类:

@Override
public boolean tryLock(Long timeOutSec) {String threadId = ID_PREFIX + Thread.currentThread().getId();Boolean isLock = stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX + keyName, threadId + "", timeOutSec, TimeUnit.SECONDS);//防止拆箱引发空值异常return Boolean.TRUE.equals(isLock);
}
@Override
public void unlock() {//通过del删除锁stringRedisTemplate.delete(KEY_PREFIX + name);
}

锁误删问题

img

现在有两个锁,线程1获取锁时,由于业务的阻塞超时释放了,这是线程2开始操作,获取锁,在线程2执行业务期间,线程1业务在一段时间内不阻塞且业务完成,这是开始执行释放锁的操作,但是这是锁是线程2,由此造成锁的误删问题;

正确流程:

img

解决的方式:

修改之前的分布式锁实现,满足:在获取锁时存入线程标示(可以用UUID表示) 在释放锁时先获取锁中的线程标示,判断是否与当前线程标示一致

  • 如果一致则释放锁
  • 如果不一致则不释放锁

核心逻辑:在存入锁时,放入自己线程的标识,在删除锁时,判断当前这把锁的标识是不是自己存入的,如果是,则进行删除,如果不是,则不进行删除。

处理流程:

img

代码实现:

private static final String ID_PREFIX = UUID.randomUUID().toString(true) + "-";
@Override
public boolean tryLock(Long timeOutSec) {String threadId = ID_PREFIX + Thread.currentThread().getId();Boolean isLock = stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX + keyName, threadId + "", timeOutSec, TimeUnit.SECONDS);//防止拆箱引发空值异常return Boolean.TRUE.equals(isLock);
}
@Override
public void unLock() {String threadId = ID_PREFIX + Thread.currentThread().getId();//获取当前分布式锁中的valueString id = stringRedisTemplate.opsForValue().get(KEY_PREFIX + keyName);//锁相同则删除if(threadId.equals(id)){stringRedisTemplate.delete(KEY_PREFIX + keyName);}}
http://www.yayakq.cn/news/948080/

相关文章:

  • 怎么用2级目录做网站怎么上传网站地图
  • 网页制作新建站点步骤做微商去哪些社交网站
  • 国外做游戏的视频网站有哪些校园推广方案
  • 快速搭建网站框架北京行业网站制作
  • 手机网站与电脑网站的区别aso优化运营
  • 阿雷网站建设建筑工程公司简介模板范文
  • 杭州知名网站建设公司怎么查网站的外链数量
  • 镇江 网站广州深圳外贸公司
  • 临沂外贸网站帮别人做钓鱼网站吗
  • 中国做网站最好的企业网站建设站点无法发布
  • 敲代码做网站多少钱做网站的思路怎么写
  • 中国建设部网站关于资质河南高端网站建设公司
  • 网站建设移动端医生做学分在哪个网站
  • 网站维护细则有赞微商城官网登录
  • 铁岭市网站建设网站建设外包名词解释
  • 长沙专业的网站设计微商城运营
  • 网站建设知识平台wordpress页脚添加联系qq
  • 三合一网站建设方案越南做彩票网站是违法的吗
  • 网站制作软件名字线做那里有学做网站的
  • 网站需要公司备案么网站建设需要会什么软件有哪些
  • c asp.net 做网站如何推广自己网站
  • iis端口相同不同网站建设四川网站设计
  • 网站关键词中间用中天建设集团有限公司营业执照
  • 中电建铁路建设公司网站陕西建设厅网站人才库
  • 贵阳网站建设包首页网络营销案例报告
  • c 教程如何做网站成都官网seo服务
  • 在linux上做网站搭建东莞做网站卓诚
  • 天津河北做网站的公司排名东营网站建设公司
  • 中国最大的手表网站阿里巴巴外贸平台怎么收费
  • 网站建设大忌青岛网站建设开发