自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

爱是用心码,不要说话!

  • 博客(140)
  • 收藏
  • 关注

原创 IntelliJ IDEA 2023.3发布,更新AI助手,运行相当流畅,再也不卡了

这两天Jetbrains来了一波大的更新,推出了2023.3正式版,均做了不少优化,最重要的是大家期待已久的Ai Assistant插件本次更新也正式推出,助力大家提高Coding效率。为了提高 IDE 的启动速度,我们默认启用了共享 JDK 索引的下载。另外,即便是你用了魔法工具上网,现在主流的激活工具和授权等同样无法直接激活Ai助手,似乎其不在全家桶范围内,只能去官方店铺购买商用授权许可,激活Ai助手。这两天使用情况,IDEA启动,运行都越来越轻便了,尤其是我用的正版,可以说是非常丝滑哈哈。

2023-12-08 02:49:27 2933

原创 滴滴昨晚崩了,看这波还敢不敢降本增效?

其次,事故持续时间较长。在此期间,青桔单车的扫码功能仍然不可用,底部标签栏的多个关键功能也无法正常打开。紧接着,在晚上 11 点 20 分左右,滴滴通过微博发布紧急声明,表示他们正在积极进行故障排查与修复,并对用户所遭受的不便表达了歉意。首先,事故的影响范围极为广泛,它严重影响了APP和小程序的正常运行,用户几乎无法使用这两个平台的大部分功能。最后,而且也是最重要的,这次事件可能会对用户对滴滴服务的信心造成长期影响,这是一个非常严重的后果。】标签栏无法打开,估摸年终奖没了,技术团队有苦说不出。

2023-11-28 00:47:31 1802

原创 JDK21发布了!面试官:来,谈下jdk21的新特性!

JDK21 计划23年9月19日正式发布,尽管一直以来都是“版随意出,换 8 算我输”,但这么多年这么多版本的折腾,若是之前的 LTS 版本JDK17你还觉得不错,那 JDK21还是有必要关注一下,因为会有一批重要更新发布到生产环境中,特别是被众人期待已久的虚拟线程,纵然说这东西我感觉没有必要的用不到,需要的早已转go了,但作为近几年JDK一个“重要”的更新,在实际开发应用中还是有相当的价值。与前面的JEP相比,主要变化是删除了带括号的模式并允许合格的enum常量,如带switch表达式和语句的常量。

2023-09-19 21:39:18 5960 2

原创 【23期】你知道Java面向对象设计的六大原则吗

如果我们有一个类A和类B通过接口I来依赖,类B是对类A依赖的实现,这个接口I有5个方法。在这里我们不需要关心老板是从哪里,怎么获得的那张CD,我们只和老板(直接朋友)沟通,至于老板从他的朋友那里通过何种条件得到的CD,我们不关心,我们不和老板的朋友(陌生人)进行通信,这个就是迪米特的一个应用。可以降低类的复杂度,一个类只负责一项职责,这样逻辑也简单很多 提高类的可读性,和系统的维护性,因为不会有其他奇怪的方法来干扰我们理解这个类的含义 当发生变化的时候,能将变化的影响降到最小,因为只会在这个类中做出修改。

2023-09-14 01:24:02 216

原创 【24期】既然你精通Java并发,请你细说一下J.U.C

首先了解Callable、Future、RunnableFuture三个接口间的关系以及FutureTask的实现原理,然后研究如何创建ThreadPoolExecutor,如何运行一个任务,如何管理自身的线程,同时了解RejectedExecutionHandler的四种实现差异,最后,在实际应用中学习如何通过调整ThreadPoolExecutor的参数来优化线程池。acquire是一种以独占方式获取资源,如果获取到资源,线程直接返回,否则进入等待队列,直到获取到资源为止,且整个过程忽略中断的影响。

2023-09-04 20:04:07 203

原创 【20期】说一说Java引用类型原理

严格的说,虚引用是会影响对象生命周期的,如果不做任何处理,只要虚引用不被回收,那其引用的对象永远不会被回收。可以看到,对于Soft references和Weak references clear_referent字段传入的都是true,这也符合我们的预期:对象不可达后,引用字段就会被置为null,然后对象就会被回收(对于软引用来说,如果内存足够的话,在Phase 1,相关的引用就会从refs_list中被移除,到Phase 3时refs_list为空集合)。

