![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
中间件
文章平均质量分 95
善守的大龙猫
昔之善战者,先为不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能为不可胜,不能使敌之必可胜。故曰:胜可知,而不可为!
成为专家!成为专家!
展开
-
多线程编程漫谈
具体实现是,调用 CountDownLatch 的 await 方法使自己处于阻塞状态,然后当具体的刷盘线程完成刷盘之后,通过调用 wakeupCustomer 方法,实际上调用了 CountDownLatch 的 countDown 方法,实现唤醒主线程的目的。在与用户交互的场景中,如果几十万个文件下载请求同时提交到线程池,当线程池中的所有线程都在处理任务时,无法及时处理的请求就会存储到线程池中的阻塞队列中。线程池自带一定的限流效果,因为工作线程数量是一定的,线程池允许的最大并发也是确定的。原创 2024-01-24 22:38:00 · 904 阅读 · 0 评论 -
红黑树的应用 - TreeMap、LinkedHashMap、PriorityQueue
继续插入节点 30:当前节点 (0030)、父节点 (0025) 和叔叔节点 (0037) 都为红色,所以可以将当前节点的祖先 (0035) 的状态传递给子节点,变成上图第二个状态。继续插入节点 26:可以看到,现在的状态是,当前节点 (0026) 和父节点 (0030) 为红色,当前节点为左子树,父节点为右子树,并且叔叔节点并不为红色(组成一个大于号)。这时候我们也需要右旋,以当前节点为支点,将其父节点作为当前节点的右节点,当前节点重新充当其祖父节点的右节点,状态从图一转为图二。原创 2024-01-23 21:52:55 · 1048 阅读 · 0 评论 -
中间件存储设计 - 数组与链表
这带来的效果就是,如果 HashMap 有 32 个哈希槽,当前存储的数据也刚好有 32 个,这些数据却不一定全会落在哈希槽中,因为可能存在 hash 值一样但是不同 Key 的数据,这时,数据就会进入到链表中。不过,数组从严格意义上来说是面向过程编程中的产物,而 Java 是一门面向对象编程的语言,所以,直接使用数组容易破坏面向对象的编程范式,故面向对象编程语言都会对数组进行更高级别的抽象,在 Java 中对应的就是 ArrayList。其中,数组与链表是最底层的两种结构,是后续所有数据结构的基础。原创 2024-01-22 22:49:47 · 1271 阅读 · 0 评论 -
中间件-缓存、索引、日志
然后,在需要采集的机器中安装 Logstash 进程,通过 Logstash 将日志数据存储到 Elasticsearch 服务器,用户可以通过 Kibana 查询存储在 Elasticsearch 中的日志数据,这样,我们就可以有针对性地查询所需要的日志了。由于订单编号为 1 的订单信息存储在 order_db_00 中,但与这条订单关联的订单字表却存储在 order_db_01 中,而 Join 操作需要的笛卡尔积操作存在于不同的数据库实例中,所以我们就要将多个数据库中的数据统一加载到内存中。原创 2024-01-22 22:12:44 · 1404 阅读 · 0 评论 -
什么是中间件?
通过刚才的学习,我们知道了中间件的概念,它是为了解决系统中的技术需求,将技术需求与业务需求进行解耦,让我们专注于业务代码开发的一个个技术组件。中间件的存在,就是为了解决高并发、高可用性、高性能等各领域的技术难题。在项目中,合理引用中间件能极大提升我们系统的稳定性、可用性,但同时也会提升系统维护的复杂度,对我们的技术能力提出了更高的要求,我们必须要熟练掌握项目中引用的各种中间件,深入理解其工作原理、实现细节,提高对中间件的驾驭能力,否则一旦运用不当,很可能给系统带来灾难性的故障。原创 2024-01-20 22:07:48 · 2027 阅读 · 3 评论