Table of Contents

Class CacheInvalidator

Namespace
UsluzionicaServer.Infrastructure.Redis
Assembly
UsluzionicaServer.dll

Obaveštava SVE instance da je neki keš zastareo — preko Redis pub/sub-a.

PROBLEM KOJI REŠAVA: Neki keševi su u Redis-u i tamo ih je dovoljno obrisati jednom, jer ih sve instance dele. Ali CategorySearchIndex drži foldovana imena kategorija U MEMORIJI SVAKOG PROCESA (namerno — pogađa se na svakom tokenu svake pretrage, pa mrežni poziv po tokenu ne dolazi u obzir).

Kad admin preimenuje kategoriju, instanca koja je obradila taj zahtev očisti SVOJU kopiju. Druga instanca ne zna ništa i nastavlja da pretražuje po starom imenu — do isteka TTL-a od 10 minuta.

Pub/sub to rešava odmah: instanca koja je izmenila objavi poruku na kanal, sve instance (uključujući nju samu) je prime i očiste svoju kopiju.

FALLBACK: ako Redis nije dostupan, poruka se ne pošalje i svaka instanca se oslanja na svoj TTL. Zastarelost je tada ograničena na 10 minuta umesto na milisekunde — sporije, ali nikad trajno pogrešno.

public sealed class CacheInvalidator
Inheritance
CacheInvalidator
Inherited Members

Constructors

CacheInvalidator(RedisConnection, ILogger<CacheInvalidator>)

Obaveštava SVE instance da je neki keš zastareo — preko Redis pub/sub-a.

PROBLEM KOJI REŠAVA: Neki keševi su u Redis-u i tamo ih je dovoljno obrisati jednom, jer ih sve instance dele. Ali CategorySearchIndex drži foldovana imena kategorija U MEMORIJI SVAKOG PROCESA (namerno — pogađa se na svakom tokenu svake pretrage, pa mrežni poziv po tokenu ne dolazi u obzir).

Kad admin preimenuje kategoriju, instanca koja je obradila taj zahtev očisti SVOJU kopiju. Druga instanca ne zna ništa i nastavlja da pretražuje po starom imenu — do isteka TTL-a od 10 minuta.

Pub/sub to rešava odmah: instanca koja je izmenila objavi poruku na kanal, sve instance (uključujući nju samu) je prime i očiste svoju kopiju.

FALLBACK: ako Redis nije dostupan, poruka se ne pošalje i svaka instanca se oslanja na svoj TTL. Zastarelost je tada ograničena na 10 minuta umesto na milisekunde — sporije, ali nikad trajno pogrešno.

Methods

PublishAsync(string)

Objavljuje da je tema zastarela. Poruku primaju SVE instance, uključujući onu koja je objavila — zato rukovaoci moraju biti idempotentni.

Subscribe(string, Action)

Registruje rukovaoca koji se poziva kad bilo koja instanca objavi temu.

StackExchange.Redis sam obnavlja pretplate posle prekida veze, pa ovo treba pozvati jednom pri startu. Ako Redis tada nije dostupan, pretplate nema i ostaje TTL kao jedina zaštita.