2023-09-04 20:03:24 179

原创 【17期】请你说说什么是IO同步、异步、阻塞、非阻塞以及它们的区别?

但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。在IO multiplexing Model中,实际中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的process其实是一直被block的。从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。

2023-08-29 19:46:15 134

原创 【12期】谈一谈redis两种持久化机制的区别?

整个重写过程是安全的,因为Redis在创建新AOF文件时会继续将命令追加到现有的AOF文件中,即使在重写过程中发生故障停机,现有的AOF文件也不会丢失。一旦新AOF文件创建完成,Redis会从旧的AOF文件切换到新的AOF文件,并开始追加操作。导出AOF文件也很简单,举个例子,如果不小心执行了FLUSHALL命令,只要停止服务器,移除AOF文件末尾的FLUSHALL命令,并重启Redis,就可以将数据集恢复到FLUSHALL执行之前的状态。对于相同的数据集来说,AOF文件的体积通常比RDB文件的体积大。

2023-08-29 19:45:37 847

原创 【09期】HashMap常见面试题

因为在 HashMap 的链表结构中遍历判断的时候,特定情况下重写的 equals 方法比较对象是否相等的业务逻辑比较复杂,循环下来更是影响查找效率。扩容时,重新将键值对存储新的桶数组里,键的键之间产生的碰撞会下降,链表长度变短。相反,如果增加负载因子(负载因子可以大于1),HashMap 所能容纳的键值对数量变多,空间利用率高,但碰撞率也高。HashMap 按当前桶数组长度的2倍进行扩容,阈值也变为原来的2倍(如果计算过程中,阈值溢出归零,则按阈值公式重新计算)。如果是普通节点,则节点按原顺序进行分组。

2023-08-29 19:45:02 188

原创 【08期】ArrayList常见面试题

之前放在构造方法中。ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,那么有些空间可能就没有实际存储元素,采用上诉的方式来实现序列化时,就可以保证只序列化实际存储的那些元素,而不是整个数组,从而。计算容量:如果elementData是空,则返回默认容量10和size+1的最大值,否则返回size+1。

2023-08-29 19:44:19 772

原创 redis应用 9: Scan

limit 参数就表示需要遍历的槽位数,之所以返回的结果可能多可能少,是因为不是所有的槽位上都会挂接链表,有些槽位可能是空的,还有些槽位上挂接的链表上的元素可能会有多个。假设当前的字典的数组长度由 8 位扩容到 16 位,那么 3 号槽位 011 将会被 rehash 到 3 号槽位和 11 号槽位,也就是说该槽位链表中大约有一半的元素还是 3 号槽位,其它的元素会放到 11 号槽位,11 这个数字的二进制是 1011,就是对 3 的二进制 011 增加了一个高位 1。scan 的遍历顺序非常特别。

2023-08-29 19:41:50 253

原创 redis 应用 4: HyperLogLog

然后我们把上面的脚本再跑一边,也就相当于将数据重复加入一边,查看输出,可以发现,pfcount 的结果没有任何改变,还是 99723,说明它确实具备去重功能。不过你也不必过于担心,因为 Redis 对 HyperLogLog 的存储进行了优化,在计数比较小时,它的存储空间采用稀疏矩阵存储,空间占用很小,仅仅在计数慢慢变大,稀疏矩阵占用空间渐渐超过了阈值时才会一次性转变成稠密矩阵,才会占用 12k 的空间。接下来我们使用脚本,往里面灌更多的数据,看看它是否还可以继续精确下去,如果不能精确,差距有多大。

2023-08-29 19:41:14 1215

原创 redis应用 2:延时队列

可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop,又没有数据。Redis 的消息队列不是专业的消息队列,它没有非常多的高级特性,没有 ack 保证,如果对消息的可靠性有着极致的追求,那么它就不适合使用。Redis 的 zrem 方法是多线程多进程争抢任务的关键,它的返回值决定了当前实例有没有抢到任务,因为 loop 方法可能会被多个线程、多个进程调用,同一个任务可能会被多个进程线程抢到,通过 zrem 来决定唯一的属主。处理完了再接着获取消息,再进行处理。

2023-08-29 19:40:41 207

原创 【03期】说说Object类下面有几种方法呢?

导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保相等的两个对象拥有相等的hashCode。导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

2023-08-29 19:36:28 145

