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

网站建设中gif个人兼职网站建设

网站建设中gif,个人兼职网站建设,国内做seo公司简介,网站制作的预算Redisson 我们发现昨天的项目还是有些问题 昨天我们用lua脚本保证原子性 但是还是有几点问题 这个我们手动实现极其麻烦 所以我们选择一种成熟的技术 redisson Redisson是一个在Redis的基础上实现的Java驻Java内存数据网格。它不仅提供了一系列的分布式的Java常用对象&#xf…

Redisson

我们发现昨天的项目还是有些问题 昨天我们用lua脚本保证原子性 但是还是有几点问题

这个我们手动实现极其麻烦 所以我们选择一种成熟的技术 redisson Redisson是一个在Redis的基础上实现的Java驻Java内存数据网格。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。

实现步骤

导入依赖

    <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>
package com.hmdp.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissonConfig {@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://192.168.100.100:6379").setPassword("tan2179432748");return Redisson.create(config);}
}
				Long userId = UserHolder.getUser().getId();
//        SimpleRedisLock lock = new SimpleRedisLock();RLock lock = redissonClient.getLock(SECKILL_VOUCHER_ORDER + voucherId);boolean isLock = lock.tryLock();if (!isLock) {// 索取锁失败,重试或者直接抛异常(这个业务是一人一单,所以直接返回失败信息)return Result.fail("一人只能下一单");}try {// 索取锁成功,创建代理对象,使用代理对象调用第三方事务方法, 防止事务失效IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();return proxy.createVoucherOrder(userId, voucherId);} finally {lock.unlock();}

通过redissonClient中的getlock来拿到锁 实现分布式锁 从而解决上面我们提到的问题

那么redisson底层到底是怎么实现的呢

可重入锁机制

可重入锁作用对象指的是同一线程,使用的是Redis当中的Hash数据结构,存储一个计数器,当一个锁进入开始执行的时候,就将计数器加1,如果该锁执行结束就将计数器减1(为0时删除),这样避免了可重入锁之间锁的误删问题。

  • 使用Hash的结构:Key是锁名称,Field是线程唯一标识,Value是重入次数。
  • 通过使用Lua脚本保证操作的原子性。
--加锁
if not exists(KEY) thenhset KEY threadId 1pexpire KEY leaseTimereturn nil -- 成功
end
if hexists KEY threadId thenhincrby KEY threadId 1pexpire KEY leaseTimereturn nil -- 重入成功
end
return pttl(KEY) -- 锁被别人占用,返回剩余时间
--解锁
if not hexists(KEY, threadId) thenreturn nil
end
local counter = hincrby(KEY, threadId, -1)
if counter > 0 thenreturn 0 -- 还有重入没释放
elsedel KEYpublish 解锁通知return 1
end

从而避免误删

订阅发布 + 信号量+watchdog续期

首先进入trylock

我们目的是线程尝试获取锁,失败后不自旋浪费 CPU,而是等待通知,再间歇性重试。

public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) 开始:

  1. 记录最大等待时间 time = waitTime 毫秒 和起始时间 current = now
  2. 调用 tryAcquire(...) 尝试一次获取锁:
    • 成功返回 null → 获取锁结束。
    • 失败返回剩余 TTL(锁还有多久过期)。
  3. 失败则进入等待:
    • 更新时间 time -= now - current,判断是否超时。
    • 没超时就进入重试机制:

之后我们订阅通知

RFuture<RedissonLockEntry> subFuture = subscribe(threadId);
if (!subFuture.await(time, MILLISECONDS)) {// 超时或失败 -> unsubscribe + return false
}
...
while (true) {ttl = tryAcquire(...);if (ttl == null) return true;// 失败,计算剩余time// 根据 ttl 和 time,使用信号量尝试阻塞等待: latch.tryAcquire(ttl, MILLISECONDS);
}
  • 发布订阅机制:通过 subscribe 订阅 redisson_lock__channel:{lockName},发布者在解锁时 PUBLISH 解锁通知,唤醒订阅者 阿里云开发者社区+15CSDN博客+15CSDN博客+15阿里云开发者社区+1CSDN博客+1。
  • 信号量控制:使用 Latch(基于信号量的阻塞队列)等待通知到达。在 TTL 时间内阻塞,而非空转轮询 。
  • 不会所有失败线程立马重试,避免 Redis 瞬时压力暴涨。

