我正在编写一个tcp代理,它将ccp块缓存在一个berkeley db数据库中(参见下图)。
当流经过源代理时,它会在继续到目标代理之前被分成块。
Chunks存储在Berkeley Db数据库中。
下一次流经过代理时,如果数据库中已存在一个块,则代理只会将其引用发送到将重放该部分流的目标代理。
数据库中的每条记录都是以下形式:密钥(Adler32 + MD5)数据
没有时间戳。
我主要担心的是数据库在不断增长。我需要偶尔清除旧记录。
我不知道该怎么做。
我想在每条记录中引入一个时间戳,并在每次访问记录时更新它,然后运行一个单独的进程,该进程将遍历数据库以删除“旧”记录。
我认为这不是一种优雅的方式。
有人有其他/更好的主意吗?
感谢
来源--- | tcp proxy | ---------- | tcp proxy | --- destination
答案 0 :(得分:0)
解决方案是为每个数据使用密钥和散列。哈希用于检索数据库中的位置,以及用于标识该位置数据的密钥。因此,您可以通过控制哈希函数来控制缓存使用的位置数。然后使用密钥检测“碰撞”。有很多关于哈希函数的着作。最简单的只是线性模函数,如h = a * data + b modulo p其中a和b是相对素数。这可以确保您不会产生太多碰撞。 我不确定(我记不起因为我多年没有使用BDB)但我认为BDB会根据需要提供散列。