Caffeine
Caffeine
- 将对数据的读写看到是日志的提交过程,设由专门的环形缓冲区来记录由于数据读取而产生的状态变动日志。为进一步减少竞争,caffeine对每条线程(对线程取hash,哈希值相同的使用同一个缓冲区)都设置一个专用的环形缓冲
- 环形缓冲:它是一种拥有读、写两个指针的数据复用结构,在计算机科学中有非常广泛的应用。举个具体例子,譬如一台计算机通过键盘输入,并通过 CPU 读取“HELLO WIKIPEDIA”这个长 14 字节的单词,通常需要一个至少 14 字节以上的缓冲区才行。但如果是环形缓冲结构,读取和写入就应当一起进行,在读取指针之前的位置均可以重复使用,理想情况下,只要读取指针不落后于写入指针一整圈,这个缓冲区就可以持续工作下去,能容纳无限多个新字符。否则,就必须阻塞写入操作去等待读取清空缓冲区。
- 读写性能
- 从 Caffeine 读取数据时,数据本身会在其内部的 ConcurrentHashMap 中直接返回,而数据的状态信息变更就存入环形缓冲中,由后台线程异步处理。如果异步处理的速度跟不上状态变更的速度,导致缓冲区满了,那此后接收的状态的变更信息就会直接被丢弃掉,直至缓冲区重新富余。通过环形缓冲和容忍有损失的状态变更,Caffeine 大幅降低了由于数据读取而导致的垃圾收集和锁竞争,因此 Caffeine 的读取性能几乎能与 ConcurrentHashMap 的读取性能相同。
- 写数据时,将使用传统的有界队列来存放状态变更信息,写入带来的状态更是无损的,不允许丢失任何状态,这是考虑到许多状态的默认值必须通过写入操作来完成初始化,因此写入会有一定的性能损失,相比 ConcurrentHashMap,Caffeine 在写入时大约会慢 10%左右。
Caffeine
https://x-leonidas.github.io/2025/05/12/11技术栈/Caffeine/