วิศวกรระดับ Senior จะไม่ใช้แค่ redis-cli ธรรมดา แต่ต้องเชี่ยวชาญ Flags สำหรับงาน Automation, Secure Remote Connection, และ Cluster Redirection
# 1. เชื่อมต่อไปยัง Production พร้อม Authenticate ผ่าน TLS และ Custom Database
redis-cli -h redis-prod.internal.bank -p 6379 -a "StrongVaultSecret" --tls --cacert /etc/ssl/redis/ca.crt -n 0
# 2. เชื่อมต่อ Redis Cluster (เปิด Auto-Redirect ตามคำตอบ -MOVED และ -ASK)
redis-cli -c -h 10.0.1.10 -p 6379
# 3. รันคำสั่งแบบ Non-Interactive Scripting (เหมาะกับ Bash / CI/CD)
# --raw: ตัด RESP Type formatting ออก คืนค่าดิบเพียวๆ นำไป grep/awk ได้ทันที
# --csv: แปลงผลลัพธ์เป็น CSV อัตโนมัติ
redis-cli -h 10.0.1.10 -p 6379 --raw GET config:feature_flags:instant_transfer
redis-cli -h 10.0.1.10 -p 6379 --csv MGET acc:101:bal acc:102:bal acc:103:bal
# 4. Continuous Command Execution (เฝ้าดูการเปลี่ยนแปลงแบบ Loop)
# -r 10 (รัน 10 รอบ) -i 0.5 (ทุกๆ 0.5 วินาที)
redis-cli -r 10 -i 0.5 INFO memory | grep used_memory_human
คำสั่ง KEYS * ทำงานแบบ $O(N)$ จะบล็อก Event Loop และทำให้ทุกคำขอในระบบค้าง วิศวกรต้องใช้คำสั่งตระกูล SCAN เสมอ ซึ่งทำงานผ่าน Cursor-based Iteration:
# คำสั่ง SCAN ใน redis-cli
127.0.0.1:6379> SCAN 0 MATCH "session:usr_*" COUNT 100
# เทียบเท่าสำหรับ Data Structures อื่นๆ:
127.0.0.1:6379> HSCAN ledger:account_registry 0 MATCH "THB_*" COUNT 50
127.0.0.1:6379> SSCAN authorized_client_ids 0 COUNT 100
127.0.0.1:6379> ZSCAN leaderboard:daily_ranks 0 COUNT 100
# 1. สแกนหา Big Key (ปลอดภัยบน Production เพราะเบื้องหลังใช้ SCAN ทีละ Batch)
# รายงาน Key ที่มีขนาดไบต์ใหญ่สุด (String) และสมาชิกมากที่สุด (List, Hash, Set, ZSet)
redis-cli -h 10.0.1.10 -p 6379 --bigkeys
# 2. สแกนหา Hotkey (ต้องเปิด maxmemory-policy LFU ใน redis.conf ก่อน)
# ช่วยระบุว่า Key ไหนกำลังถูกถล่มยิงคำขอสูงสุดในคลัสเตอร์ ณ วินาทีนั้น
redis-cli -h 10.0.1.10 -p 6379 --hotkeys
# 3. ตรวจสอบ Memory Usage รายละเอียดระดับลึกของ Key ต้องสงสัย (หน่วยเป็น Bytes)
127.0.0.1:6379> MEMORY USAGE ledger:transactions:2026_09
127.0.0.1:6379> OBJECT ENCODING ledger:transactions:2026_09
เมื่อผู้ใช้บ่นว่า API ตอบสนองช้า หรือเกิด Latency Spikes ขึ้นเป็นระยะ วิศวกรต้องทราบวิธีตรวจสอบ Latency ผ่าน CLI ให้ลึกถึงระดับ Kernel และ OS Sockets
SLOWLOG จะบันทึกเฉพาะคำสั่งที่ Execution Time บน Single Thread เกินเกณฑ์ (ไม่รวมเวลา Network I/O):
# ดูเกณฑ์การบันทึกปัจจุบัน (หน่วยเป็น Microseconds, ค่าเริ่มต้นคือ 10,000 µs = 10ms)
127.0.0.1:6379> CONFIG GET slowlog-log-slower-than
# ปรับเกณฑ์ให้เข้มงวดขึ้นใน Production (เช่น เกิน 1,000 µs = 1ms ให้บันทึกทันที)
127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 1000
# ดึง 10 รายการคำสั่งล่าสุดที่กินเวลา CPU เกินเกณฑ์
127.0.0.1:6379> SLOWLOG GET 10
# ผลลัพธ์: [ID, Timestamp, Execution Duration (µs), Command Arguments, Client IP:Port]
# 1. วัด Network + Event Loop Latency แบบ Real-time (ส่ง PING รัวๆ)
# วัดค่า Min, Max, Average Latency อย่างต่อเนื่อง (กด Ctrl+C เพื่อหยุด)
redis-cli -h 10.0.1.10 -p 6379 --latency
# 2. พล็อตกราฟ Latency Spikes ใน Terminal เป็นรหัสสี ASCII
redis-cli -h 10.0.1.10 -p 6379 --latency-dist
# 3. แยกแยะปัญหา: ทดสอบดูว่า OS หรือ Hardware Virtualization มี Latency หรือไม่
# --intrinsic-latency: รันลูปคำนวณใน CPU เพียวๆ 100 วินาที เพื่อดูว่า OS Kernel ขโมย Cycles หรือไม่
redis-cli --intrinsic-latency 100
--intrinsic-latency แล้วพบค่า Max latency เกิน 2-3 มิลลิวินาที แสดงว่าปัญหาไม่ได้อยู่ที่ Redis แต่เกิดจาก OS Kernel Throttling, Hypervisor Steal Time (ใน AWS/GCP), หรือ CPU Power Saving Frequency Scaling
คำสั่ง INFO memory คือหัวใจในการตรวจสอบความเสี่ยงต่อการโดน Linux Kernel OOM Killer สั่งฆ่าโปรเซส
127.0.0.1:6379> INFO memory
# -------------------------------------------------------------
# used_memory: 12582912000 (RAM ที่เก็บข้อมูลจริง ~11.7 GB)
# used_memory_rss: 18253611008 (RAM จริงที่ OS Kernel มองเห็น ~17.0 GB)
# mem_fragmentation_ratio: 1.45 (RSS / Used Memory)
# mem_allocator: jemalloc-5.3.0
# client_recent_max_output_buffer: 524288000 (Output Buffer สะสมสูง)
# -------------------------------------------------------------
127.0.0.1:6379> CONFIG SET activedefrag yes
127.0.0.1:6379> MEMORY PURGE # บังคับให้ jemalloc คืน Memory ที่ไม่ได้ใช้ให้ OS ทันที
# ตรวจดูว่ามี Client หรือ Replica โหนดใดกำลังสะสม Buffer ใน RAM สูงผิดปกติหรือไม่
127.0.0.1:6379> CLIENT LIST
# สังเกตคอลัมน์ obl (Output Buffer Length), oll (Output List Length), omem (Output Memory)
# หากพบ Client ที่ omem พุ่งสูงผิดปกติ สามารถสั่งตัดการเชื่อมต่อได้ทันที:
127.0.0.1:6379> CLIENT KILL ID 84920
# 1. รันไฟล์ Lua สดจาก Terminal ผ่านคำสั่ง --eval
# ไวยากรณ์: redis-cli --eval <script.lua> <key1> <key2> , <arg1> <arg2>
# สำคัญมาก: ต้องมี space คั่นหน้าและหลังเครื่องหมายจุลภาค ( , ) เพื่อแยก KEYS ออกจาก ARGV
redis-cli --eval atomic_withdraw.lua ledger:{acc_101}:balance , 500 "TXN_9981"
# 2. โหลด Script เข้าไปแคชไว้ใน RAM ของ Redis ล่วงหน้า (ได้ SHA1 Checksum กลับมา)
redis-cli SCRIPT LOAD "$(cat atomic_withdraw.lua)"
# ผลลัพธ์: "7a8b9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b"
# 3. รันผ่าน EVALSHA โดยส่งเพียง SHA1 (ประหยัด Network Bandwidth)
127.0.0.1:6379> EVALSHA 7a8b9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b 1 ledger:{acc_101}:balance 500 "TXN_9981"
# 4. หากมีสคริปต์รันวนลูปไม่หยุด (Infinite Loop) บล็อก Event Loop ให้สั่งหยุดฉุกเฉิน:
127.0.0.1:6379> SCRIPT KILL
# 1. ตรวจสอบสถานะความสมบูรณ์ของ Cluster ทุกโหนด (เช็ค 16,384 Slots ว่าครบหรือไม่)
redis-cli --cluster check 10.0.1.10:6379
# 2. คำนวณดูว่า Key จะตกอยู่บน Hash Slot ใด
127.0.0.1:6379> CLUSTER KEYSLOT "ledger:{acc_99}:balance"
# ผลลัพธ์: (integer) 12450 (เพราะคำนวณ CRC16 จากเฉพาะ "acc_99")
# 3. Resharding: ย้าย Hash Slots จาก Node เก่าไปยัง Node ใหม่แบบ Online
redis-cli --cluster reshard 10.0.1.10:6379 --cluster-from <source-node-id> --cluster-to <target-node-id> --cluster-slots 1000
# 4. บังคับ Failover แมนนวลอย่างปลอดภัยบน Replica Node (Graceful Failover)
127.0.0.1:6379> CLUSTER FAILOVER # (สั่งบน Replica เพื่อขึ้นเป็น Master แทนโดยข้อมูลไม่หาย)
แบบทดสอบวัดทักษะการใช้งาน Command-Line, การดีบักปัญหา Latency, การจัดการ Cluster, และการกู้วิกฤต Production 15 ข้อ