ssingularity的个人日志

怕什么真理无穷,进一步有进一步的欢喜

布隆过滤器

布隆过滤器相较于传统的哈希表而言,它可以使用更少的空间去存储更多的数据,但是它也付出了精度上的代价,它可以检查值是 “可能在集合中” 还是 “绝对不在集合中”。“可能” 表示有一定的概率,也就是说可能存在一定为误判率布隆过滤器本质上是由长度为 m 的位向量或位列表(仅包含 0 或 1 位值的列表)组

LSM树

LSM树中虽然带树字,但是它的核心并不是树,而是一种设计思想:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘LSM树通过牺牲一定的读性能,大大地提高了写性能它的核心在于三点:在每次写内存前将操作Append到对应的日志中,从而持久化在内存中以及磁盘中都使用特定的数据结

Netty技巧

可以在Pipeline.addLast的时候指定Group从而让业务逻辑(对应的Handler)运行在其他线程池中以避免I/O被阻塞,也即在触发对应Handler的read时直接异步submit线程池,而不是同步调用通过继承SimpleChannelInboundHandler并实现对应的chann

NIO与Netty概念

0.基本概念所有的IO都分为两个过程:1. 内核空间等待足够的、可用的数据到达 2. 将数据从内核空间移动到用户空间。对于NIO、多路复用而言,第二个过程都是阻塞的。同步和异步:同步是指两个操作都在同一个线程中顺序执行,异步是指两个操作在不同线程中执行,一般表现形式为将第二个操作基于回调传给另外一个

JDK Concurrent包源码阅读3——Lock

锁的可重入性:在Concurrent包中的锁都是可重入锁,所谓的可重入就是说,当A线程拿到一个锁的时候,该线程去调用另外一个需要该锁的操作的时候不会被阻塞锁的整体继承层次如下图所示,其中ReentrantLock本身其实没有什么代码逻辑,其实现都在其内部类Sync中,lock,tryLock以及un

JDK Concurrent包源码阅读2——Atomic类

Atomic类的核心就是自旋 + CASAtomicInteger的getAndIncrement方法如下:for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next

JDK Concurrent包源码阅读1——多线程基础

阻塞其实一共有两种阻塞:1. 能够被中断(interrupt之后抛出InterruptedException)的阻塞称为轻量级阻塞,对应的线程状态是WAITING或者TIMED_WAITING(超时时间到会自动唤醒);2. 而像Synchronized、IO请求等不能被中断的则称为重量级阻塞,对应的