# Redis Riferimento Rapido

*Stringhe, liste, set, hash, pub/sub, persistenza*

> Source: Redis Documentation (redis.io/docs) · MIT

## Connessione

### CLI

```
redis-cli
redis-cli -h 127.0.0.1 -p 6379
redis-cli -a password -n 2
redis-cli --tls -u rediss://user:pass@host:6380
```

### Connessione con Driver (Python)

```
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.set('key', 'value')
print(r.get('key'))
```

### Informazioni Server

```
PING           -- restituisce PONG
INFO server    -- dettagli server
INFO memory    -- utilizzo memoria
DBSIZE         -- numero di chiavi nel db corrente
```

## Stringhe

### Operazioni di Base

```
SET name "Alice"
GET name
SET counter 100
MSET a 1 b 2 c 3
MGET a b c
```

### Operazioni Numeriche

```
INCR counter        -- 101
INCRBY counter 10   -- 111
DECR counter        -- 110
DECRBY counter 5    -- 105
INCRBYFLOAT price 2.5
```

### Comandi sulle Stringhe

| Command | Description |
|---------|-------------|
| `SET key val` | Imposta valore stringa |
| `GET key` | Ottieni valore stringa |
| `SETNX key val` | Imposta solo se la chiave non esiste |
| `SETEX key sec val` | Imposta con scadenza in secondi |
| `APPEND key val` | Aggiunge al valore esistente |
| `STRLEN key` | Lunghezza del valore stringa |

## Liste

### Operazioni sulle Liste

```
LPUSH queue "first"
RPUSH queue "last"
LRANGE queue 0 -1    -- tutti gli elementi
LPOP queue
RPOP queue
```

### Comandi sulle Liste

| Command | Description |
|---------|-------------|
| `LPUSH / RPUSH` | Inserisce a sinistra / destra della lista |
| `LPOP / RPOP` | Estrae da sinistra / destra |
| `LRANGE key start stop` | Ottieni intervallo di elementi |
| `LLEN key` | Lunghezza della lista |
| `LINDEX key idx` | Elemento all'indice |
| `LREM key count val` | Rimuovi count occorrenze di val |
| `BLPOP key timeout` | Pop bloccante (per code) |

## Set e Set Ordinati

### Operazioni sui Set

```
SADD tags "python" "redis" "docker"
SMEMBERS tags
SISMEMBER tags "python"   -- 1 (vero)
SREM tags "docker"
SCARD tags                -- conteggio
```

### Operazioni sui Set

```
SUNION set1 set2       -- unione
SINTER set1 set2       -- intersezione
SDIFF set1 set2        -- differenza
```

### Operazioni sui Set Ordinati

```
ZADD leaderboard 100 "Alice" 85 "Bob"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANGE leaderboard 0 2
ZSCORE leaderboard "Alice"
ZRANK leaderboard "Alice"    -- rank in base 0
```

### Comandi sui Set Ordinati

