自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

美好开始来了

Java经验与技术解决方案分享

  • 博客(146)
  • 问答 (1)
  • 收藏
  • 关注

原创 并发编程之Tools&CountDownLatch&Semaphore原理与应用

CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖AQS的状态State,是在生产当中比较常用的一个工具类。栅栏屏障,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。

2025-03-07 18:14:27 795

原创 并发编程之JMM&synchronized&volatile详解

可见性理解了指令重排现象后,可见性容易了,可见性指的是当一个线程修改了某个共享变量的值,其他线程是否能够马上得知这个修改的值。对于串行程序来说,可见性是不存在的,因为我们在任何一个操作中修改了某个变量的值,后续的操作中都能读取这个变量值,并且是修改过的新值。但在多线程环境中可就不一定了,前面我们分析过,由于线程对共享变量的操作都是线程拷贝到各自的工作内存进行操作后才写回到主内存中的,这就可能存在一个线程A修改了共享变量x的值,还未写回主内存时,另外一个线程B又对主内存中同一个共享变量x进行操作,但此

2025-03-07 18:11:54 1035

原创 并发编程之Future&ForkJoin框架原理分析

我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应,比如A线程负责处理A队列里的任务。每个工作线程在处理自己的工作队列同时,会尝试窃取一个任务(或是来自于刚刚提交到 pool 的任务,或是来自于其他工作线程的工作队列),窃取的任务位于其他线程的工作队列的队首,也就是说工作线程在窃取其他工作线程的任务时,使用的是 FIFO 方式。

2025-03-06 17:08:25 1346

原创 并发编程之Executor线程池原理与源码解读

由上文中的分析可以知道,在执行execute方法时,如果当前线程池的线程数量超过了corePoolSize且小于maximumPoolSize,并且workQueue已满时,则可以增加工作线程,但这时如果超时没有获取到任务,也就是timedOut为true的情况,说明workQueue已经为空了,也就说明了当前线程池中不需要那么多线程来执行任务了,可以把多于corePoolSize数量的线程销毁掉,保持线程数量在corePoolSize即可。不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。

2025-03-06 17:05:01 978

原创 并发编程之Atomic&Unsafe魔法类详解

否则,需加悲观读锁,再次从主内存加载(x,y)的最新值,然后再进行距离计算。所谓“缓存锁定”就是如果缓存在处理器缓存行中内存区域在LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效,在例1中,当CPU1修改缓存行中的i时使用缓存锁定,那么CPU2就不能同时缓存了i的缓存行。

2025-03-05 15:23:55 1201

原创 MESI缓存一直协议详解

如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。然而CPU的高度运算需要高速的数据。从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy变成invalid状态,而修改E状态的缓存不需要使用总线事务。

2025-03-05 15:19:42 666

原创 01-Collections之Map&List&Set详解

遍历完所有的节点后, 此时形成了两条链表, ln存放的是f.hash&n=0的节点, hn存放的是非0的节点, 然后将ln存放在nextTable第i元素的位置, n+i存放在n+i的位置。迁移链表和红黑树的原理是一样的, 在红黑树中, 我们记录了每个红黑树的first(这个节点不是hash最小的节点)和每个节点的next, 根据这两个元素, 我们可以访问红黑树所有的元素, 红黑树此时也是一个链表, 红黑树和链表迁移的过程一样。所有元素迁移完成后, 旧的table直接丢失, 直接使用新的table。

2025-03-04 09:51:06 746

原创 07-深入理解MVCC与BufferPool缓存机制

在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。

2025-03-04 09:45:46 408

原创 06-深入理解Mysql事务隔离级别与锁机制

接着执行update account set balance = balance - 50 where id = 1,balance没有变成400-50=350,lilei的balance值用的是步骤2中的350来算的,所以是300,数据的一致性倒是没有被破坏。(2)打开一个客户端B,并设置当前事务模式为serializable,更新相同的id为1的记录会被阻塞等待,更新id为2的记录可以成功,说明在串行模式下innodb的查询也会被加上行锁。间隙锁,锁的就是两个值之间的空隙。

