Redis ist eine In-Memory-Datenbank für Caching, Session-Storage und Echtzeit-Anwendungen. Die hohe Geschwindigkeit macht es zum Standard für Performance-kritische Anwendungen.
Installation
# Debian/Ubuntu
apt install redis-server
# RHEL/CentOS
dnf install redis
# Starten
systemctl enable redis-server
systemctl start redis-server
# Testen
redis-cli ping
# PONGGrundlagen
redis-cli
# Verbinden
redis-cli
# Mit Host/Port
redis-cli -h 192.168.1.10 -p 6379
# Mit Passwort
redis-cli -a password
# Befehl direkt
redis-cli SET key valueStrings
# Setzen
SET name "Max"
SET counter 100
# Mit TTL (Sekunden)
SETEX session:123 3600 "userdata"
# Nur wenn nicht existiert
SETNX key "value"
# Lesen
GET name
GET counter
# Inkrementieren
INCR counter
INCRBY counter 10
DECR counter
# Mehrere gleichzeitig
MSET key1 "val1" key2 "val2"
MGET key1 key2Listen
# Hinzufügen
LPUSH mylist "first"
RPUSH mylist "last"
# Lesen
LRANGE mylist 0 -1 # Alle
LRANGE mylist 0 2 # Erste 3
LINDEX mylist 0 # Erstes Element
# Entfernen
LPOP mylist # Erstes
RPOP mylist # Letztes
# Länge
LLEN mylistSets
# Hinzufügen
SADD tags "linux" "server" "admin"
# Alle Elemente
SMEMBERS tags
# Prüfen
SISMEMBER tags "linux"
# Entfernen
SREM tags "admin"
# Operationen
SUNION set1 set2 # Vereinigung
SINTER set1 set2 # Schnittmenge
SDIFF set1 set2 # DifferenzHashes
# Setzen
HSET user:1 name "Max" email "max@example.de" age "30"
# Lesen
HGET user:1 name
HGETALL user:1
# Mehrere Felder
HMSET user:2 name "Anna" email "anna@example.de"
HMGET user:2 name email
# Inkrementieren
HINCRBY user:1 age 1Sorted Sets
# Mit Score
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"
# Top 3
ZREVRANGE leaderboard 0 2 WITHSCORES
# Nach Score
ZRANGEBYSCORE leaderboard 100 200
# Rank
ZREVRANK leaderboard "player2"
# Score erhöhen
ZINCRBY leaderboard 50 "player1"Key-Management
# Alle Keys
KEYS *
KEYS user:*
# Key existiert?
EXISTS key
# TTL prüfen
TTL key
PTTL key # Millisekunden
# TTL setzen
EXPIRE key 3600
EXPIREAT key 1893456000
# Key löschen
DEL key
UNLINK key # Async
# Key umbenennen
RENAME oldkey newkey
# Typ ermitteln
TYPE keyKonfiguration
redis.conf
# /etc/redis/redis.conf
# Netzwerk
bind 127.0.0.1
port 6379
# Passwort
requirepass your_secure_password
# Speicher
maxmemory 256mb
maxmemory-policy allkeys-lru
# Persistence
appendonly yes
appendfsync everysec
# Timeout
timeout 300Speicherrichtlinien
| Policy | Beschreibung | |--------|--------------| | noeviction | Fehler wenn voll | | allkeys-lru | LRU auf alle Keys | | volatile-lru | LRU nur mit TTL | | allkeys-random | Zufällig | | volatile-random | Zufällig mit TTL | | volatile-ttl | Kürzeste TTL zuerst |
Persistence
RDB (Snapshots)
# redis.conf
save 900 1 # Nach 900s wenn 1 Änderung
save 300 10 # Nach 300s wenn 10 Änderungen
save 60 10000 # Nach 60s wenn 10000 Änderungen
dbfilename dump.rdb
dir /var/lib/redisAOF (Append Only File)
# redis.conf
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # always, everysec, no
# AOF rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mbManuell
# RDB-Snapshot
redis-cli BGSAVE
# AOF rewrite
redis-cli BGREWRITEAOF
# Letzte Speicherung
redis-cli LASTSAVEReplikation
Slave konfigurieren
# redis.conf (Slave)
replicaof 192.168.1.10 6379
masterauth master_password
# Oder via CLI
redis-cli REPLICAOF 192.168.1.10 6379Status prüfen
redis-cli INFO replication
# Master-Info
role:master
connected_slaves:2
# Slave-Info
role:slave
master_host:192.168.1.10
master_link_status:upSentinel (Hochverfügbarkeit)
sentinel.conf
# /etc/redis/sentinel.conf
sentinel monitor mymaster 192.168.1.10 6379 2
sentinel auth-pass mymaster master_password
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1Sentinel starten
redis-sentinel /etc/redis/sentinel.conf
# Oder
redis-server /etc/redis/sentinel.conf --sentinelStatus
redis-cli -p 26379 SENTINEL masters
redis-cli -p 26379 SENTINEL slaves mymaster
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymasterCluster
Cluster erstellen
# Mindestens 6 Nodes (3 Master + 3 Slaves)
redis-cli --cluster create \
192.168.1.10:6379 \
192.168.1.11:6379 \
192.168.1.12:6379 \
192.168.1.13:6379 \
192.168.1.14:6379 \
192.168.1.15:6379 \
--cluster-replicas 1Cluster-Modus aktivieren
# redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000Cluster-Status
redis-cli -c -h 192.168.1.10 CLUSTER INFO
redis-cli -c -h 192.168.1.10 CLUSTER NODESPub/Sub
Publisher
redis-cli PUBLISH channel "Hello World"Subscriber
redis-cli SUBSCRIBE channel
# Pattern
redis-cli PSUBSCRIBE news.*Transaktionen
# Transaktion starten
MULTI
# Befehle queuen
SET key1 "value1"
INCR counter
LPUSH mylist "item"
# Ausführen
EXEC
# Abbrechen
DISCARDWATCH (optimistisches Locking)
WATCH key
val = GET key
MULTI
SET key newval
EXEC # Scheitert wenn key geändert wurdeLua-Scripts
# Script ausführen
EVAL "return redis.call('GET', KEYS[1])" 1 mykey
# Script speichern
SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
# Returns SHA1
# Gespeichertes Script
EVALSHA sha1 1 mykey "value"Monitoring
# Echtzeit-Monitor
redis-cli MONITOR
# Statistiken
redis-cli INFO
# Speicher
redis-cli INFO memory
redis-cli MEMORY USAGE key
# Langsame Befehle
redis-cli SLOWLOG GET 10Sicherheit
Passwort
# redis.conf
requirepass your_secure_password
# Via CLI
CONFIG SET requirepass "password"
AUTH passwordACL (Redis 6+)
# User erstellen
ACL SETUSER myuser on >password ~keys:* +@read
# User auflisten
ACL LIST
# Berechtigungen
# ~keys:* - Key-Pattern
# +@read - Nur Lese-Befehle
# +@write - Schreib-Befehle
# +@all - Alle BefehleGefährliche Befehle
# redis.conf
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG "CONFIG_SECRET_NAME"Praktisches Beispiel
Session-Cache
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
# Session speichern
def save_session(session_id, data, ttl=3600):
r.setex(f"session:{session_id}", ttl, json.dumps(data))
# Session laden
def get_session(session_id):
data = r.get(f"session:{session_id}")
return json.loads(data) if data else None
# Session löschen
def delete_session(session_id):
r.delete(f"session:{session_id}")Rate Limiter
def is_rate_limited(user_id, limit=100, window=60):
key = f"ratelimit:{user_id}"
current = r.get(key)
if current is None:
r.setex(key, window, 1)
return False
if int(current) >= limit:
return True
r.incr(key)
return FalseZusammenfassung
| Datentyp | Verwendung | |----------|------------| | String | Einfache Werte, Counter | | List | Queues, Logs | | Set | Tags, eindeutige Werte | | Hash | Objekte | | Sorted Set | Rankings, Zeitreihen |
| Befehl | Funktion | |--------|----------| | SET/GET | String-Operationen | | LPUSH/RPOP | Listen | | SADD/SMEMBERS | Sets | | HSET/HGETALL | Hashes | | ZADD/ZRANGE | Sorted Sets | | EXPIRE | TTL setzen | | INFO | Statistiken |
| Port | Dienst | |------|--------| | 6379 | Redis Server | | 26379 | Sentinel |
Fazit
Redis ist unverzichtbar für Performance-kritische Anwendungen. Die vielfältigen Datenstrukturen decken viele Use Cases ab. Persistence-Optionen erlauben Datensicherheit. Sentinel und Cluster sorgen für Hochverfügbarkeit. Die einfache API macht den Einstieg leicht.