原创 并发编程系列 - ReadWriteLock

写缓存则需要用到写锁,写锁的使用和读锁是类似的。如果源头数据量非常大,那么就需要按需加载了,按需加载也叫懒加载,指的是只有当应用查询缓存,并且数据不在缓存里的时候,才触发加载源头相关数据进缓存的操作。需要注意的是,如果缓存中没有缓存目标对象,那么就需要从数据库中加载,然后写入缓存,写缓存需要用到写锁,所以在代码中的⑤处,我们调用了。另外,还需要注意的是,在获取写锁之后,我们并没有直接去查询数据库,而是在代码⑥⑦处,重新验证了一次缓存中是否存在,再次验证如果还是不存在,我们才去查询数据库并更新本地缓存。

2023-08-18 00:43:26 526

原创 并发编程系列-分而治之思想Forkjoin

ForkJoinPool支持任务窃取机制,能够让所有线程的工作量基本均衡,不会出现有的线程很忙,而有的线程很闲的状况,所以性能很好。在这个计算框架中,Fork代表任务的分解,而Join代表结果的合并。这两部分的关系类似于ThreadPoolExecutor和Runnable之间的关系,都是用于提交任务到线程池的,只不过分治任务有自己独特的类型ForkJoinTask。在这个分治任务模型里,任务和分解后的子任务具有相似性,这种相似性往往体现在任务和子任务的算法是相同的,但是计算的数据规模是不同的。

2023-08-17 19:03:30 321

原创 并发编程系列-CompletableFuture

既然存在try{}catch{},那么必然还有try{}finally{},whenComplete()和handle()系列方法就类似于try{}finally{}中的finally{},无论是否发生异常都会执行whenComplete()中的回调函数consumer和handle()中的回调函数fn。描述的就是一种汇聚关系。CompletionStage接口给我们提供的方案非常简单,比try{}catch{}还要简单,下面是相关的方法,使用这些方法进行异常处理和串行操作是一样的,都支持链式编程方式。

2023-08-16 00:32:24 248

原创 并发编程系列-Semaphore

在这个方法中,我们首先调用acquire()方法(在finally块中会调用release()方法),假设对象池大小为10,信号量的计数器初始化为10,那么前10个线程调用acquire()方法后可以继续执行,相当于通过了信号灯,而其他线程将阻塞在acquire()方法上。当线程T1执行release()操作,也就是up()操作时,信号量中计数器的值是-1,经过加1后的值是0,小于等于0,根据信号量模型中对up()操作的描述,此时等待队列中的T2将被唤醒。实际上,信号量的使用也是类似的。

2023-08-15 01:48:34 461

原创 谈谈Spring与字节码生成技术

我会先带你了解Java的虚拟机和字节码的指令,然后借助ASM这个工具,生成字节码,最后,再实现从AST编译成字节码。我们的一个产品,需要一个规则引擎,解析自定义的DSL,进行规则的计算。ASM解析字节码的过程,有点像XML的解析器解析XML的过程:先解析类,再解析类的成员,比如类的成员变量(Field)、类的方法(Mothod)。其中,每个指令都是8位的,占一个字节,而且iload_0、iconst_0这种指令,甚至把操作数(变量的下标、常数的值)压缩进了操作码里,可以看出,字节码的设计很注重节省空间。

2023-08-11 01:27:48 626

原创 redis 集群 2:分而治之 —— Codis

首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢复时也会消耗很长的数据加载时间,特别是在云环境下,单个实例内存往往都是受限的。现在 Redis-Cluster 在业界已经逐渐流行起来,Codis 能否持续保持竞争力是个问题,我们看到 Codis 在不断的差异化竞争,竞争的方法就体现在工具上,而不是内核,这个和官方的路线真是相反的,官方对工具无暇顾及,只提供基本的工具,其它完全交给第三方去开发。

2023-08-04 00:45:31 516 1

原创 redis 集群 1:李代桃僵 —— Sentinel

客户端通过新的主节点继续进行交互。连接池建立新连接时,会去查询主库地址,然后跟内存中的主库地址进行比对,如果变更了,就断开所有连接,重新使用新地址建立新连接。sentinel 的默认端口是 26379,不同于 Redis 的默认端口 6379,通过 sentinel 对象的 discover_xxx 方法可以发现主从地址,主地址只有一个,从地址可以有多个。这个就是由第二个参数控制的,它的单位是秒,表示如果 10s 没有收到从节点的反馈,就意味着从节点同步不正常,要么网络断开了,要么一直没有给反馈。