2025-03-03 13:44:21 866

原创 05-Mysql索引优化实战二

这里表示user表的id字段的类型是TINYINT,可以存储的最大数值是255。字段有索引:count(*)≈count(1)>count(字段)>count(主键 id) //字段有索引,count(字段)统计走二级索引,二级索引存储数据比主键索引少,所以count(字段)>count(主键 id)当使用left join时,左表是驱动表,右表是被驱动表,当使用right join时,右表时驱动表,左表是被驱动表,当使用join时,mysql会选择数据量比较小的表作为驱动表,大表作为被驱动表。

2025-03-03 13:42:11 1033

原创 02-Mysql索引优化实战(1)

以社交场景APP来举例,我们一般会去搜索一些好友,这里面就涉及到对用户信息的筛选,这里肯定就是对用户user表搜索了,这个表一般来说数据量会比较大,我们先不考虑分库分表的情况,比如,我们一般会筛选地区(省市),性别,年龄,身高,爱好之类的,有的APP可能用户还有评分,比如用户的受欢迎程度评分,我们可能还会根据评分来排序等等。一般来说,通过这么一个多字段的索引是能够过滤掉绝大部分数据的,就保留小部分数据下来基于磁盘文件进行order by语句的排序,最后基于limit进行分页,那么一般性能还是比较高的。

2025-03-01 16:26:39 1149

原创 01-一条SQL在MySQL中是如何执行的

开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。你可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

2025-03-01 16:22:47 923

原创 08-阿里巴巴Arthas详解

用java -jar运行即可,可以识别机器上所有Java进程(我们这里之前已经运行了一个Arthas测试程序,代码见下方)选择进程序号1,进入进程信息操作输入dashboard可以查看整个进程的运行情况,线程、内存、GC、运行环境信息:输入thread可以查看线程详细情况输入 thread加上线程ID 可以查看线程堆栈输入 thread -b 可以查看线程死锁输入 jad加类的全名 可以反编译,这样可以方便我们查看线上代码是否是正确的版本

2025-02-28 09:47:58 755

原创 07-JVM调优工具详解及调优实战

这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden,survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出。1,使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如19663。

2025-02-28 09:39:32 779

原创 06-垃圾收集器G1&ZGC详解

XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。ZGC的停顿时间是在10ms以下,但是ZGC的执行时间还是远远大于这个时间的。

2025-02-27 10:32:19 381

原创 05-垃圾收集器ParNew&CMS与底层三色标记算法详解

原始快照就是当灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮gc清理中能存活下来,待下一轮gc的时候重新扫描,这个对象也有可能是浮动垃圾)增量更新就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。

2025-02-27 10:28:16 1053

原创 03-JVM对象创建与内存分配机制深度剖析

大量的对象被分配在eden区,eden区满了后会触发minor gc,可能会有99%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让eden区尽量的大,survivor区够用即可,而在JAVA中对象就是可以被进一步分解的聚合量。

2025-02-26 19:53:39 726

原创 02-JVM内存模型深度剖析与优化

如果释放了很少的空间, 那么在不超过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。对象在堆内部挪动的过程 其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动到区域的头位置即可,比如扫描s0区域,扫到gcroot引用的非垃圾对象是将这些对象复制到s1或老年代,最后扫描完了将s0区域的对象分配指针移动到区域的起始位置即可,s0区域之前对象并不直接清理,当有新对象分配了,原有区域里的对象也就被清除了。JVM内存参数大小该如何设置?

2025-02-26 19:48:34 908

原创 01-从JDK源码级别彻底剖析JVM类加载机制

