# Referensi Cepat Redis

*String, list, set, hash, pub/sub, persistence*

> Source: Redis Documentation (redis.io/docs) · MIT

## Menghubungkan

### CLI

```
redis-cli
redis-cli -h 127.0.0.1 -p 6379
redis-cli -a password -n 2
redis-cli --tls -u rediss://user:pass@host:6380
```

### Koneksi Driver (Python)

```
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.set('key', 'value')
print(r.get('key'))
```

### Info Server

```
PING           -- mengembalikan PONG
INFO server    -- detail server
INFO memory    -- penggunaan memori
DBSIZE         -- jumlah key di db saat ini
```

## String

### Operasi Dasar

```
SET name "Alice"
GET name
SET counter 100
MSET a 1 b 2 c 3
MGET a b c
```

### Operasi Numerik

```
INCR counter        -- 101
INCRBY counter 10   -- 111
DECR counter        -- 110
DECRBY counter 5    -- 105
INCRBYFLOAT price 2.5
```

### Perintah String

| Command | Description |
|---------|-------------|
| `SET key val` | Set nilai string |
| `GET key` | Ambil nilai string |
| `SETNX key val` | Set hanya jika key belum ada |
| `SETEX key sec val` | Set dengan kedaluwarsa dalam detik |
| `APPEND key val` | Tambahkan ke nilai yang ada |
| `STRLEN key` | Panjang nilai string |

## List

### Operasi List

```
LPUSH queue "first"
RPUSH queue "last"
LRANGE queue 0 -1    -- semua elemen
LPOP queue
RPOP queue
```

### Perintah List

| Command | Description |
|---------|-------------|
| `LPUSH / RPUSH` | Push ke kiri / kanan list |
| `LPOP / RPOP` | Pop dari kiri / kanan |
| `LRANGE key start stop` | Dapatkan rentang elemen |
| `LLEN key` | Panjang list |
| `LINDEX key idx` | Elemen pada indeks |
| `LREM key count val` | Hapus count kemunculan val |
| `BLPOP key timeout` | Blocking pop (untuk queue) |

## Set & Sorted Set

### Operasi Set

```
SADD tags "python" "redis" "docker"
SMEMBERS tags
SISMEMBER tags "python"   -- 1 (true)
SREM tags "docker"
SCARD tags                -- jumlah
```

### Operasi Matematika Set

```
SUNION set1 set2       -- union
SINTER set1 set2       -- irisan
SDIFF set1 set2        -- selisih
```

### Operasi Sorted Set

```
ZADD leaderboard 100 "Alice" 85 "Bob"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANGE leaderboard 0 2
ZSCORE leaderboard "Alice"
ZRANK leaderboard "Alice"    -- rank berbasis 0
```

### Perintah Sorted Set

| Command | Description |
|---------|-------------|
| `ZADD key score member` | Tambahkan member dengan skor |
| `ZRANGE key start stop` | Rentang berdasarkan rank (rendah ke tinggi) |
| `ZREVRANGE key start stop` | Rentang berdasarkan rank (tinggi ke rendah) |
| `ZINCRBY key incr member` | Tambahkan skor member |
| `ZRANGEBYSCORE key min max` | Rentang berdasarkan nilai skor |
| `ZCARD key` | Jumlah member |

## Hash

### Operasi Hash

```
HSET user:1 name "Alice" age 30
HGET user:1 name
HGETALL user:1
HMSET user:2 name "Bob" age 25
HMGET user:1 name age
```

### Perintah Hash

| Command | Description |
|---------|-------------|
| `HSET key field val` | Set field hash |
| `HGET key field` | Ambil field hash |
| `HGETALL key` | Ambil semua field dan nilai |
| `HDEL key field` | Hapus field hash |
| `HEXISTS key field` | Periksa keberadaan field |
| `HINCRBY key field n` | Tambahkan nilai field |
| `HKEYS key` | Semua nama field |
| `HLEN key` | Jumlah field |

## Key & Kedaluwarsa

### Perintah Key