| Command | Description |
|---------|-------------|
| `ZADD key score member` | Aggiunge membro con punteggio |
| `ZRANGE key start stop` | Intervallo per rank (dal basso) |
| `ZREVRANGE key start stop` | Intervallo per rank (dall'alto) |
| `ZINCRBY key incr member` | Incrementa punteggio membro |
| `ZRANGEBYSCORE key min max` | Intervallo per valore del punteggio |
| `ZCARD key` | Numero di membri |

## Hash

### Operazioni sugli Hash

```
HSET user:1 name "Alice" age 30
HGET user:1 name
HGETALL user:1
HMSET user:2 name "Bob" age 25
HMGET user:1 name age
```

### Comandi sugli Hash

| Command | Description |
|---------|-------------|
| `HSET key field val` | Imposta campo hash |
| `HGET key field` | Ottieni campo hash |
| `HGETALL key` | Ottieni tutti i campi e valori |
| `HDEL key field` | Elimina campo hash |
| `HEXISTS key field` | Verifica esistenza campo |
| `HINCRBY key field n` | Incrementa valore campo |
| `HKEYS key` | Tutti i nomi dei campi |
| `HLEN key` | Numero di campi |

## Chiavi e Scadenza

### Comandi sulle Chiavi

| Command | Description |
|---------|-------------|
| `KEYS pattern` | Trova chiavi corrispondenti al pattern (lento) |
| `SCAN cursor MATCH pat` | Itera le chiavi in modo incrementale (sicuro) |
| `EXISTS key` | Verifica se la chiave esiste |
| `DEL key` | Elimina chiave |
| `TYPE key` | Tipo di dato della chiave |
| `RENAME key newkey` | Rinomina una chiave |

### Comandi di Scadenza

```
EXPIRE key 3600       -- scade in 1 ora
PEXPIRE key 5000      -- scade in 5000 ms
TTL key               -- secondi alla scadenza
PTTL key              -- ms alla scadenza
PERSIST key           -- rimuovi scadenza
```

### Pattern di Chiave

```
SET session:abc123 "data" EX 1800
-- EX = secondi, PX = millisecondi
-- NX = solo se non esiste
-- XX = solo se esiste
SET lock:order42 "owner" NX EX 10
```

## Pub/Sub

### Pub/Sub di Base

```
-- Subscriber (terminale 1)
SUBSCRIBE news alerts

-- Publisher (terminale 2)
PUBLISH news "Breaking: Redis 8 released"
```

### Sottoscrizione per Pattern

```
PSUBSCRIBE news.*
-- corrisponde a news.tech, news.sports, ecc.
```

### Comandi Pub/Sub

| Command | Description |
|---------|-------------|
| `SUBSCRIBE channel` | Ascolta messaggi sul canale |
| `PUBLISH channel msg` | Invia messaggio al canale |
| `PSUBSCRIBE pattern` | Sottoscrive a un pattern |
| `UNSUBSCRIBE channel` | Smetti di ascoltare |
| `PUBSUB CHANNELS` | Elenca i canali attivi |

## Transazioni

### MULTI / EXEC

```
MULTI
SET balance:1 900
SET balance:2 1100
EXEC        -- esegue atomicamente
```

### Lock Ottimistico

```
WATCH balance:1
val = GET balance:1   -- legge valore corrente
MULTI
SET balance:1 (val - 100)
EXEC
-- EXEC restituisce nil se balance:1 è cambiato
```

### Comandi di Transazione

| Command | Description |
|---------|-------------|
| `MULTI` | Inizia il blocco transazione |
| `EXEC` | Esegue i comandi in coda |
| `DISCARD` | Scarta i comandi in coda |
| `WATCH key` | Monitora la chiave per cambiamenti (lock ottimistico) |
| `UNWATCH` | Dimentica tutte le chiavi monitorate |

## Persistenza

### Snapshot RDB

```
SAVE             -- snapshot sincrono
BGSAVE           -- snapshot in background
LASTSAVE         -- timestamp dell'ultimo salvataggio
```

### AOF (Append Only File)

| Command | Description |
|---------|-------------|
| `appendonly yes` | Abilita AOF in redis.conf |
| `appendfsync always` | Fsync ad ogni scrittura (più sicuro, più lento) |
| `appendfsync everysec` | Fsync ogni secondo (raccomandato) |
| `appendfsync no` | Lascia decidere all'OS (più veloce, più rischioso) |

### Comandi di Persistenza

```
CONFIG GET save
CONFIG SET save "900 1 300 10"
-- snapshot se 1 modifica in 900s o 10 in 300s
BGREWRITEAOF    -- riscrive AOF in background
```

## Pattern Comuni

### Lock Distribuito

```
SET lock:resource "owner-id" NX EX 30
-- NX = acquisisci solo se non in possesso
-- EX 30 = rilascio automatico dopo 30s
DEL lock:resource  -- rilascio esplicito
```

### Rate Limiter

```
key = "rate:user:42"
INCR key
EXPIRE key 60   -- finestra di 60 secondi
-- rifiuta se GET key > max_requests
```

### Pattern di Cache

```
val = GET "cache:user:1"
if val is nil:
  val = fetch_from_db(1)
  SET "cache:user:1" val EX 300
```

### Storage di Sessione

```
HSET sess:abc uid 42 role "admin"
EXPIRE sess:abc 1800   -- TTL 30 min
HGETALL sess:abc
```
