使用 berkeley db 实现缓存
Posted
技术标签:
【中文标题】使用 berkeley db 实现缓存【英文标题】:implementing a cache with berkeley db 【发布时间】:2013-06-17 09:27:36 【问题描述】:我正在编写一个 tcp 代理,它将 tcp 块缓存在 berkeley db 数据库中(见下图)。
当流通过源代理时,它会在继续到达目标代理之前被分割成块。
块存储在 Berkeley Db 数据库中。
下一次流通过代理时,如果一个块已经在数据库中,则代理只将其引用发送到将重放该部分流的目标代理。
数据库中每条记录的格式如下:Key(Adler32+MD5)数据
没有时间戳。
我主要担心的是数据库一直在增长。我需要不时清除旧记录。
我不知道该怎么做。
我想在每条记录中引入一个时间戳,并在每次访问记录时对其进行更新,然后运行一个单独的进程,该进程将遍历数据库以删除“旧”记录。
我认为这不是一种优雅的方式。
有人有其他/更好的主意吗?
谢谢
来源---| tcp代理|----------| tcp 代理 |--- 目的地
【问题讨论】:
你考虑过redis吗? 【参考方案1】:解决方案是对每个数据同时使用一个键和一个散列。哈希用于检索数据库中的位置,以及用于识别该位置数据的密钥。因此,您可以通过控制散列函数来控制缓存使用的位置数量。然后使用该密钥来检测“碰撞”。有很多关于哈希函数的著作。最简单的是简单的线性模函数,例如 h = a*data+b 模 p 其中 a 和 b 是相对素数。这可以确保您不会产生太多的碰撞。 我不确定(我不记得了,因为我已经很多年没有使用 BDB 了),但我认为 BDB 会根据需要提供散列。
【讨论】:
感谢您对 J.B 的帮助,但我关心的是维护磁盘上的缓存。在内存中,我实现了一个缓存索引的 LRU 缓存。当一个块从内存中删除时,它会保存在磁盘上。从长远来看,它将填满磁盘。我想要实现的是在达到阈值时删除存储在磁盘上的“旧”块。 “旧块”是自特定时间以来不在内存中的块。您的解决方案看起来像 LRU 缓存......我说的对吗? 这并不是真正的 LRU,因为 LRU 是基于时间的。我的建议与数据位置无关。我的解释可能不是很清楚。我建议在数据库中使用哈希条目来识别存储数据的插槽。由于有有限数量的哈希,您将只有有限数量的插槽,对吗?但是,当然,哈希可能有冲突,所以你必须用你的真实密钥准确地识别你的数据。两个不同的块可能具有相同的散列但不同的唯一签名。我不是在谈论内部散列技术,我建议使用散列值作为数据的键。 感谢 J.B,感谢您的帮助。我已经编辑了我的评论......上面......但S.O没有更新它。我是 S.O 的初学者(只有 2 个帖子)。请在下一条评论中阅读我的更新消息 感谢您对 J.B 的帮助,但我关心的是维护磁盘上的缓存。在内存中,我实现了一个缓存索引的 LRU 缓存。数据块始终在磁盘上。当索引从内存中删除时,它与 DATA 一起保存在磁盘上。从长远来看,它将填满磁盘。我想要实现的是在达到阈值时删除存储在磁盘上的“旧”块。 “旧块”是其索引在特定时间后不在内存中的块。这就是我想添加时间戳的原因……但我不知道该怎么做。 好吧,我不确定你到底在做什么。您的意思是您对内存数据有自己的 LRU 管理吗?为什么不使用本机 BDB 内存缓存管理。 DBD 能够将它的一些数据缓存到内存中,并且默认使用 LRU。无论如何,为什么不在数据中添加一些时间信息,然后在达到阈值时对旧的“条目”启动一个简单的清理过程?以上是关于使用 berkeley db 实现缓存的主要内容,如果未能解决你的问题,请参考以下文章
如何在不安装的情况下在应用程序中使用 Berkeley DB
我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?