因Redis分布式锁造成的S1级重大事故,整个团队都没年终奖了。。。

Claude Code人机协作五维框架:上下文主权、执行闭环与责任边界 在AI编程工具日益普及的今天,'让AI写代码'已不再是技术瓶颈,真正决定工程效能的是人与大模型之间的协作范式。本文聚焦于Claude Code这一具备Plan Mode能力的智能编码助手,深入解析其区别于传统Copilot的核心机制——上下文主权(需显式声明项目事实)、执行闭环(依赖可验证的成功标准)与责任边界(不替代架构决策)。围绕这三大原理,延伸出面向真实交付场景的技术价值:降低模糊指令导致的返工率、提升生成代码的一次通过率、保障安全与合规约束的刚性落地。典型应用场景涵盖遗留系统重构、微服务治理、支付网 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:捡田螺的小男孩

682699f2675e2e0324551b4aba9955d7.jpeg


前言

日常开发中,经常会碰到秒杀抢购等业务。为了避免并发请求造成的库存超卖 等问题,我们一般会用到Redis分布式锁。但是使用Redis分布式锁,很容易踩坑哦~ 本文田螺哥将给大家分析阐述,Redis分布式锁的10个坑~

8941afddf2d8c71936b2004cfea13a1c.png

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

1. 非原子操作(setnx + expire)

一说到实现Redis的分布式锁,很多小伙伴马上就会想到setnx+ expire命令。也就是说,先用setnx来抢锁,如果抢到之后,再用expire给锁设置一个过期 时间。

伪代码如下:

if(jedis.setnx(lock_key,lock_value) == 1){ //加锁
    jedis.expire(lock_key,timeout); //设置过期时间
    doBusiness //业务逻辑处理
}

这块代码是有坑 的,因为setnx和expire两个命令是分开写的,并不是原子操作!如果刚要执行完setnx加锁,正要执行expire设置过期时间时,进程crash或者要重启维护了,那么这个锁就“长生不老 ”了,别的线程永远获取不到锁啦。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

2. 被别的客户端请求覆盖( setnx + value为过期时间)

为了解决:发生异常时,锁得不到释放的问题 。有小伙伴提出,可以把过期时间 放到setnx的value里面。如果加锁失败,再拿出value值和当前系统时间校验一下是否过期即可。伪代码实现如下:

long expireTime = System.currentTimeMillis() + timeout; //系统时间+设置的超时时间
String expireTimeStr = String.valueOf(expireTime); //转化为String字符串

// 如果当前锁不存在,返回加锁成功
if (jedis.setnx(lock_key, expireTimeStr) == 1) {
        return true;
} 

// 如果锁已经存在,获取锁的过期时间
String oldExpireTimreStr = jedis.get(lock_key);

// 如果获取到的老的预期过期时间,小于系统当前时间,表示已经过期了
if (oldExpireTimreStr != null && Long.parseLong(oldExpireTimreStr) < System.currentTimeMillis()) {

     //锁已过期,获取上一个锁的过期时间,并设置现在锁的过期时间(不了解redis的getSet命令的小伙伴,可以去官网看下哈)
    String oldValueStr = jedis.getSet(lock_key, expireTimeStr);
    
    if (oldValueStr != null && oldValueStr.equals(oldExpireTimreStr)) {
      //考虑多线程并发的情况,只有一个线程的设置值和当前值相同,它才可以加锁
      return true;
    }
}
        
//其他情况,均返回加锁失败
return false;
}

这种实现的方案,也是有坑的:如果锁过期的时候,并发多个客户端同时请求过来,都执行jedis.getSet(),最终只能有一个客户端加锁成功,但是该客户端锁的过期时间,可能被别的客户端覆盖 。

3. 忘记设置过期时间

之前review代码的时候,看到这样实现的分布式锁,伪代码 :