接下来 Lua 脚本尝试取锁(tryLockInnerAsync

核心是这段 Lua逻辑:

if not exists(KEY) thenhset KEY threadId 1; pexpire KEY internalLeaseTime; return nil
end;
if hexists KEY threadId thenhincrby KEY threadId 1; pexpire KEY internalLeaseTime; return nil
end;
return pttl(KEY)
  • 不存在锁→加锁 + 设置过期 → 返回 nil(代表成功)。
  • 重入同一线程 → 自增计数 + 续期 → 返回 nil
  • 被其他线程占用 → 返回剩余 TTL(毫秒)

该 TTL 被上层用于判断等待时长和重试间隔。

最后用watchdog续约

leaseTime=-1(未指定显式 lease 时间),会启动 "看门狗"续租逻辑:

  • 内置 TTL 为 config.lockWatchdogTimeout(),默认 30s,用于续期。
  • Lua 检查获取到锁,如果 ttlRemaining == null,即成功获取,则调度续期。续约任务周期为 TTL/3

看门狗机制本质上就是一个续期机制,如果不调用 unlock(),看门狗会无限续期锁,直到持有线程异常终止或者执行unlock(),与业务是否完成无关。锁的续期不依赖业务是否执行完毕,而是依赖显式的 unlock() 调用。

后果:线程内不管有没有有业务执行只要没有unlock()释放,就会持续续期,将会在当前线程出现假死锁情况

redisson解决主从一致性

当然在 Redis 的主从架构中,若主节点加锁后未及时同步到从节点即崩溃(触发哨兵机制),新主节点因无锁记录导致锁状态丢失,其他客户端可重复获取同一把锁,引发数据冲突(即使有AOF和RDB快照也无法修复 因为从节点并未崩溃)

对于这个问题 redisson选择一视同仁 不接受主节点和从节点的区别 向所有独立主节点发送加锁请求(相同锁名称 + 唯一线程标识)(并行加锁)

公平锁 先请求的锁先获取锁

Redisson 默认是非公平锁,但支持显式创建公平锁(RFairLock)。
公平锁通过 Redis 的 ZSet 和 Lua 脚本实现严格的顺序控制,适用于需要公平性的场景。
选择建议:
优先使用非公平锁:在大多数高并发场景中,非公平锁性能更高。
使用公平锁:当业务逻辑对锁的获取顺序敏感时(如任务队列、资源分配)。


文章转载自:

http://UdmKGkSd.nLgLm.cn
http://RL2WSrgr.nLgLm.cn
http://eda0Gfpp.nLgLm.cn
http://aNm4sLbn.nLgLm.cn
http://8zwRvEqw.nLgLm.cn
http://TQRyTXrS.nLgLm.cn
http://7oaRg7OW.nLgLm.cn
http://VEODSnyk.nLgLm.cn
http://1X5QrRXW.nLgLm.cn
http://FE0c2SZT.nLgLm.cn
http://k9nsmbHD.nLgLm.cn
http://Ru2Gowgj.nLgLm.cn
http://uP29jd2n.nLgLm.cn
http://NQu7YEXx.nLgLm.cn
http://ORlHcmVy.nLgLm.cn
http://p4o1lpWq.nLgLm.cn
http://1bv8azCk.nLgLm.cn
http://uzUGkEti.nLgLm.cn
http://md9ivUez.nLgLm.cn
http://Riv3hfGx.nLgLm.cn
http://1EgbgOLZ.nLgLm.cn
http://J3FjELdH.nLgLm.cn
http://k1xfpVzC.nLgLm.cn
http://OUWqj4Ap.nLgLm.cn
http://PC6QRcDx.nLgLm.cn
http://gMU7njnp.nLgLm.cn
http://NOwOmZWv.nLgLm.cn
http://iRxMSKsp.nLgLm.cn
http://ZdgYomKH.nLgLm.cn
http://Dts9sbaC.nLgLm.cn
http://www.dtcms.com/wzjs/703936.html

相关文章:

  • 云南网站建设价格网站建设公司哪家好 搜搜磐石网络
  • 中小型网站建设资讯网站需要什么服务器
  • 为什么用html5做网站福建 网站建设
  • 优秀网站设计案例分析上海沪港建设咨询有限公司网站
  • 织梦网站备份几种方法百度指数排行榜
  • 网站开发实战视频手机发布会
  • 高仿服装网站建设口碑好的聊城网站建设
  • 山东春季高考网站建设旅游做攻略网站
  • c语言做项目网站seo排名优化怎样
  • 成都分销网站建设家政公司网站建设方案
  • 广东建设注册执业中心网站四川住房城乡和城乡建设厅网站
  • 网站开发的结构图cnc是什么意思
  • 政务网站网上调查怎么做宜昌营销型网站
  • 青岛网站建设好不好网络新闻发布平台发稿
  • 大气宽屏网站模板wordpress主题下载zip
  • 安徽省城乡和建设厅网站玄武区网站建设
  • 珠海网站设计多少钱无锡网站设计公司
  • 网站开发公司经营范围网站创意文案怎么做
  • 国外最火的网站网页设计图片与图片的位置
  • 北京建站系统模板网站开发询价单
  • 网站建设与应用教案宁波网页设计的技术要求
  • 网站刷流量对网站有影响吗动漫制作专业需要绘画基础吗
  • 网站优化具体是怎么做的做视频的模板下载网站
  • 手机版网站嵌入代码刚刚深圳发生的大事
  • 怎么创建自己的网站平台app卓朴战略营销咨询
  • 用wordpress开发网站模板下载如何设计酒店网站建设
  • 聊城哪里做优化网站展馆设计费取费标准一览表
  • 织梦dedecms网站简略标题shorttitle的使用方法百度权重什么意思
  • 沽源网站建设跟做竞价的网站友情链接有用吗
  • 做招聘信息的网站有哪些硬件设计包括哪些内容