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
# PONG
Grundlagen
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 value
Strings
# 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 key2
Listen
# 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 mylist
Sets
# 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 # Differenz
Hashes
# 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 1
Sorted 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 key
Konfiguration
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 300
Speicherrichtlinien
| 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/redis
AOF (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 64mb
Manuell
# RDB-Snapshot
redis-cli BGSAVE
# AOF rewrite
redis-cli BGREWRITEAOF
# Letzte Speicherung
redis-cli LASTSAVE
Replikation
Slave konfigurieren
# redis.conf (Slave)
replicaof 192.168.1.10 6379
masterauth master_password
# Oder via CLI
redis-cli REPLICAOF 192.168.1.10 6379
Status 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:up
Sentinel (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 1
Sentinel starten
redis-sentinel /etc/redis/sentinel.conf
# Oder
redis-server /etc/redis/sentinel.conf --sentinel
Status
redis-cli -p 26379 SENTINEL masters
redis-cli -p 26379 SENTINEL slaves mymaster
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
Cluster
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 1
Cluster-Modus aktivieren
# redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
Cluster-Status
redis-cli -c -h 192.168.1.10 CLUSTER INFO
redis-cli -c -h 192.168.1.10 CLUSTER NODES
Pub/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
DISCARD
WATCH (optimistisches Locking)
WATCH key
val = GET key
MULTI
SET key newval
EXEC # Scheitert wenn key geändert wurde
Lua-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 10
Sicherheit
Passwort
# redis.conf
requirepass your_secure_password
# Via CLI
CONFIG SET requirepass "password"
AUTH password
ACL (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 Befehle
Gefä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 False
Zusammenfassung
| 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.