c - 使用 berkeley db 实现缓存

标签 c berkeley-db

我正在编写一个在 berkeley db 数据库中缓存 tcp block 的 tcp 代理(见下图)。

当一个流通过源代理时,它在继续到目标代理之前被切成 block 。

block 存储在 Berkeley Db 数据库中。

下一次流通过代理时,如果数据库中已经有 block ,则代理仅将其引用发送到将重放流的该部分的目标代理。

数据库中的每条记录都是如下形式:Key(Adler32+MD5)Data

没有时间戳。

我主要担心的是数据库在不断增长。我需要偶尔清除旧记录。

我不清楚该怎么做。

我想在每条记录中引入一个时间戳,并在每次访问记录时更新它,然后运行一个单独的进程来遍历数据库以删除“旧”记录。

我认为这不是一种优雅的方式。

有人有其他/更好的主意吗?

谢谢

来源---| tcp 代理 |------------| tcp 代理 |--- 目的地

最佳答案

解决方案是对每个数据同时使用键和散列。哈希用于检索数据库中的位置,以及用于识别该位置数据的 key 。因此,您可以通过控制哈希函数来控制缓存使用的位置数。然后使用该 key 来检测“碰撞”。有很多关于哈希函数的著作。最简单的是简单的线性模函数,例如 h = a*data+b modulo p,其中 a 和 b 是相对素数。这确保您不会产生太多的碰撞。 我不确定(我不记得了,因为我已经很多年没有使用 BDB 了),但我认为 BDB 会根据需要提供散列。

关于c - 使用 berkeley db 实现缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144309/

相关文章:

c++ - C++ 中的反跳用户输入

c - 如何在 Visual Studio 2013 中修复 "differs in level of indirection"

python - 将 C 对象添加到 Python List 并将 C 对象列表返回给 python

c - 在 C 中的线程之间共享数据

c - 在 OSX 上使用 TEMP_FAILURE_RETRY

java - Berkley 使用散列配置将数据更新为新值

.net - 分层数据和 BerkeleyDB

c - 伯克利数据库 - 重复条目段错误

berkeley-db - 什么是 Berkeley DB 魔数(Magic Number)?

c# - sqlite , berkeley db 基准测试