Pogocache:比Redis等更快的开源缓存软件


Pogocache是一款从头开始构建的快速缓存软件,专注于低延迟和cpu效率。

更快:Pogocache比Memcache、Valkey、Redis、Dragonfly和Garnet更快。它具有最低的每个请求延迟,提供最快的响应时间。它经过优化,可从单核扩展到多核,为您提供最佳的单线程和多线程性能。

更便宜:Pogocache每次请求使用最少的CPU周期;最小化服务器负载,能源使用和整体运营成本。

Pogocache作为一个基于服务器的程序运行。它支持Memcache、Valkey/Redis、HTTP和Postgres wire协议,允许使用curl和psql等系统工具,以及许多可用于大多数编程语言的客户端库。

可嵌入:可选地,不是将Pogocache作为基于服务器的程序运行,而是可以将自包含的pogocache. c文件编译到现有软件中,绕过网络并直接以编程方式访问该高速缓存。运行嵌入式提供原始速度,每秒超过1亿次操作。

Pogocache与在AWS c8g.8xlarge上运行8个线程的其他缓存软件的性能。访问https://github.com/tidwall/cache-benchmarks查看更多基准测试。

设计细节

概述

Pogocache是一款快速缓存软件。它的目标是提供低延迟和CPU效率。它是用C编程语言编写的,可以在MacOS和Linux上运行。
散列表和分片
Pogocache将条目(键值对)存储在分片散列表中。这个分片散列表有很高的扇出,通常是4096个分片。分片的数量在启动时自动配置,用户可以更改。

每个碎片都有自己独立的散列表。该散列表使用开放寻址罗宾汉散列。这个设计的概念起源于tidwall/shardmap项目。

哈希映射桶是10字节的。一个字节用于dib(到桶的距离),三个字节用于哈希,六个字节用于条目指针。
每个条目都是堆上的一个分配。这个分配包含一个字节的报头和一系列字段。这些字段始终包含一个键和一个值。还可以有各种可选字段,例如到期、cas和标志。密钥是使用定制的sixpack压缩存储的,这只是一个小的优化,用于存储每个字节使用6位而不是8位的密钥。

当插入或检索一个条目时,条目的键被散列成一个64位的数字。从这个64位散列中,高32位用于确定分片,低32位用于每个分片的散列图。使用的哈希函数是tidwall/th 64。每个散列调用使用在Pogocache程序开始时加密随机生成的种子。

当在分片上操作时,该分片在操作期间使用轻量级自旋锁锁定。

网络和线程
在启动时,Pogocache确定程序生命周期中使用的线程数。此数字基于计算机上的核心计数。此时网络被初始化。
对于每个线程,实例化一个事件队列(epoll或kqueue)。所有套接字连接都通过循环选择绑定到其中一个队列。
每个队列等待套接字读取事件。这个模型的概念起源于tidwall/evio项目。

对于Linux,如果可用的话,io_uring可以用于读写操作。这是一个次要的优化,用户可以关闭。

失效
所有条目都可以有一个可选的到期值。到期后,该条目将不再可用,并将从碎片中驱逐。

另一种可能被逐出的方式是当程序内存不足时。当内存不足时,插入操作将使用2-random算法自动选择驱逐一些较旧的条目。

低内存回收会立即释放内存,为新条目腾出空间。另一方面,在访问条目的容器桶之前,或者在调用扫描操作之前,回收不会释放内存。