【发布时间】:2016-12-12 02:44:31
【问题描述】:
理论:如果网络爬虫爬取我的整个网站,我的默认缓存机制(例如 Redis)将被淹没,并且可能会老化错误的数据。 (取决于缓存策略)。
假设网络爬虫不需要我为最终用户提供的性能提升,我可以编辑我的应用以“保护缓存”
问题
- 这是个好主意吗?
- 网络爬虫是否测量交付内容之间的时间差?
- 除了用户代理,我是否应该“标记”引用 robots.txt 的会话并假设它们是爬虫?
- 我应该如何以管理方式或程序方式处理此交付?
- 举个极端的例子,我可以限制网络爬虫吗?
如果我以编程方式实现这一点,我需要告诉 GetFromCacheAsync 不要根据某些客户端信息更新缓存。
- 添加方法重载以确定是否应更新缓存是否违反任何领域驱动设计理论?
- 我应该把“更新Redis”或“不更新Redis”的逻辑放在哪里……这方面我认为与DDD最相关
HomeController.cs
public async Task<ActionResult> Events()
{
ViewBag.Events = await eventSvc.GetLiveEvents(DateTime.Now);
return View();
}
Services.EventManagementService.cs
public async Task<List<Event>> GetLiveEvents(DateTime currentDate)
{
//return ctx.Events.Where(e => e.StatusId == (int)EventStatus.Live && e.EventDate >= DateTime.Now).ToList();
return await cloudCtx.GetLiveEvents(DateTime.Now);
}
Data.CloudContext.cs
public async Task<List<Event>> GetLiveEvents(DateTime currentDate)
{
string year = currentDate.Year.ToString();
var key = GenerateLiveEventsKey(year);
var yearEvents = await cache.GetFromCacheAsync<List<Event>>(key, async () =>
{
List<Event> events = new List<Event>();
string partitionKey = year;
TableQuery<EventRead> query = new TableQuery<EventRead>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey));
TableQuerySegment<EventRead> currentSegment = null;
var result = tableEvents.ExecuteQuery(query);
while (currentSegment == null || currentSegment.ContinuationToken != null)
{
currentSegment = await tableMyEvents.ExecuteQuerySegmentedAsync(query, currentSegment != null ? currentSegment.ContinuationToken : null);
foreach (EventRead nosqlEvent in currentSegment.Results)
{
var eventObj = nosqlEvent.ToEvent(true);
events.Add(eventObj);
}
}
return events;
});
return yearEvents.Where(e => e.EventDate >= currentDate).ToList();
}
Data.Cache.cs
public async Task<T> GetFromCacheAsync<T>(string key, Func<Task<T>> missedCacheCall, TimeSpan timeToLive)
{
if (!IsCacheAvailable)
{
var ret = await missedCacheCall();
return ret;
}
IDatabase cache = Connection.GetDatabase();
var obj = await cache.GetAsync<T>(key);
if (obj == null)
{
obj = await missedCacheCall();
if (obj != null)
{
cache.Set(key, obj);
}
}
return obj;
}
【问题讨论】:
标签: caching web-crawler robots.txt cache-control