| Command | Description |
|---------|-------------|
| `KEYS pattern` | Temukan key yang cocok pola (lambat) |
| `SCAN cursor MATCH pat` | Iterasi key secara bertahap (aman) |
| `EXISTS key` | Periksa apakah key ada |
| `DEL key` | Hapus key |
| `TYPE key` | Dapatkan tipe data key |
| `RENAME key newkey` | Ganti nama key |

### Perintah Kedaluwarsa

```
EXPIRE key 3600       -- kedaluwarsa dalam 1 jam
PEXPIRE key 5000      -- kedaluwarsa dalam 5000 ms
TTL key               -- detik hingga kedaluwarsa
PTTL key              -- ms hingga kedaluwarsa
PERSIST key           -- hapus kedaluwarsa
```

### Pola Key

```
SET session:abc123 "data" EX 1800
-- EX = detik, PX = milidetik
-- NX = hanya jika belum ada
-- XX = hanya jika sudah ada
SET lock:order42 "owner" NX EX 10
```

## Pub/Sub

### Pub/Sub Dasar

```
-- Subscriber (terminal 1)
SUBSCRIBE news alerts

-- Publisher (terminal 2)
PUBLISH news "Breaking: Redis 8 released"
```

### Subscribe Pola

```
PSUBSCRIBE news.*
-- cocok dengan news.tech, news.sports, dll.
```

### Perintah Pub/Sub

| Command | Description |
|---------|-------------|
| `SUBSCRIBE channel` | Dengarkan pesan di channel |
| `PUBLISH channel msg` | Kirim pesan ke channel |
| `PSUBSCRIBE pattern` | Subscribe ke pola |
| `UNSUBSCRIBE channel` | Berhenti mendengarkan |
| `PUBSUB CHANNELS` | Daftar channel aktif |

## Transaksi

### MULTI / EXEC

```
MULTI
SET balance:1 900
SET balance:2 1100
EXEC        -- dieksekusi secara atomik
```

### Optimistic Locking

```
WATCH balance:1
val = GET balance:1   -- baca nilai saat ini
MULTI
SET balance:1 (val - 100)
EXEC
-- EXEC mengembalikan nil jika balance:1 berubah
```

### Perintah Transaksi

| Command | Description |
|---------|-------------|
| `MULTI` | Mulai blok transaksi |
| `EXEC` | Eksekusi perintah yang diantrekan |
| `DISCARD` | Buang perintah yang diantrekan |
| `WATCH key` | Pantau key untuk perubahan (optimistic lock) |
| `UNWATCH` | Lupakan semua key yang dipantau |

## Persistence

### Snapshot RDB

```
SAVE             -- snapshot sinkron
BGSAVE           -- snapshot di background
LASTSAVE         -- timestamp save terakhir
```

### AOF (Append Only File)

| Command | Description |
|---------|-------------|
| `appendonly yes` | Aktifkan AOF di redis.conf |
| `appendfsync always` | Fsync setiap penulisan (paling aman, paling lambat) |
| `appendfsync everysec` | Fsync sekali per detik (disarankan) |
| `appendfsync no` | Biarkan OS memutuskan (tercepat, paling berisiko) |

### Perintah Persistence

```
CONFIG GET save
CONFIG SET save "900 1 300 10"
-- snapshot jika 1 perubahan dalam 900d atau 10 dalam 300d
BGREWRITEAOF    -- tulis ulang AOF di background
```

## Pola Umum

### Distributed Lock

```
SET lock:resource "owner-id" NX EX 30
-- NX = ambil hanya jika belum dikunci
-- EX 30 = auto-lepas setelah 30d
DEL lock:resource  -- lepas secara eksplisit
```

### Rate Limiter

```
key = "rate:user:42"
INCR key
EXPIRE key 60   -- jendela 60 detik
-- tolak jika GET key > max_requests
```

### Pola Caching

```
val = GET "cache:user:1"
if val is nil:
  val = fetch_from_db(1)
  SET "cache:user:1" val EX 300
```

### Penyimpanan Sesi

```
HSET sess:abc uid 42 role "admin"
EXPIRE sess:abc 1800   -- TTL 30 menit
HGETALL sess:abc
```