2023-08-04 00:44:17 1146

原创 redis原理 8:有备无患 —— 主从同步

在整个快照同步进行的过程中,主节点的复制 buffer 还在不停的往前移动,如果快照同步的时间过长或者复制 buffer 太小,都会导致同步期间的增量指令在复制 buffer 中被覆盖,这样就会导致快照同步完成后无法进行增量复制,然后会再次发起快照同步,如此极有可能会陷入快照同步的死循环。所谓无盘复制是指主服务器直接通过套接字将快照内容发送到从节点,生成快照是一个遍历的过程,主节点会一边遍历内存,一边将序列化的内容发送到从节点,从节点还是跟之前一样,先将接收到的内容存储到磁盘文件中,再进行一次性加载。

2023-08-04 00:41:55 348

原创 redis 原理 7:开源节流 —— 小对象压缩

Redis 虽然删除了 1GB 的 key,但是这些 key 分散到了很多页面中,每个页面都还有其它 key 存在,这就导致了内存不会立即被回收。如果整数可以用 uint16 表示,那么 intset 的元素就是 16 位的数组,如果新加入的整数超过了 uint16 的表示范围,那么就使用 uint32 表示,如果新加入的元素超过了 uint32 的表示范围,那么就使用 uint64 表示,Redis 支持 set 集合动态从 uint16 升级到 uint32,再升级到 uint64。

2023-08-04 00:39:13 374

原创 redis原理 6:小道消息 —— PubSub

但是挂掉的消费者重新连上的时候,这断连期间生产者发送的消息,对于这个消费者来说就是彻底丢失了。它表示消息的类型,如果是一个普通的消息,那么类型就是 message,如果是控制消息,比如订阅指令的反馈,它的类型就是 subscribe,如果是模式订阅的反馈,它的类型就是 psubscribe,还有取消订阅指令的反馈 unsubscribe 和 punsubscribe。如果 Redis 停机重启,PubSub 的消息是不会持久化的,毕竟 Redis 宕机就相当于一个消费者都没有,所有的消息直接被丢弃。

2023-08-04 00:37:26 579

原创 redis原理 5:同舟共济 —— 事务

上面的 Redis 事务在发送每个指令到事务缓存队列时都要经过一次网络读写,当一个事务内部的指令较多时,需要的网络 IO 时间也会线性增长。上面的指令演示了一个完整的事务过程,所有的指令在 exec 之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。到这里,你应该明白 Redis 的事务根本不能算「原子性」,而仅仅是满足了事务的「隔离性」,隔离性中的串行化——当前执行的事务有着不被其它事务打断的权利。

2023-08-04 00:36:18 277

原创 redis原理 4:雷厉风行 —— 管道

这便是管道操作的本质,服务器根本没有任何区别对待,还是收到一条消息,执行一条消息,回复一条消息的正常的流程。但是如果缓冲是空的,那么就需要等待数据到来,这个就是读操作 IO 操作的真正耗时。两个连续的写操作和两个连续的读操作总共只会花费一次网络来回,就好比连续的 write 操作合并了,连续的 read 操作也合并了一样。这就是管道的本质了,它并不是服务器的什么特性,而是客户端通过改变了读写的顺序带来的性能的巨大提升。操作会等待一个网络的来回开销,然后所有的响应消息就都已经回送到内核的读缓冲了,后续的。

2023-08-04 00:33:10 361

原创 redis原理 3:未雨绸缪 —— 持久化

假设 AOF 日志记录了自 Redis 实例创建以来所有的修改性指令序列,那么就可以通过对一个空的 Redis 实例顺序执行所有的指令,也就是「重放」,来恢复 Redis 当前实例的内存数据结构的状态。子进程因为数据没有变化,它能看到的内存里的数据在进程产生的一瞬间就凝固了,再也不会改变,这也是为什么 Redis 的持久化叫「快照」的原因。AOF 日志是以文件的形式存在的,当程序对 AOF 日志文件进行写操作时,实际上是将内容写到了内核为文件描述符分配的一个内存缓存中,然后内核会异步将脏数据刷回到磁盘的。

2023-08-04 00:31:59 279