try{
  if(jedis.setnx(lock_key,lock_value) == 1){//加锁
     doBusiness //业务逻辑处理
     return true; //加锁成功,处理完业务逻辑返回
  }
  return false; //加锁失败
} finally {
    unlock(lockKey);- //释放锁
}

这块有什么问题呢?是的,忘记设置过期时间了 。如果程序在运行期间,机器突然挂了,代码层面没有走到finally代码块,即在宕机前,锁并没有被删除掉,这样的话,就没办法保证解锁,所以这里需要给lockKey加一个过期时间。注意哈,使用分布式锁,一定要设置过期时间哈 。

4. 业务处理完,忘记释放锁

很多小伙伴,会使用Redis的set指令扩展参数来实现分布式锁。

set指令扩展参数:SET key value[EX seconds][PX milliseconds][NX|XX]

- NX :表示key不存在的时候,才能set成功,也即保证只有第一个客户端请求才能获得锁,
  而其他客户端请求只能等其释放锁,才能获取。
- EX seconds :设定key的过期时间,时间单位是秒。
- PX milliseconds: 设定key的过期时间,单位为毫秒
- XX: 仅当key存在时设置值

小伙伴会写出如下伪代码:

if(jedis.set(lockKey, requestId, "NX", "PX", expireTime)==1){ //加锁
   doBusiness //业务逻辑处理
   return true; //加锁成功,处理完业务逻辑返回
}
return false; //加锁失败

这块伪代码,初看觉得没啥问题,但是细想,不太对呀。因为忘记释放锁 了!如果每次加锁成功,都要等到超时时间才释放锁 ,是会有问题的。这样程序不高效,应当每次处理完业务逻辑,都要释放锁 。

正例如下:

try{
  if(jedis.set(lockKey, requestId, "NX", "PX", expireTime)==1){//加锁
     doBusiness //业务逻辑处理
     return true; //加锁成功,处理完业务逻辑返回
  }
  return false; //加锁失败
} finally {
    unlock(lockKey);- //释放锁
}

5. B的锁被A给释放了

我们来看下这块伪代码:

try{
  if(jedis.set(lockKey, requestId, "NX", "PX",expireTime)==1){//加锁
     doBusiness //业务逻辑处理
     return true; //加锁成功,处理完业务逻辑返回
  }
  return false; //加锁失败
} finally {
    unlock(lockKey); //释放锁
}

大家觉得会有哪些坑 呢?

假设在这样的并发场景下:A、B两个线程来尝试给Redis的keylockKey加锁,A线程先拿到锁(假如锁超时时间是3秒后过期)。如果线程A执行的业务逻辑很耗时,超过了3秒还是没有执行完。这时候,Redis会自动释放lockKey锁。刚好这时,线程B过来了,它就能抢到锁了,开始执行它的业务逻辑,恰好这时,线程A执行完逻辑,去释放锁的时候,它就把B的锁给释放掉了。

正确的方式应该是,在用set扩展参数加锁时,放多一个这个线程请求的唯一标记 ,比如requestId,然后释放锁的时候,判断一下是不是刚刚的请求 。

try{
  if(jedis.set(lockKey, requestId, "NX", "PX",expireTime)==1){//加锁
     doBusiness //业务逻辑处理
     return true; //加锁成功,处理完业务逻辑返回
  }
  return false; //加锁失败
} finally {
    if (requestId.equals(jedis.get(lockKey))) { //判断一下是不是自己的requestId
      unlock(lockKey);//释放锁
    }   
}

6. 释放锁时,不是原子性

以上的这块代码,还是有坑:

if (requestId.equals(jedis.get(lockKey))) { //判断一下是不是自己的requestId
      unlock(lockKey);//释放锁
    }

因为判断是不是当前线程加的锁和释放锁不是一个原子操作 。如果调用unlock(lockKey)释放锁的时候,锁已经过期,所以这把锁已经可能已经不属于当前客户端,会解除他人加的锁 。

