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.