比如我们的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里找了半天没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就自己加载,在自己的类加载路径里找了半天也没找到Math类,又向下退回Math类的加载请求给应用程序类加载器,应用程序类加载器于是在自己的类加载路径里找Math类,结果找到了就自己加载了。否则,如果服务器有10个应用程序,那么要有10份相同的类库加载进虚拟机。

2025-02-25 10:19:16 1689

原创 109-RabbitMQ消息中间件

信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。一家火爆的餐厅,很多人去吃饭,如果没有一个排队的系统,直接都进入餐厅,那么餐厅忙不过来,直接把餐厅给挤爆了。这个时候有个第三方的排队叫号系统,等餐厅有位置了,再叫客人进去,这样餐厅不会拥挤过爆,客人也能用餐。默认情况是自动确认,只要消费者接收到消息,没有抛异常,那么就是默认消费成功了,系统就不会重新发消息给消费者了,如果消费者抛出异常,就表示这个消息没有正确消费。

2025-02-25 09:59:18 762

原创 108-fastdfs分布式文件存储

传统的web程序是将图片等文件根服务器存到一起的,这样就有很大一个问题,处理图片的服务器要的是带宽,CPU计算能力不用很强,但是处理业务需要的是CPU计算能力强。带宽不一定要多高,这样囫囵吞枣的搞在一起,就会让服务器的优势发挥不出来。于是我们在想,图片等文件可以找一个磁盘空间大,带宽大,但是不需要CPU计算能力的来做,把业务和文件分开。于是fastdfs可以满足这样的需求。好比是一个酒店前台,客户询问哪里有房间,前台把房间号给你,也就是告诉你storage的ip地址,你去找storage存取文件。

2025-02-25 09:51:37 407

原创 Windows通过Ollama本地安装DeepSeekR1、qianwen2.5等大模型,并实现调用

以deepeseek举例,b是指10亿参数的意思,最大671b就是671*10亿参数的意思,这个版本俗称(满血版),我们开发环境的话,选择(7b-14b)就可以了,否则你的电脑是拖不动的。Ollma是一个快速安装大模型的工具,因为目前市面上有很多大模型,如果我们自己每个都动手去安装,就很麻烦,使用Ollama可以一个命令就安装一个大模型,2个命令就安装两个,以此类推。注意:安装的位置尽量不要放在C盘,除非你C盘空间很大,因为大模型的下载会非常占用磁盘空间,所以尽可能安装在别的磁盘空间大的地方。

2025-02-24 17:31:36 676

原创 107-项目实战:三节课实现微信支付宝各种支付

做开发之前,一定要把业务搞得清楚,才不会乱写代码,写出来的东西才是领导和客户想要的,所以我们先画一波业务流程图。学完JavaSE基础、MySQL、JavaWeb知识、了解MyBatis和Spring Boot框架。如果不会安装的小白同学,建议先学习我的2023版免费JavaSE课程,大概2-3周可以学习完毕。免费课程链接:https://lzket.com。ctrl+alt+s 快捷键打开设置。

2025-02-24 10:09:10 473

原创 106-Jenkins的部署

启动后安装完插件后,配置管理员账户密码,需要重启。输入账户密码执行登录。

2025-02-24 10:03:25 263

原创 105-Centos7.9搭建K8s:1.30.2

找到:[plugins."io.containerd.grpc.v1.cri".registry.mirrors] 配置。kubectl get componentstatus 或者 kubectl get cs。如果在线下载不行的话,可以借助服务器的网速去下载,然后导出。在k8s目录下:# 下载 calico 配置文件,可能会网络超时。docker load -i 导入镜像,这个命令跟k8s无关。# 删除镜像 / 前缀,避免下载过慢导致失败。可能是DNS没有配置,去配置。无 (最小单元为pod)

2025-02-24 10:01:06 922

原创 104-Java代码png图片转ico

【代码】104-Java代码png图片转ico。

2025-02-24 09:51:08 208

原创 103-Docker搭建ES8.11.1和Kibana