原创 redis原理 2:交头接耳 —— 通信协议

Redis 将所有数据都放在内存,用一个单线程对外提供服务,单个节点在跑满一个 CPU 核心的情况下可以达到了 10w/s 的超高 QPS。数组的第一个值表示游标的值,如果这个值为零,说明已经遍历完毕。这里的 hgetall 命令返回的就是一个数组,第 0|2|4 位置的字符串是 hash 表的 key,第 1|3|5 位置的字符串是 value,客户端负责将数组组装成字典再返回。scan 命令用来扫描服务器包含的所有 key 列表,它是以游标的形式获取,一次只获取一部分。符号开头,后跟整数的字符串形式。

2023-08-04 00:30:41 259

原创 redis原理 1:鞭辟入里 —— 线程 IO 模型

时间,线程处于阻塞状态。莫要瞧不起单线程,除了 Redis 之外,Node.js 也是单线程,Nginx 也是单线程,但是它们都是服务器高性能的典范。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。写也是一样,如果缓冲区满了,写不完,剩下的数据何时才应该继续写,线程也应该得到通知。,表示最多读取这么多字节后再返回,如果一个字节都没有,那么线程就会卡在那里,直到新的数据到来或者连接关闭了,

2023-08-04 00:28:30 388

原创 SequenceDiagram 查看代码时序图的利器,做技术方案必备!

每个时序图节点,右键单击,有两个选项“Go to Source” 和 “ Remove Method 'xxxxxx()'”,分别为跳转到源代码对应的位置 和 从时序图中删除对应的方法,去除冗余信息,简化时序图,方便修改时序图显示。在经历过多次需求变更后,画时序图更是头秃。另外,通过时序图,可以快速了解业务在代码实现时的设计思路,已经相应的流程节点,可以从时序图快速了解认识业务,是开发和测试均需了解和知道的快速学习方法。若生成的时序图比较大时,若无更高的精准度要求,可适当减少调用层数进行时序图大小的调整。

2023-08-03 21:16:35 867

原创 什么?你还没有用过JPA Buddy,那么你工作肯定没5年

JPA Buddy是一个广泛使用的IntelliJ IDEA插件,面向使用JPA数据模型和相关技术(如Spring DataJPA,DB版本控制工具(Flyway,Liquibase),MapStruct等)的新手和有经验的开发人员。该插件的好处是它不仅支持JPA,还支持数据访问层开发中使用的相关库:Spring Data JPA,MapStruct,Lombok和DB版本控制解决方案。数据通常比代码更长久,因此当我们在现有数据库上构建 JPA 数据层时,我们需要基于当前表创建 JPA 实体。

2023-08-03 21:13:39 850

原创 JAVA大神必备,IDEA自带的JVM监控神器

Eden Space:新生代Eden区内存使用情况 (200.00M,34.125M): 31.52M,109 collections,612.827ms表示Eden区的最大容量为200M,当前容量为34.125M,当前已使用31.52M,从开始监控到现在在该内存区域一共发生了109次gc(Minor GC),gc总耗时为612.827ms。开发阶段实时监测,自己的JVM信息,实时可视化 Hotspot JVM 垃圾回收监控工具, 支持查看本地和远程JVM进程, 支持G1 and ZGC算法。

2023-08-03 20:57:07 2392

原创 Jetbrains 2023.2教程

激活演示(2023.2尚未发布)仔细看每一个工具演示的图片。

2023-07-28 03:23:51 495 1

原创 微服务的各种边界在架构演进中的作用

有些项目团队在将集中式单体应用拆分为微服务时,首先进行的往往不是建立领域模型,而只是按照业务功能将原来单体应用的一个软件包拆分成多个所谓的“微服务”软件包,而这些“微服务”内的代码仍然是集中式三层架构的模式,“微服务”内的代码高度耦合,逻辑边界不清晰,这里我们暂且称它为“小单体微服务”。其实很简单,只需要看它是否满足这样的情形就可以了:随着业务的发展或需求的变更,在不断重新拆分或者组合成新的微服务的过程中,不会大幅增加软件开发和维护的成本,并且这个架构演进的过程是非常轻松、简单的。那什么是演进式架构呢?

2023-07-26 01:49:30 1309

原创 分布式架构关键设计10问

