Теория: если веб-искатель сканирует весь мой сайт, мой механизм кэширования по умолчанию (например, Redis) будет загружен и может возрасти неверные данные. (в зависимости от политики кэша).Как я могу предотвратить сканирование веб-сканеров на мой кеш (Redis, CDN и т. Д.)
Предполагая, что веб-робот не нужен прирост производительности, я предлагаю, чтобы конечные пользователь, я мог бы изменить мое приложение «защитить кэш»
Вопрос
- Является ли это хорошая идея?
- Выполняют ли веб-сканеры разницу во времени между поставляемым контентом?
- Помимо пользовательского агента, должен ли я «пометить» сеанс, ссылающийся на файл 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;
}