但是,如果第一次直接挂载证书和密钥,也不行,因为还没有生成,官网推荐和网络上解决的办法是先生成keystore,然后启动的时候挂载,然而会报:Device or resource busy!这个报错的意思是说,开启了安全认证时候,需要配置密钥keystore和证书。这是因为第一次启动后,数据卷已经挂载到本地,再次访问本地数据的时候需要安全认证,第二次启动的时候,没有挂载证书和密钥,所以报错。请注意,巨坑:此时不要挂载config配置目录,否则无法启动,这是因为第一次没有密钥的文件和认证证书!

2025-02-23 20:55:10 792

原创 102-ShardingJDBC分库分表理论与实战

通过图中我们可以看到,当进行第一次 next 调用时,排在队列首位的 t_score_0 将会被弹出队列,并且将当前游标指向的数据值(也就是 100)返回至查询客户端,并且将游标下移一位之后,重新放入优先级队列。将 3 个数据结果集的当前游标指向的数据值进行排序,并放入优先级队列,t_score_0 的第一个数据值最大,t_score_2 的第一个数据值次之,t_score_1 的第一个数据值最小,因此优先级队列根据 t_score_0,t_score_2 和 t_score_1 的方式排序队列。

2025-02-23 20:52:53 550

原创 101-分布式事务专题

此时,参与者都会在等待超时之后,继续执行事务提交。但是最大努力通知,事务主动方仅仅是尽最大努力(重试,轮询....)将事务发送给事务接收方,所以存在事务被动方接收不到消息的情况,此时需要事务被动方主动调用事务主动方的消息校对接口查询业务消息并消费,这种通知的可靠性是由事务被动方保证的。2PC,两阶段提交,将事务的提交过程分为资源准备和资源提交两个阶段,并且由事务协调者来协调所有事务参与者,如果准备阶段所有事务参与者都预留资源成功,则进行第二阶段的资源提交,否则事务协调者回滚资源。

2025-02-22 15:43:40 827

原创 100-Docker搭建Seata 服务

查看是否启动:docker logs -f seata-server-standalone。

2025-02-22 15:36:01 209

原创 99-分布式事务专题和Seata

在 RPC(远程访问) 调用分支事务try时,先注册分支事务,再执行RPC调用,如果此时 RPC 调用的网络发生拥堵,通常 RPC 调用是有超时时间的,RPC 超时以后,TM就会通知RM回滚该分布式事务,可能回滚完成后,RPC 请求才到达参与者并且真正执行成功,而此时Try 方法才执行完成并且将所需的业务资源预留,但是此时二阶段已经完成无法对预留的资源做出处理。也就是说,绝大多数情况,这就是单靠技术获得薪资的天花板了,再有高的薪资,更多的是基于你技术之外的其他能力决定的。想再修改,那就得重新发起事务了。

2025-02-22 15:35:17 925

原创 98-Ribbon版实现负载均衡原理

很明白负载均衡原理后,显然,我们只需要自定义IRule接口的实现类即可/*** @author:菩提老师* @学习地址:lzket.com*/@Override// 比方说uri 做个 hash算法 取模。

2025-02-21 10:43:25 115

原创 97-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第12章:服务调用链路追踪)【完结】

这个配置拿来主要是检测微服务调用链路之间的时间、数据、参数,快速定位微服务调用链路中可能出现有问题的服务代码。运行:java -jar zipkin.jar。访问:localhost:9411/

2025-02-21 10:09:45 290

原创 96-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第11章:RocketMQ Stream)

启动RocketMQ集群:3个namerserver、2主2从broker、一个仪表盘。关于RocketMQ的知识,这里不展开讲。

2025-02-20 10:59:34 131

原创 95-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第10章:Cloud Stream 消息驱动)