这样,你可以在货物运输微服务,一次获取前序订单的清单数据和货物运输单数据,将所有数据一次反馈给前端应用,降低跨微服务的调用。在微服务设计时你会经常发现,某些数据需要关联前序微服务的数据。数据同步与复制主要用于数据库之间的数据同步,实现业务数据迁移、数据备份、不同渠道核心业务数据向数据平台或数据中台的数据复制、以及不同主题数据的整合等。对于实时性要求高的强一致性业务场景,你可以采用分布式事务,但分布式事务有性能代价,在设计时我们需平衡考虑业务拆分、数据一致性、性能和实现的复杂度,尽量避免分布式事务的产生。

2023-07-26 01:45:46 180

原创 一个字符的网路旅程

如果用户请求的数据数据是静态的资源,这些资源的URL通常以image.taobao.com之类的二级域名进行标识,域名解析的时候就会解析为淘宝CDN的IP地址,请求先被CDN处理,如果CDN中有需要的静态文件,就直接返回,如果没有,CDN会将请求发送到淘宝的数据中心,CDN从淘宝数据中心获得静态文件后,一方面缓存在自己的服务器上,一方面将数据返回给用户的App。这个字符如何穿越遥远的空间,从手机发送到淘宝的数据中心,在淘宝计算得到相关的结果,然后将结果再返回到我们的手机上,从而完成自己的互联网之旅呢?

2023-07-22 20:17:11 147

原创 趣谈拜占庭将军问题

实际上,它是分布式领域最复杂的一个容错模型,一旦搞懂它,你就能掌握分布式共识问题的解决思路,还能更深刻地理解常用的共识算法,在设计分布式系统的时候,也能根据场景特点选择适合的算法,或者设计适合的算法了。也就是说,无论叛将楚如何捣乱,苏秦、齐和燕,都执行一致的作战计划,保证作战的胜利。这时,如果忠诚的将军,比如齐先发起作战信息协商,一旦叛将小楚修改或伪造收到的作战信息,那么燕在接收到楚的作战信息的时候,会发现齐的作战信息被修改,楚已叛变,这时他将忽略来自楚的作战信息,最终执行齐发送的作战信息。

2023-07-10 19:50:52 267

原创 浅析Lambda架构

你可能会想到我们可以利用这些停车场的历史数据,建立一个人工智能的预测模型,在推荐停车位的时候,不单单考虑到附近停车场的剩余停车位和用户与停车场的相邻距离,还能将预测模型应用在推荐里,看看未来的一段时间内这个停车场是否有可能会被停满了。比如说,批处理层的每个任务都需要1个小时才能完成,而在这1个小时里,我们是无法获取批处理层中最新任务给出的数据视图的。时间长达几周或者的几个月的数据,我们可以结合批处理层和速度层的数据视图来得出,而快至几个小时的数据我们又可以根据速度层的数据视图来获知,怎么样?

2023-07-03 01:10:54 573

原创 消息队列如何处理重复消息

本文主要介绍了通过幂等消费来解决消息重复的问题,然后描述几种实现幂等操作的方法,可以利用数据库的约束来防止重复更新数据,也可以为数据更新设置一次性的前置条件,来防止重复消息,如果这两种方法都不适用于你的场景,还可以用“记录并检查操作”的方式来保证幂等,这种方法适用范围最广,但是实现难度和复杂度也比较高,一般不推荐使用。更加通用的方法是,给你的数据增加一个版本号属性,每次更数据前,比较当前数据的版本号是否和消息中的版本号一致,如果不一致就拒绝更新数据,更新数据的同时将版本号+1,一样可以实现幂等更新。

2023-07-01 05:39:29 439

原创 从底层理解CAS原语

另外,你需要知道的是,这种使用CAS原语反复重试赋值的方法,它是比较耗费CPU资源的,因为在for循环中,如果赋值不成功,是会立即进入下一次循环没有等待的。通过这个伪代码,你就可以看出CAS原语的逻辑,非常简单,就是先比较一下变量p当前的值是不是等于old,如果等于,那就把变量p赋值为new,并返回true,否则就不改变变量p,并返回false。CAS和FAA在各种编程语言中,都有相应的实现,可以来直接使用,无论你是使用哪种编程语言,它们底层的实现是一样的,效果也是一样的。

2023-07-01 05:33:51 165

空空如也

空空如也

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

TA关注的人

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