Problemele de conexiune Redis pot paraliza performanta aplicatiei. Acest ghid acopera toate erorile frecvente Redis si solutiile lor.
Error: ECONNREFUSED - Conexiune Refuzata
Simptom:
Error: connect ECONNREFUSED 127.0.0.1:6379
Redis connection to localhost:6379 failed - connect ECONNREFUSED
Solutia 1 - Verifica daca Redis ruleaza:
# Verifica statusul Redis
sudo systemctl status redis
# Porneste Redis
sudo systemctl start redis
# Docker
docker ps | grep redis
docker start redis-container
# Testeaza conexiunea
redis-cli ping
# Ar trebui sa returneze: PONGSolutia 2 - Verifica binding-ul Redis:
# Verifica pe ce asculta Redis
sudo netstat -tlnp | grep 6379
# sau
ss -tlnp | grep 6379
# Editeaza redis.conf
sudo nano /etc/redis/redis.conf
# Schimba bind pentru a permite conexiuni
# bind 127.0.0.1 # doar localhost
bind 0.0.0.0 # toate interfetele (atentie in productie!)
# Reporneste Redis
sudo systemctl restart redisSolutia 3 - Networking Docker:
# docker-compose.yml
services:
app:
environment:
- REDIS_HOST=redis # Foloseste numele serviciului, nu localhost
depends_on:
- redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"Error: NOAUTH Authentication Required
Simptom:
NOAUTH Authentication required
Error: ERR invalid password
ReplyError: WRONGPASS invalid username-password pair
Solutia 1 - Furnizeaza parola:
// Node.js cu ioredis
const Redis = require('ioredis');
const redis = new Redis({
host: 'localhost',
port: 6379,
password: 'your-password'
});
// Format URL de conexiune
const redis = new Redis('redis://:your-password@localhost:6379');
// Cu username (Redis 6+)
const redis = new Redis('redis://username:password@localhost:6379');# Python
import redis
r = redis.Redis(
host='localhost',
port=6379,
password='your-password',
decode_responses=True
)Solutia 2 - Verifica parola in redis.conf:
# Verifica parola curenta
grep "requirepass" /etc/redis/redis.conf
# Seteaza parola
requirepass your-strong-password
# Pentru Redis 6+ ACL
# redis-cli
ACL SETUSER default on >password ~* &* +@allSolutia 3 - Reseteaza parola:
# Conecteaza-te fara autentificare (daca e posibil)
redis-cli
# Seteaza parola noua
CONFIG SET requirepass "new-password"
# Persista modificarea
CONFIG REWRITEError: Max Number of Clients Reached
Simptom:
ERR max number of clients reached
OOM command not allowed when used memory > 'maxmemory'
Solutia 1 - Creste limita maxima de clienti:
# Verifica setarea curenta
redis-cli CONFIG GET maxclients
# Creste limita (necesita redis.conf sau CONFIG SET)
maxclients 10000
# Verifica conexiunile curente
redis-cli INFO clientsSolutia 2 - Gaseste scurgerile de conexiuni:
# Listeaza toti clientii conectati
redis-cli CLIENT LIST
# Gaseste conexiunile inactive de mult timp
redis-cli CLIENT LIST | grep "idle=[0-9][0-9][0-9][0-9]"
# Inchide un client specific
redis-cli CLIENT KILL ID <client-id>
# Seteaza timeout-ul clientului
timeout 300 # 5 minuteSolutia 3 - Foloseste connection pooling:
// ioredis connection pool
const Redis = require('ioredis');
const redis = new Redis({
host: 'localhost',
port: 6379,
maxRetriesPerRequest: 3,
enableOfflineQueue: false,
lazyConnect: true,
// Connection pool (via cluster pentru un singur nod)
family: 4,
keepAlive: 10000
});# Python connection pool
import redis
pool = redis.ConnectionPool(
host='localhost',
port=6379,
max_connections=50,
password='your-password'
)
r = redis.Redis(connection_pool=pool)Error: Connection Timeout
Simptom:
Error: Connection timeout
ETIMEDOUT: connection timed out
Redis connection lost. Reconnecting...
Solutia 1 - Creste timeout-urile:
const Redis = require('ioredis');
const redis = new Redis({
host: 'localhost',
port: 6379,
connectTimeout: 10000, // 10 secunde
commandTimeout: 5000, // 5 secunde per comanda
retryDelayOnFailover: 100,
retryDelayOnClusterDown: 100,
maxRetriesPerRequest: 3
});Solutia 2 - Verifica latenta retelei:
# Testeaza latenta
redis-cli --latency
# Latenta intrinseca (pe server)
redis-cli --intrinsic-latency 10
# Depaneaza slowlog
redis-cli SLOWLOG GET 10Solutia 3 - Configureaza TCP keepalive:
# redis.conf
tcp-keepalive 300
# Pe partea de aplicatie
const redis = new Redis({
keepAlive: 10000, // 10 secunde
noDelay: true
});Error: READONLY - Mod Replica
Simptom:
READONLY You can't write against a read only replica
Error: READONLY
Cauza: Te-ai conectat la o replica in loc de nodul primar.
Solutia 1 - Conecteaza-te la nodul primar:
# Gaseste nodul primar
redis-cli INFO replication
# Cauta:
# role:master (acesta e nodul primar)
# role:slave (aceasta e replica)// Sentinel pentru failover automat
const redis = new Redis({
sentinels: [
{ host: 'sentinel-1', port: 26379 },
{ host: 'sentinel-2', port: 26379 }
],
name: 'mymaster'
});Solutia 2 - Activeaza scrierile pe replica (temporar):
# Nu e recomandat pentru productie
redis-cli CONFIG SET replica-read-only noError: Probleme de Conexiune Cluster
Simptom:
CLUSTERDOWN The cluster is down
MOVED 12345 192.168.1.100:6379
ASK 12345 192.168.1.101:6379
Solutia 1 - Foloseste un client compatibil cu cluster:
// ioredis cluster mode
const Redis = require('ioredis');
const cluster = new Redis.Cluster([
{ host: '192.168.1.100', port: 6379 },
{ host: '192.168.1.101', port: 6379 },
{ host: '192.168.1.102', port: 6379 }
], {
redisOptions: {
password: 'cluster-password'
},
scaleReads: 'slave',
natMap: {
// Daca e in spatele NAT/proxy
'10.0.0.1:6379': { host: 'public-host', port: 6379 }
}
});Solutia 2 - Verifica sanatatea clusterului:
# Informatii cluster
redis-cli CLUSTER INFO
# Noduri cluster
redis-cli CLUSTER NODES
# Repara clusterul
redis-cli --cluster fix 192.168.1.100:6379Error: Out of Memory
Simptom:
OOM command not allowed when used memory > 'maxmemory'
-OOM: Redis is out of memory
Solutia 1 - Configureaza politica de memorie:
# redis.conf
maxmemory 2gb
maxmemory-policy allkeys-lru
# Politici disponibile:
# noeviction - returneaza erori
# allkeys-lru - evacueaza cheile cel mai putin recent folosite
# volatile-lru - evacueaza LRU dintre cheile cu TTL
# allkeys-random - evacueaza chei aleatorii
# volatile-ttl - evacueaza cheile cu cel mai scurt TTLSolutia 2 - Monitorizeaza utilizarea memoriei:
# Statistici memorie
redis-cli INFO memory
# Utilizarea memoriei pe pattern de chei
redis-cli --bigkeys
# Utilizarea memoriei pentru o cheie specifica
redis-cli MEMORY USAGE mykeySolutia 3 - Curatenie:
# Sterge chei dupa pattern
redis-cli --scan --pattern "temp:*" | xargs redis-cli DEL
# Goleste baza de date (atentie!)
redis-cli FLUSHDB # DB-ul curent
redis-cli FLUSHALL # Toate DB-urileStrategie de Reconectare
const Redis = require('ioredis');
const redis = new Redis({
host: 'localhost',
port: 6379,
retryStrategy(times) {
if (times > 10) {
// Opreste incercarile dupa 10 tentative
return null;
}
// Backoff exponential: 50ms, 100ms, 200ms...
const delay = Math.min(times * 50, 2000);
return delay;
},
reconnectOnError(err) {
const targetError = 'READONLY';
if (err.message.includes(targetError)) {
// Reconecteaza cand replica devine nod primar
return true;
}
return false;
}
});
redis.on('error', (error) => {
console.error('Redis error:', error);
});
redis.on('connect', () => {
console.log('Redis connected');
});
redis.on('reconnecting', () => {
console.log('Redis reconnecting...');
});Referinta Rapida: Comenzi de Depanare
| Task | Comanda |
|------|---------|
| Testeaza conexiunea | redis-cli PING |
| Verifica informatii | redis-cli INFO |
| Statistici memorie | redis-cli INFO memory |
| Lista clienti | redis-cli CLIENT LIST |
| Query-uri lente | redis-cli SLOWLOG GET 10 |
| Latenta | redis-cli --latency |
| Chei mari | redis-cli --bigkeys |
| Status cluster | redis-cli CLUSTER INFO |
Performanta Redis la Scara Mare?
Deploymenturile Redis de inalta performanta necesita tuning atent. Echipa noastra ofera:
- Design de arhitectura Redis cluster
- Strategii de optimizare a memoriei
- Configurare high-availability
- Setup de monitorizare a performantei