项目中极高的可能会用到消息中间件,如果全部开发人员都用同一款消息中间件,那么这个框架就没有用。但公司有可能有很多团队,有很多开发人员,不同的团队,可能会用到不同的消息中间件。那么不同的消息中间件在使用上是不同的,这样对开发人员要求掌握的消息中间件就多了。例如A团队是用的kafka,B团队用到rabbitmq,C团队用的RocketMQ...Cloud Stream就是用来统一 发送消息与接收消息的API,使开发人员更关注业务,屏蔽不同消息中间件的不同使用方法。我个人观点:消息中间件原理都是相通的,把一个学好

2025-02-20 10:56:22 214

原创 94-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第9章:Config配置中心(组件5))

然后你去修改yml文件就会成功了,需要注意的是,如果yml文件的名称是abc.yml那么默认会去更新abc这个微服务,如果名称是application.yml,那么会更新所有微服务。注意:如果配置中心向Nacos 注册中心注册自己,配置客户端是不能完成通过配置的服务名称来获取配置中心地址的,所以这里演示用Eureka来做注册中心。注意:新版的config客户端可以不用bootstrap.yml。配置中心实际上也算是一个微服务,所以需要往注册中心去注册自己的信息。如果是开发环境:地址需要内网穿透。

2025-02-20 10:53:51 779

原创 93-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第8章:网关】路由器和过滤器:Gateway(组件4))

SpringCloud GetWay 是基于webFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。反向代理路由微服务、鉴权、流量控制、熔断、日志监控等,比如返回token的时候,我们就可以在响应过滤的时候去做。而Zuul使用的是(同步阻塞IO模型:一个请求会创建一个线程),吞吐量会低很多,不支持长连接。上面的方式是uri写死的,不能实现负载均衡,我们需要按照微服务的名称实现负载均衡。:它由 ID、目标 URI、断言集合和过滤器集合定义。Predicate。

2025-02-20 10:48:15 947

原创 92-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第7章:断路器:服务的降级和熔断(组件3))

是只服务的某个接口,在压力太大(比如并发太多、请求太多、频繁抛异常等)情况下,短暂的不能对外提供服务,可以在一定时间内尝试恢复到正常状态的情况。(注意:如果是写的路径,那么会调用sentinel自身的异常备选方法,只有配置自己写的资源名称,才会触发自己写的备选方法)3、回退的自己写的假接口的实现类,必须是Spring的 Bean,也就是你可以加上@Component注解。服务回退可以使用工厂类,也可以使用特定的一个类,都需要是一个Spring的Bean。grade:阈值类型,0表示线程数,1表示QPS;

2025-02-20 10:43:48 692

原创 91-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第6章:OpenFeign接口伪装技术)

8、关于服务回退需要注意四个地方:1需要是Spring Bean实例 2、需要@FeignClient中配置 3、yml中需要开启(开启方式有三类)4、要实现对应回退的FeignClient接口。直接调用接口就完事了。2、Feign只要加了负载均衡组件,可以实现负载均衡,当然如果想使用Nacos的负载均衡,开启即可。3、Feign中@FeignClient注解中,的方法(元素)比较重要。4、自定义配置,可以添加头信息、地址修改、参数修改等操作。5、除了以上,Feign其他配置可以顶替,

2025-02-20 10:35:31 485

原创 90-Spring Cloud [Alibaba] 2021.0.4 JDK17之前的最新生产版(第5章:负载均衡:调用方(组件2))

需要注意:Nacos有自带的随机权重算法,如果需要,必须增加loadbalancer 组件-->@LoadBalancerClient 注解的name属性是。LoadBalanced 注解就能实现负载均衡?@LoadBalanced 注解原理。zookeeper客户端也带了。Ribbon版实现负载均衡原理。

2025-02-20 10:29:03 706

Deep Seek R1 Windows AI 助手 APP

Deep Seek R1 Windows AI 助手 APP

2025-02-19

Deep Seek R1 AI 助手 Window 桌面APP

Deep Seek R1 AI 助手 Window 桌面APP

2025-02-18

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除