2009-10-19 47 views
1

我有一个网络服务器,可以动态创建多种格式的各种报告(pdf和doc文件)。这些文件需要生成相当数量的CPU,并且在两个人使用相同输入创建相同报表的情况下相当常见。动态创建文件的缓存系统?

输入:

  • 原始数据输入作为字符串(方程,数字和 单词表),任意长度,几乎99%的小于约200字
  • 的版本报告创建工具

当用户尝试生成报告时,我想检查一个文件是否已经存在与给定的输入,如果是的话返回一个链接到文件。如果文件不存在,那么我想根据需要生成它。

  1. 已经有哪些解决方案?我已经缓存了简单的http请求,但密钥非常简单(通常是数据库ID)

  2. 如果我必须自己做这个,那么最好的方法是什么。输入可以是几百个字,我想知道如何将字符串转换为发送到缓存的密钥。

    //整个输入,使用了太多的内存,一对一的映射 缓存[“一二三四五六七八九十一零一一年......”] //短键 缓存[“二合一” ] => 5分的结果,那么我必须缩小这些下跌更

  3. 这是什么,应该在数据库中进行,还是更愿意(在我的情况Python)的Web应用程序代码内完成

谢谢大家。

+0

是否使用的是Web框架反向代理?一些框架具有内置的缓存功能。 – nosklo 2009-10-19 10:46:48

回答

2

这是Apache的用途。

创建一个将有报告的目录。

将Apache配置为从该目录提供文件。

如果报告存在,重定向到Apache将提供的URL。

否则,该报告不存在,因此创建它。然后重定向到Apache将提供的URL。


没有“散列”。你有一个键(“一个字符串(方程,数字和单词列表),任意长度,几乎99%将少于约200个单词”)和一个值,这是一个文件。不要浪费时间在散列上。你只需要一个长钥匙。

你可以通过使它变成“slug”来压缩这个键:删除标点符号,用_替换空格,这样的事情。

您应该创建一个内部的代理键,它是一个简单的整数。

你只是将一个长键翻译成一个“报告”,该报告既可以作为文件存在,也可以作为文件创建。

+0

虽然你会如何建议将输入字符串映射到文件?散列会对小字符串产生太多冲突,不是吗? – 2009-10-19 10:56:11

+0

@Bill,考虑使用SHA256或任何其他的散列,计算损失/ $$的成本乘以碰撞的可能性。如果结果数字不够小,请使用更大的散列。冲洗重复。有时你根本无法忍受哈希碰撞 - 例如医疗数据或其他类似的东西。在这种情况下,永远不要依靠一个 – 2009-10-19 11:00:52