代码之家  ›  专栏  ›  技术社区  ›  Neil N HLGEM

建议在Web服务器上将HashSet用作静态全局变量吗?

  •  2
  • Neil N HLGEM  · 技术社区  · 16 年前

    我想创建一个“临时缓存查找”来加速我的Web服务器上的文件查找。

    这样做的问题是,大量请求同时会导致File.Exists()挂起。我想在本地文件夹中保留一个已知文件名的快速脏散列集,这样,如果用户请求一个文件,并且该文件存在于散列集中,只需重定向到该文件,而不执行file.exists(),如果该文件在散列集中不存在,则执行file.exists(),然后添加它。

    主要的问题是,由于这个对象将被多个用户调用,并且各种请求都将向集合中添加项,这会导致问题吗?到目前为止,我在Web服务器上使用的静态全局意义上的所有内容都是DB连接字符串或发送警报的电子邮件地址,等等。


    是的,我在考虑比赛条件。但是,在单个哈希集上是否可能存在竞争条件?因为它只允许唯一的值,所以第二次尝试添加值不会失败吗?在这一点上,我将忽略错误并继续。

    2 回复  |  直到 16 年前
        1
  •  4
  •   Eric Lippert    16 年前

    第二,如果他们是骗子,缓存比无用还要糟糕。您的缓存声称是对文件系统的加速,但您建议使用什么机制来保持缓存和文件系统的一致性呢?假设用户访问一个文件,信息被缓存,然后其他操作删除该文件。现在缓存与应该被抽象的东西不同步了;这听起来像是bug的潜在来源。下次有人访问该文件时,缓存会说它存在,即使它不再存在。

    这些当然是可以解决的问题;问题不在于这些问题是否可以解决,而在于解决这些问题的费用是否将由您所弥补的性能的提高来支付。

        2
  •  3
  •   Community Mohan Dere    6 年前

    这是有道理的。但是,请务必注意可能的比赛条件。你可以使用 ReaderWriterLockSlim class

    更新:

    您绝对需要适当地锁定对象,因为 Add

    推荐文章