Jesse' Notes

我干了什么 究竟拿时间换了什么

redis核心技术与实战

redis

redis核心技术与实战 开篇 02 数据结构 哈希桶中的 entry 元素中保存了key和value指针,分别指向了实际的键和值,这样一来,即使值是一个集合,也可以通过*value指针被查找到。 当你往 Redis 中写入大量数据后,就可能发现操作有时候会突然变慢了。这其实是因为你忽略了一个潜在的风险点,那就是哈希表的冲突问题和 rehash 可能带来的操作阻塞。 ...

RocketMQ与kafka对比

MQ

RocketMQ与kafka对比 数据可靠性 RocketMQ支持异步实时刷盘,同步刷盘,同步复制,异步复制 卡夫卡使用异步刷盘方式,异步复制/同步复制 总结:RocketMQ的同步刷盘在单机可靠性上比Kafka更高,不会因为操作系统Crash,导致数据丢失。Kafka同步Replication理论上性能低于RocketMQ的同步Replication,原因是...

MQ实践

MQ

参考极客时间《消息队列高手课》 比较水 | 该如何选择消息队列? 1. RabbitMQ 生产者(Producer)和队列(Queue)之间增加了一个 Exchange 模块,你可以理解为交换机。 第一个问题是,RabbitMQ 对消息堆积的支持并不好 第二个问题是,RabbitMQ 的性能是我们介绍的这几个消息队列中最差的 最后一个问题是 RabbitMQ 使用的编程语言 Er...

Java设计模式

设计模式

每个设计模式都应该由两部分组成:第一部分是应用场景,即这个模式可以解决哪类问题;第二部分是解决方案,即这个模式的设计思路和具体的代码实现。不过,代码实现并不是模式必须包含的。如果你单纯地只关注解决方案这一部分,甚至只关注代码实现,就会产生大部分模式看起来都很相似的错觉。 实际上,设计模式之间的主要区别还是在于设计意图,也就是应用场景。单纯地看设计思路或者代码实现,有些模式确实很相似,比如策...

Java并发-BlockingQueue

BlockingQueue

BlockingQueue BlockingQueue 是一个先进先出的队列(Queue),为什么说是阻塞(Blocking)的呢?是因为 BlockingQueue 支持当获取队列元素但是队列为空时,会阻塞等待队列中有元素再返回;也支持添加元素时,如果队列已满,那么等到队列可以放入新元素时再放入。 BlockingQueue 是一个接口,继承自 Queue,所以其实现类也可以作为 Que...

Java并发-AQS实现CountDownLatch

CountDownLatch

CountDownLatch Example: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class Driver2 { // ... void main() throws InterruptedException { Cou...

Java并发-AQS实现condition

AQS

Condition 生产者消费者 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 class BoundedBuffer { final Lock lock = new ReentrantLock(); ...

Java并发-AQS结构

AQS结构

AQS结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 头结点,你直接把它当做 当前持有锁的线程 可能是最好理解的 private transient volatile Node head; // 阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表 private transient volatile Node tail; // 这个是最重要的,...

SpringBean生命周期

读Spring源码

看下ClassPathXmlApplicationContext的构造方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext { private Resource[] con...

SpringAOP源码浅析

读Spring源码

[TOC] 前言 ​ IOC初始化的时候会把一个个的Bean解析成BeanDefinition,并把它放到容器中的ConcurrentHashMap里面。然后当我们需要某个bean的时候,可以通过getBean的方法获取实例(大部分是依赖注入不需要手动调用)。getBean方法里面使用了BeanPostProcessor这个接口 1 2 3 4 5 6 7 8 9 public int...