因此,这个坑就是:判断和删除是两个操作,不是原子的,有一致性问题。释放锁必须保证原子性,可以使用Redis+Lua脚本来完成,类似Lua脚本如下:

if redis.call('get',KEYS[1]) == ARGV[1] then 
   return redis.call('del',KEYS[1]) 
else
   return 0
end;

7. 锁过期释放,业务没执行完

加锁后,如果超时了,Redis会自动释放清除锁,这样有可能业务还没处理完,锁就提前释放了 。怎么办呢?

有些小伙伴认为,稍微把锁过期时间设置长一些就可以啦。其实我们设想一下 ,是否可以给获得锁的线程,开启一个定时守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。

当前开源框架Redisson解决了这个问题。我们一起来看下Redisson底层原理图吧:

c039831e3b03cafc3a8a6176c906d909.png

只要线程一加锁成功,就会启动一个watch dog看门狗,它是一个后台线程 ,会每隔10秒检查一下,如果线程一还持有锁,那么就会不断的延长锁key的生存时间。因此,Redisson就是使用Redisson解决了锁过期释放,业务没执行完问题 。

8. Redis分布式锁和@transactional一起使用失效

大家看下这块伪代码:

@Transactional
public void updateDB(int lockKey) {
  boolean lockFlag = redisLock.lock(lockKey);
  if (!lockFlag) {
    throw new RuntimeException(“请稍后再试”);
  }
   doBusiness //业务逻辑处理
   redisLock.unlock(lockKey);
}

在事务中,使用了Redis分布式锁.这个方法一旦执行,事务生效,接着就Redis分布式锁生效,代码执行完后,先释放Redis分布式锁,然后再提交事务数据,最后事务结束。在这个过程中,事务没有提交之前,分布式锁已经被释放,导致分布式锁失效

这是因为:

spring的Aop,会在updateDB方法之前开启事务,之后再加锁,当锁住的代码执行完成后,再提交事务,因此锁住的代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,锁已经被释放,此时其他线程拿到锁之后进行锁住的代码块,读取的库存数据不是最新的。

正确的实现方法,可以在updateDB方法之前就上锁 ,即还没有开事务之前就加锁,那么就可以保证线程的安全性.

9. 锁可重入

前面讨论的Redis分布式锁,都是不可重入的 。

所谓的不可重入 ,就是当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,会阻塞,不可以再次获得锁。同一个人拿一个锁 ,只能拿一次不能同时拿2次。

不可重入的分布式锁的话,是可以满足绝大多数的业务场景 。但是有时候一些业务场景,我们还是需要可重入的分布式锁 ,大家实现分布式锁的过程中,需要注意一下 ,你当前的业务场景是否需要可重入的分布式锁。

Redis只要解决这两个问题,就能实现重入锁 了:

  • 怎么保存当前持有的线程

  • 怎么维护加锁次数(即重入了多少次)

实现一个可重入的分布式锁,我们可以参考JDK的ReentrantLock的设计思想。实际上,可以直接使用Redisson框架,它是支持可重入锁的。

10. Redis主从复制导致的坑

实现Redis分布式锁的话,要注意Redis主从复制的坑 。因为Redis一般都是集群部署的:

2c1d0e596f3302d0bc817696da7518b4.png

如果线程一在Redis的master节点上拿到了锁,但是加锁的key还没同步到slave节点。恰好这时,master节点发生故障,一个slave节点就会升级为master节点。线程二就可以获取同个key的锁啦,但线程一也已经拿到锁了,锁的安全性就没了。

为了解决这个问题,Redis作者 antirez提出一种高级的分布式锁算法:Redlock。Redlock核心思想是这样的:

搞多个Redis master部署,以保证它们不会同时宕掉。并且这些master节点是完全相互独立的,相互之间不存在数据同步。同时,需要确保在这多个master实例上,是与在Redis单实例,使用相同方法来获取和释放锁。

我们假设当前有5个Redis master节点,在5台服务器上面运行这些Redis实例。

