| name | redis |
| description | Configure Redis for caching and data storage. Set up clustering, persistence, and Sentinel. Use when implementing Redis caching or queues. |
| license | MIT |
| metadata | {"author":"devops-skills","version":"1.0"} |
Redis
Configure, operate, and optimize Redis for caching, queues, rate limiting, and real-time data storage.
When to Use
- You need a low-latency in-memory cache to reduce database load.
- Your application requires rate limiting, session storage, or leaderboards.
- You need pub/sub messaging between services.
- You want a distributed lock or job queue backed by an in-memory store.
Prerequisites
- Linux server or Docker.
- Root or sudo access for package installation.
- Redis 7.x recommended for production.
Installation and Setup
sudo apt update
sudo apt install -y redis-server
sudo dnf install -y redis
sudo systemctl enable --now redis-server
redis-cli ping
Core Configuration
Edit /etc/redis/redis.conf:
bind 0.0.0.0
port 6379
protected-mode yes
requirepass strong_redis_password
maxmemory 2gb
maxmemory-policy allkeys-lru
maxclients 10000
timeout 300
tcp-keepalive 60
loglevel notice
logfile /var/log/redis/redis-server.log
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
sudo systemctl restart redis-server
redis-cli Commands Reference
redis-cli -a strong_redis_password
redis-cli -h 10.0.0.5 -p 6379 -a strong_redis_password
String Operations
SET user:1:name "Alice"
GET user:1:name
# Set with TTL (seconds)
SETEX session:abc123 3600 '{"userId":1}'
# Set only if key does not exist (distributed lock pattern)
SET lock:order:42 "worker-1" NX EX 30
# Increment counters
INCR page:views:/home
INCRBY api:quota:user:1 -1
Hash Operations
HSET user:1 name "Alice" email "alice@example.com" plan "pro"
HGET user:1 email
HGETALL user:1
HINCRBY user:1 login_count 1
List Operations (Queues)
LPUSH queue:emails '{"to":"alice@example.com","subject":"Welcome"}'
RPOP queue:emails
LLEN queue:emails
# Blocking pop (worker pattern)
BRPOP queue:emails 30
Set and Sorted Set Operations
# Sets — unique tags
SADD article:1:tags "redis" "database" "caching"
SMEMBERS article:1:tags
SISMEMBER article:1:tags "redis"
# Sorted sets — leaderboards
ZADD leaderboard 1500 "player:1" 2300 "player:2" 1800 "player:3"
ZREVRANGE leaderboard 0 9 WITHSCORES
ZINCRBY leaderboard 100 "player:1"
ZRANK leaderboard "player:2"
Key Management
KEYS user:* # avoid in production — use SCAN instead
SCAN 0 MATCH user:* COUNT 100
TTL session:abc123
PERSIST session:abc123
DEL user:old
EXPIRE user:1 86400
TYPE user:1
Persistence
RDB Snapshots
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis
rdbcompression yes
AOF (Append-Only File)
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
Recommended Production Strategy
Use both RDB and AOF together. RDB provides fast restarts and compact backups. AOF provides durability down to 1-second granularity.
save 900 1
save 300 10
appendonly yes
appendfsync everysec
Redis Sentinel (High Availability)
Sentinel monitors Redis instances and performs automatic failover.
Sentinel Configuration
port 26379
sentinel monitor mymaster 10.0.0.1 6379 2
sentinel auth-pass mymaster strong_redis_password
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
Run at least three Sentinel instances for quorum.
redis-sentinel /etc/redis/sentinel.conf
redis-cli -p 26379 SENTINEL masters
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
redis-cli -p 26379 SENTINEL replicas mymaster
Redis Cluster Mode
Cluster mode distributes data across multiple shards automatically.
redis-cli --cluster create \
10.0.0.1:6379 10.0.0.2:6379 10.0.0.3:6379 \
10.0.0.4:6379 10.0.0.5:6379 10.0.0.6:6379 \
--cluster-replicas 1 -a strong_redis_password
redis-cli -c -a strong_redis_password CLUSTER INFO
redis-cli -c -a strong_redis_password CLUSTER NODES
redis-cli --cluster add-node 10.0.0.7:6379 10.0.0.1:6379
redis-cli --cluster rebalance 10.0.0.1:6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
Common Patterns
Caching with TTL
SET cache:user:42:profile '{"name":"Alice","plan":"pro"}' EX 300
Rate Limiting (Sliding Window)
ZADD ratelimit:user:42 1700000000.123 "req-uuid-1"
ZREMRANGEBYSCORE ratelimit:user:42 0 1699999940.000
ZCARD ratelimit:user:42
EXPIRE ratelimit:user:42 60
Pub/Sub Messaging
redis-cli -a strong_redis_password
SUBSCRIBE notifications:order-updates
redis-cli -a strong_redis_password
PUBLISH notifications:order-updates '{"orderId":42,"status":"shipped"}'
PSUBSCRIBE notifications:*
Distributed Locking (Redlock Pattern)
SET lock:resource:42 "worker-abc" NX EX 30
redis-cli -a strong_redis_password EVAL "
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end
" 1 lock:resource:42 "worker-abc"
Docker Compose Setup
version: "3.9"
services:
redis:
image: redis:7-alpine
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redis_data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf:ro
command: redis-server /usr/local/etc/redis/redis.conf
healthcheck:
test: ["CMD", "redis-cli", "-a", "strong_redis_password", "ping"]
interval: 10s
timeout: 5s
retries: 5
redis-sentinel:
image: redis:7-alpine
restart: unless-stopped
ports:
- "26379:26379"
volumes:
- ./sentinel.conf:/usr/local/etc/redis/sentinel.conf
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
depends_on:
redis:
condition: service_healthy
redis-commander:
docker compose up -d
redis-cli -h 127.0.0.1 -a strong_redis_password ping
Monitoring
redis-cli -a strong_redis_password INFO stats
redis-cli -a strong_redis_password INFO memory
redis-cli -a strong_redis_password INFO replication
redis-cli -a strong_redis_password INFO stats | grep -E "keyspace_hits|keyspace_misses"
redis-cli -a strong_redis_password MEMORY STATS
redis-cli -a strong_redis_password SLOWLOG GET 10
redis-cli -a strong_redis_password SLOWLOG LEN
redis-cli -a strong_redis_password MONITOR
redis-cli -a strong_redis_password CLIENT LIST
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|
OOM command not allowed | maxmemory limit reached | Increase maxmemory or set a stricter eviction policy |
| High latency spikes | RDB save or AOF rewrite forking | Use save "" to disable RDB if AOF is enabled; tune auto-aof-rewrite-min-size |
LOADING Redis is loading the dataset in memory | Large dataset being restored on startup | Wait for load to complete; consider smaller dataset or faster disk |
| Cache hit ratio < 90% | TTLs too short or working set exceeds memory | Increase maxmemory; review TTL strategy |
| Sentinel not failing over | Fewer than quorum Sentinels reachable | Ensure >= 3 Sentinels are running and network-connected |
CROSSSLOT error in cluster | Multi-key command spans slots | Use hash tags {user:42}:profile to colocate related keys |
Related Skills
- postgresql - Primary database that Redis caches
- mysql - Primary database that Redis caches
- mongodb - Document database that Redis can front
- database-backups - Include RDB files in backup strategy