2010-08-13 150 views
1

我有一张存储歌曲和播放计数器的表格。
下面的代码:ASP.NET缓存,什么是最佳做法

//Increse plays counter 
string ip = Request.UserHostAddress; 
if (!string.IsNullOrEmpty(ip)) 
{ 
    if (Cache["plays:" + trackID + ":" + ip] == null) 
    { 
     tracks.IncreasePlaysCounter(trackID); 
     Cache["plays:" + trackID + ":" + ip] = true; 
    } 
} 

我不知道会是怎样一个更好的做法,许多商店缓存项(像这样)或存储一个项目一样,将包含谁已经听过这首歌的用户的ArrayList。有什么区别吗?

+0

在会话或跨会话期间?你的访客也是匿名或注册的吗? – Jeroen 2010-08-13 16:34:51

+0

我想我们需要更多的上下文才能更好地回答你的问题。你想达到什么目的? – ddc0660 2010-08-16 14:05:14

+0

@ ddc0660我有一个包含歌曲的数据库表,每首歌都有一个播放计数器。我只是想限制这个计数器,所以每次重新加载都不会增加这个计数器。我认为另一张桌子会很快变大,也许我需要一些“临时桌子”? – Adir 2010-08-16 20:04:20

回答

2

都没有。如果你的系统在某种程度上成功了,它将会有太多的单个条目被写入,以便能够扩展以应付,特别是当你添加锁定代码来处理同时写入和读取的次数时,这将必须应对用。

将此信息存储在数据库中。或者根本不存储它,但是通过解析网络服务器日志来获取它(如果trackID是一个查询参数,这些信息将已经存在于那些没有任何工作的日志中)。

+0

我同意Jon Hanna的观点,您将很快耗尽内存,并且由于内存限制,如果有大量用户可能会将这些缓存条目从缓存中踢出对方。数据库似乎是更好的解决方案。我还要补充一点,就像旁注一样,不要使用主机IP地址,而是使用会话ID。否则,您可能会遇到与我和我的妻子同时收听的问题,因为我们都认为您的IP地址相同(位于NAT防火墙后面)。 – CodingGorilla 2010-08-13 20:27:06

+0

虽然潜在的合理建议,它并没有回答这个问题。也许@Adir正在为小发行版编写一个简单的应用程序。 – ddc0660 2010-08-13 20:54:22

+0

@ ddc0660实际上我仍然不知道我的web应用程序有多大,我需要使用可扩展的解决方案。 将其存储在数据库中会很快填满数据库,也许我需要每X天清空一次该表格。这是一个好的解决方案吗? – Adir 2010-08-14 00:21:54

0

我打算从纯粹的缓存角度来处理这个问题,而不是剧本和曲目的上下文。

决定缓存数据时,重要的是要考虑依赖关系以及缓存过期的方式。

如果每个用户的缓存都可以单独过期而不是过期如何,那很好。如果事实证明一个记录过期应该使整组记录无效,那么将其放入一个ArrayList并转储整个对象。

相关问题