0810bcf2e9ca69bda156d7bbe0e6cffe.png

RedLock的实现步骤如下:

  1. 获取当前时间,以毫秒为单位。

  2. 按顺序向5个master节点请求加锁。客户端设置网络连接和响应超时时间,并且超时时间要小于锁的失效时间。(假设锁自动失效时间为10秒,则超时时间一般在5-50毫秒之间,我们就假设超时时间是50ms吧)。如果超时,跳过该master节点,尽快去尝试下一个master节点。

  3. 客户端使用当前时间减去开始获取锁时间(即步骤1记录的时间),得到获取锁使用的时间。当且仅当超过一半(N/2+1,这里是5/2+1=3个节点)的Redis master节点都获得锁,并且使用的时间小于锁失效时间时,锁才算获取成功。(如上图,10s> 30ms+40ms+50ms+4m0s+50ms)

  4. 如果取到了锁,key的真正有效时间就变啦,需要减去获取锁所使用的时间。

  5. 如果获取锁失败(没有在至少N/2+1个master实例取到锁,有或者获取锁时间已经超过了有效时间),客户端要在所有的master节点上解锁(即便有些master节点根本就没有加锁成功,也需要解锁,以防止有些漏网之鱼)。

简化下步骤就是:

  • 按顺序向5个master节点请求加锁

  • 根据设置的超时时间来判断,是不是要跳过该master节点。

  • 如果大于等于3个节点加锁成功,并且使用的时间小于锁的有效期,即可认定加锁成功啦。

  • 如果获取锁失败,解锁!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

8b04a7de5ecd5d02e473a62de4debe49.png

已在知识星球更新源码解析如下:

a0657671f3d1e5018dac3edd714ebac7.jpeg

9f9f52a94e0fe9870aeff379e57fb1a7.jpeg

202abdbe9e1a3f0a53ee42d3df0e5283.jpeg

7b60f5631ec7d9d532efe73973a5de86.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
【软件工程】从需求到部署:一个高并发ATM系统的架构演进之路 本文详细探讨了ATM系统从单体架构到分布式架构的演进过程,重点分析了高并发场景下的技术挑战与解决方案。通过引入微服务、Redis缓存、分布式事务等关键技术,系统成功支撑了每秒1500+的交易量。文章还分享了容器化部署、灰度发布等DevOps实践,为金融级系统架构设计提供了宝贵经验。 阅读详情

相关推荐

LLM代码生成的工业级实践:从提示工程到生产质检

大语言模型(LLM)驱动的代码生成已超越简单补全,成为现代软件开发的关键基础设施。其核心原理在于基于上下文的概率化推理,而非确定性检索;技术价值体现在大幅压缩知识获取路径、降低错误修复成本、细化跨职能协作颗粒度。典型应用场景涵盖业务后端快速原型、运维配置自动生成、测试用例智能编写等。要实现稳定落地,必须突破‘提示即指令’的认知误区,转向结构化提示设计、精准上下文供给与生成-验证闭环机制。本文聚焦可复用的工业级方法论,覆盖提示工程四层框架、AST语法树校验、敏感操作审计、依赖兼容性验证等关键实践。

weixin_33908217的博客 563

生产级机器学习系统:部署集成、性能韧性与可观测性实战

机器学习模型上线并非终点,而是系统性风险的起点。在真实业务场景中,模型的稳定性、延迟控制、特征可用性及决策可追溯性,远比离线准确率更关键。本文围绕部署集成、性能韧性、可观测性与治理闭环四大核心,解析如何应对特征延迟、依赖雪崩、数据漂移、合规审计等高频工程挑战。结合银行风控、信贷审批等高压场景,提供适配网关设计、分层降级策略、Wasserstein距离漂移检测、决策证据链构建等可落地方案,助力AI从实验走向高可靠生产。

dibeichan3033的博客 440

在中国大陆使用 LiveKit 集成阿里云语音交互服务

