Redis come Session Store - Best practices
Questo post vuole fornire indicazioni e pratiche consigliate per l’impiego di Redis come Session Store all’interno del framework Spring.
Obiettivo aggiuntivo è sottolineare i vantaggi dell’uso delle sessioni per l’analisi dati.
È richiesta una conoscenza di base di Spring e dei principi relativi alle sessioni e al Session Store in contesti Web.
L’enfasi è posta su Redis, con una panoramica delle sue capacità e delle strategie consigliate per il suo utilizzo. Pur non focalizzandosi esclusivamente su Spring, il framework può essere occasionalmente citato. L’obiettivo è potenziare la comprensione e le competenze nell’utilizzo efficace di Redis in diversi contesti di sviluppo applicativo.
Per approfondire il tema di Spring con Docker, consiglio la playlist del canale di Emmecilab.
Lo Stack Tecnologico
Lo stack tecnologico utilizzato in questo articolo comprende una gamma di strumenti e framework specificamente selezionati per la loro robustezza e compatibilità.
I componenti includono:
- JDK 17, non credo abbia bisogno di particolari presentazioni.
- Spring Boot 3.2.3, che facilita lo sviluppo rapido di applicazioni.
- Spring Security 6.2.2, che offre funzionalità di sicurezza complete per proteggere l’accesso alle applicazioni e i dati.
- Spring Data Redis 3.2.3, che fornisce un’integrazione fluida con Redis per una gestione dei dati efficiente e soluzioni di caching.
- Redis Stack 7.2, che offre capacità avanzate per la gestione delle strutture dati (come JSON), il caching, lo streaming e il message brokering con alte prestazioni.
Redis Stack
Ci sono due progetti principali a cui prestare attenzione: redis/redis-stack contiene sia il server chiamato Redis Stack che RedisInsight. Questo contenitore è ideale per lo sviluppo locale perché hai a disposizione RedisInsight incorporato per visualizzare i tuoi dati.
Invece, redis/redis-stack-server fornisce solo il server Redis Stack, un unico pacchetto che include Redis con i principali moduli ideale per la distribuzione in produzione.
Il Codice
È probabile che il codice utilizzato in questa prima demo sia reperibile pressoché ovunque su internet.
L’unico aspetto degno di nota è il file application.yml
, in cui Redis è configurato come Session Store.
spring:
data:
redis:
port: 6379
host: localhost
session:
store-type: redis
security:
user:
password: password
name: user
roles: ["admin"]
Il resto del codice è abbastanza standard per la configurazione di MVC e Security in Spring.
Una parte interessante riguarda la configurazione della sicurezza, dove si definiscono quali risorse richiedono autenticazione e quali no, come mostrato di seguito:
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests((authorize) -> authorize
.dispatcherTypeMatchers(DispatcherType.ERROR).permitAll()
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.anyRequest().authenticated()
)
.formLogin((formLogin) -> formLogin
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout
.permitAll()
)
.build();
}
Il codice è progettato per essere autoesplicativo, complice la sua chiara indentazione:
- Tutte le richieste richiedono autenticazione, ad eccezione di quelle che richiedono risorse statiche e la gestione degli errori.
- L’accesso alla risorsa di login è consentito.
- È consentito anche l’accesso alla risorsa di logout.
Primo ciak
La prima cosa da fare è dotarsi di Redis Stack per storicizzare e gestire le sessioni. A tal proposito, verrà impiegato Docker come strumento principale.
docker run -d --name=redis-spring-session -p 6379:6379 redis/redis-stack-server:7.2.0-v8
Successivamente, l’applicazione Spring Boot può essere avviata sia dall’IDE che dalla linea di comando, a seconda delle preferenze. L’applicazione sarà disponibile al seguente link:
La pagina di login verrà visualizzata come segue:
Inserire user
come nome utente e password
come password, quindi fare clic sul pulsante Log in
.
La pagina successiva mostrerà un elenco degli attributi di sessione:
Fino a questo punto, tutto dovrebbe funzionare correttamente. Ora, esaminiamo i dati memorizzati in Redis utilizzando RedisInsight, bellissima applicazione grafica per Redis.
RedisInsight può essere scaricato gratuitamente dal sito seguente sito web:
Dopo l’installazione, avviare RedisInsight e collegarlo all’istanza Redis utilizzando localhost e la porta 6379.
I dati in Redis dovrebbero assomigliare alla seguente schermata:
Una chiave sarà associata all’ID di sessione di Spring, comprendendo la sessione con tutti i suoi attributi. Inizialmente, i dettagli potrebbero non essere del tutto chiari. E’ possibile dedurre e intuire la classe di un attributo specifico e alcune delle sue proprietà. Questa mancanza di chiarezza, o per meglio dire di leggibiltià, è dovuta al fatto che gli attributi sono stati memorizzati utilizzando un formato di serializzazione binaria, rendendoli non pienamente leggibili.
Quindi, per identificare l’utente associato a una sessione, è necessaria un’ispezione più dettagliata dei suoi valori. Questo compito rimane gestibile con una singola sessione. Tuttavia, con centinaia o migliaia di sessioni, individuare la sessione di un utente specifico diventa complicato. Per poter analizzare in modo efficace i dati di una sessione, è opportuno che questi siano in un formato più leggibile e accessibile.
Nel prossimo post ci si concentrerà sull’implementazione di miglioramenti finalizzati proprio all’analisi dei dati.
Per approfondire l’argomento, Luigi Fùgaro ha pubblicato insieme a Mirko Ortensi un manuale su Redis, chiamato “Redis Stack for Application Modernization: Build real-time multi-model applications at any scale with Redis”: scoprilo qui!