通过集成阿里云的语音和模型服务,我们可以快速构建出适合中国用户的 LiveKit 智能语音应用。LiveKit Agents 框架的模块化设计使得替换底层服务变得异常简单,只需要更换相应的插件实例即可。使用 WebSocket 版本的阿里云 ASR 接口以获得更低的延迟。利用通义千问的 Function Calling 能力对接智能家居或企业内部 API。结合 LiveKit 的视频处理能力,打造具备视觉交互的数字人。希望这篇博客能为你在实时音视频与 AI 结合的探索之路上提供帮助!

星空漫野 1236

Redis分布式锁使用不当,导致超卖了100瓶飞天茅台!!!

点击上方关注 “终端研发部”设为“星标”,和你一起掌握更多数据库知识基于Redis使用分布式锁在当今已经不是什么新鲜事了。本篇文章主要是基于我们实际项目中因为redis分布式锁造成的事故分析及解决方案。我们项目中的抢购订单采用的是分布式锁来解决的,有一次,运营做了一个飞天茅台的抢购活动,库存100瓶,但是却超卖了100瓶!要知道,这个地球上飞天茅台的稀缺性啊!!!事故定为P0级重大事故...只能坦...

这个时代,作为程序员可能要学习小程序 475

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入解析了SAP CO模块中结果分析码KKA2/CJ88的核心应用,通过真实案例详细阐述了如何在成本波动剧烈的销售型项目中,运用结果分析实现收入与成本的精准匹配。文章重点拆解了不同结果分析方法的适用场景与财务影响,并提供了从配置、操作到问题排查的完整实战指南,帮助财务顾问提升项目财务管理能力。

qsc9012345的博客 607

别再套用星形公式了!三角形接法PMSM的FOC控制,扇区判断与作用时间推导全解析

本文深入解析三角形接法永磁同步电机(PMSM)的FOC控制技术,重点探讨30度相位差对SVPWM扇区判断与电压矢量作用时间的影响。通过数学推导与实验验证,详细讲解修正后的扇区划分规则、作用时间计算公式优化方法,并提供可直接移植到STM32的代码实现,帮助工程师解决三角形接法特有的相电流重构与同步采样难题。

weixin_30689307的博客 468

悲剧!因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效...

背景我们项目中的抢购订单采用的是分布式锁来解决的。有一次,运营做了一个飞天茅台的抢购活动,库存 100 瓶,但是却超卖了!要知道,这个地球上飞天茅台的稀缺性啊!!!事故定为 P0 级重大...

emprere的博客 142

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3371

记一次由 Redis 分布式锁造成的 P0 重大事故:深度复盘与避坑指南

摘要: 某电商平台在零点大促活动中,因Redis分布式锁失效导致优惠券超发4.2万张,造成210万元资损。事故根源包括:锁超时时间未覆盖GC停顿(5秒不足以应对4.3秒FullGC)、锁释放非原子操作(GET+DELETE误删他人锁)、主从切换导致锁丢失。解决方案采用多级防御:Redisson+外部续期代理确保锁活性,分片库存降低锁冲突,数据库CAS作为最终防线。核心教训:分布式锁需结合自动续期、原子操作和降级策略,避免单一依赖。

油墨香^-^的博客 906

ur3手眼标定+realsenseL515

知乎 csdn

AI_future的博客 978

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 460

第40章:【高级篇综合实战】从零设计企业级 Redis 平台

本文摘要: 一家大型企业集团内部存在严重的Redis管理混乱问题,全集团分散着327个不同版本的Redis实例,存在重大安全隐患。近年来发生了三次重大事故:双十一期间主库OOM导致支付链路雪崩、春节红包期间Cluster集群Gossip风暴引发服务延迟、Module升级不当导致全量数据丢失。根因分析显示,问题核心在于缺乏统一的实例生命周期管理、标准化高可用方案、安全基线和容量治理。

davidwang456的专栏 1239

ks-快手滑块验证码-Js逆向

本文分析了快手滑块验证码的破解过程。首先通过抓包找到验证码背景图接口,发现需要动态获取captchaSession参数。然后深入分析验证流程,发现verifyParam参数被加密处理,需要追踪其生成逻辑。文章详细解析了加密参数c的构成,包括captchaSn、滑动距离、轨迹信息等,并指出轨迹验证较为严格。最后通过对比浏览器和本地生成的加密值,确认加密逻辑正确,但指出轨迹生成仍需优化。作者建议参考相关文章深入分析轨迹逻辑,并提供了验证成功的截图作为参考。

2302_76420666的博客 1877

生产级机器学习系统:从模型交付到决策单元的工程实践

机器学习模型部署不是终点,而是分布式决策系统工程的起点。本文围绕‘决策单元(Decision Unit)’这一核心概念,解析输入契约、行为契约、输出契约与可观测契约四大设计原则,阐明如何在数据断流、特征缺失、服务抖动等真实故障场景下保障决策的可解释性、可追溯性与可兜底性。结合银行风控等强实时、高合规场景,深入探讨特征契约化、输入守门员、输出置信度绑定、优雅降级四象限及三层监控金字塔等关键技术实践,为构建健壮、可信、可审计的生产ML系统提供落地路径。

weixin_30595035的博客 286

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码

本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。

weixin_30632089的博客 505

eWebEditor使用教程

非常详细的eWebEditor使用方法教程,各种调用方法,举例,易懂。适合初学者。教程是doc格式,不熟悉代码的直接复制就行。

软件开发中的‘洼则盈’:预留冗余、驱动演化的底层心法

在软件工程中,‘过程非流水线、架构非静态图纸、人非万能资源’已成为共识,但如何落地仍普遍缺失系统性方法论。‘洼则盈’并非消极留白,而是主动设计可控的缓冲空间——在开发流程中嵌入验证性空档,在架构中预设可观测的不完整性,在团队中制度化认知盲区的暴露与流转。它本质是面向不确定性的韧性构建机制,将等待转化为探测、将缺陷转化为连接、将不完美转化为演化起点。该理念直击敏捷失焦、微服务僵化、技术债累积等高频痛点,为研发效能提升提供可度量、可复用、可传承的实践路径。

世范水晶 552

(全新整理)CGSS中国综合社会调查数据库(2011-2023年)

1、资源内容地址:https://blog.youkuaiyun.com/2301_79696294/article/details/1535387942、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题3、适用对象:大学生,本科生,研究生小白可用,容易上手!!!4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理

构建高可用会员系统:架构设计与性能调优实战

本文深入探讨了构建高可用会员系统的架构设计与性能调优实战。通过分布式服务集群、多活数据库架构、智能流量调度系统和立体化监控体系四大核心组件,确保系统在各类故障场景下保持99.99%以上的可用性。文章还分享了性能调优的五个实战技巧,包括缓存策略、数据库查询优化、异步化改造等,帮助开发者提升会员系统的稳定性和性能。

weixin_29228781的博客 392

nlp大作业-任务为文本摘要python源码+文档说明+数据集(高分课程设计)

<项目介绍>nlp大作业-任务为文本摘要python源码+文档说明+数据集(高分课程设计)-不懂运行,下载完可以私聊问,可远程教学该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用!1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。--------

SMBV100B_指令手册_en_09.pdf

SMBV100B_指令手册_en_09.pdf

Opus 4.7 不是万能开关:Claude Code 中的精准使用指南

大语言模型在编程场景中的应用正从‘能用’迈向‘敢用’与‘精用’阶段。Opus 4.7 作为当前Claude Code中能力最强的模型版本,其核心价值并非通用性能提升,而是面向高置信度、长上下文、多步骤自主决策任务的深度推理与自我验证能力。它依托指令契约主义、状态机式长程推理和双轨制验证三大底层机制,在金融级代码审计、跨系统架构重构等高后果场景中显著降低风险;但在轻量补全、快速原型等低风险任务中反而因响应延迟与输出冗余拉低效率。理解其能力边界与适用条件,是开发者构建AI增强型开发工作流的关键前提。

weixin_33713707的博客 366

从Notebook到生产:机器学习模型落地的七道生死关

机器学习模型部署不是简单封装API,而是涵盖数据加载、特征服务、模型序列化、推理引擎、版本管理、监控告警与灰度发布的端到端工程实践。核心挑战在于打破‘模型即服务’的认知误区,构建可观测、可回滚、可编排的ML系统。ONNX格式替代Pickle保障跨环境兼容性,Triton推理服务器实现动态批处理与热更新,Feast统一离线/在线特征供给,Prometheus+Grafana构建模型健康度三维评估体系。这些技术组合直击金融风控、电商推荐、工业预测等高可用场景下的真实痛点,让模型真正具备生产级鲁棒性。

weixin_33889665的博客 398

Multi-Agent协作开发:重构软件工程流水线的实践方法论

Multi-Agent协作开发并非简单叠加多个大模型,而是将传统软件工程中的隐性角色分工(如接口契约管理、状态同步、变更治理)显性化、可编排、可审计。其核心原理基于事件溯源与职责分离,通过Schema First、Contract Driven等七类专用Agent实现模块自治与故障隔离。技术价值在于提升中大型项目的一致性保障能力、CI/CD可观测性与工程可运维性,典型应用于微服务架构下的前后端协同、数据库Schema演进与自动化测试边界定义。本文聚焦真实生产环境验证的通信协议设计、领域知识注入与渐进式落地路

weixin_30920513的博客 354

机器学习生产化:模型上线后的系统性风险与韧性设计

机器学习模型部署不是开发终点,而是真实业务系统集成的起点。当模型从离线实验进入高并发、强耦合、严监管的生产环境,其稳定性不再取决于算法精度,而取决于特征供应链韧性、实时决策延迟控制、多级优雅降级机制及可审计的全链路追踪能力。本文聚焦MLOps核心挑战——如何让模型在数据库抖动、数据漂移、上游故障等现实扰动下仍保持可控、可溯、可干预的决策行为,结合金融与电商实战案例,解析特征熔断、SLA驱动的性能优化、漂移归因分析与合规即代码(Compliance as Code)等关键实践,为构建真正鲁棒的生产级AI系统提

weixin_30667649的博客 470

MuleSoft+LLM企业级AI编排:构建可信、可审计的智能工作流

大语言模型(LLM)在企业落地的核心瓶颈,不是算力或算法,而是缺乏与真实业务系统深度耦合的可信执行环境。AI编排(AI Orchestration)作为一种融合API治理、数据编织与流程自动化的新范式,正成为连接LLM能力与ERP/CRM/SAP等核心系统的桥梁。其技术价值在于解决数据主权、上下文断裂与执行闭环三大难题,支撑合规报告生成、智能单据处理、销售分析辅助等高价值场景。MuleSoft凭借成熟的企业连接器、DataWeave数据编排能力及深度可观测性,成为构建可审计、可治理、可伸缩AI工作流的关键基

weixin_34354945的博客 482

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 419

Spring Boot 工程通用能力建设:声明式事务定制与 Redis 缓存实践

本文探讨Spring Boot中声明式事务的进阶实践,通过解耦“切点”与“事务属性”,实现灵活控制。核心包括:基于方法名的只读规则(如get*、find*自动设为只读),组合事务属性源确保@Transactional注解优先于命名规则,以及自定义切点实现事务统一织入。该方案提升代码可维护性,避免误写,同时支持特殊场景覆盖,构建更健壮的事务治理体系。

BADAO_LIUMANG_QIZHI的博客 246
上一篇: 如何设计一个IM单聊架构
下一篇: 别用 VMware 了,这款虚拟机简单、轻量、好用还免费...
公众号-芋道源码
博客等级 码龄10年 1629粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值