Redis เป็นระบบจัดเก็บข้อมูลแบบ In-Memory ที่ทำงานเร็วมากเพราะเก็บข้อมูลไว้ใน RAM โดยรองรับโครงสร้างข้อมูลหลากหลายทั้ง String, Hash, List, Set และ Sorted Set ทำให้เหมาะกับการใช้งานหลายรูปแบบตั้งแต่ Caching, Session Store, Message Queue ไปจนถึง Real-time Analytics
บทความนี้จะแนะนำวิธีติดตั้ง Redis บน Cloud VPS ตั้งแต่ขั้นตอนการติดตั้ง การตั้งค่าพื้นฐาน การรักษาความปลอดภัย ไปจนถึงการปรับแต่ง Performance สำหรับใช้งานจริง เนื้อหาครอบคลุมทั้ง Ubuntu/Debian และ CentOS/RHEL
Redis คืออะไรและเหมาะกับงานแบบไหน
Redis ย่อมาจาก Remote Dictionary Server เป็น In-Memory Data Store แบบ Open Source ที่สามารถทำหน้าที่เป็นทั้งฐานข้อมูล, Cache และ Message Broker ข้อมูลถูกเก็บใน RAM ทำให้อ่านเขียนได้ในระดับ Microsecond ต่างจากฐานข้อมูลทั่วไปที่ต้องอ่านจาก Disk
การใช้งานที่พบบ่อยได้แก่ Caching สำหรับลดภาระฐานข้อมูลหลัก, Session Storage สำหรับเว็บแอปพลิเคชัน, Rate Limiting สำหรับจำกัดจำนวน Request, Leaderboard และ Ranking ด้วย Sorted Set, Pub/Sub สำหรับการส่งข้อมูลแบบ Real-time และ Queue สำหรับจัดการงานเบื้องหลัง
ความต้องการของระบบ
Redis ทำงานบน Linux ได้ดีที่สุดและใช้ทรัพยากรน้อย ข้อกำหนดขั้นต่ำคือ RAM อย่างน้อย 1 GB (ขึ้นอยู่กับปริมาณข้อมูล), CPU 1 Core ขึ้นไป และพื้นที่ Disk สำหรับเก็บไฟล์ Persistence ควรเลือก VPS ที่มี RAM เพียงพอเพราะ Redis เก็บข้อมูลทั้งหมดใน Memory
ติดตั้ง Redis บน Ubuntu/Debian
ติดตั้งจาก Package Manager
sudo apt update
sudo apt install redis-server -y
# ตรวจสอบเวอร์ชัน
redis-server --version
# ตรวจสอบสถานะ
sudo systemctl status redis-server
ติดตั้งเวอร์ชันล่าสุดจาก Official Repository
แพ็กเกจใน apt อาจไม่ใช่เวอร์ชันล่าสุด ถ้าต้องการเวอร์ชันใหม่สามารถเพิ่ม Official Redis Repository ได้
# เพิ่ม Redis Official Repository
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install redis -y
# ตรวจสอบเวอร์ชัน
redis-server --version
ติดตั้ง Redis บน CentOS/RHEL
# เปิดใช้ EPEL Repository
sudo dnf install epel-release -y
sudo dnf install redis -y
# เริ่มและเปิดใช้งานอัตโนมัติ
sudo systemctl start redis
sudo systemctl enable redis
# ตรวจสอบสถานะ
sudo systemctl status redis
สำหรับเวอร์ชันล่าสุดบน CentOS สามารถใช้ Remi Repository หรือคอมไพล์จาก Source Code ได้เช่นกัน
ติดตั้งจาก Source Code
การคอมไพล์จาก Source เหมาะสำหรับกรณีที่ต้องการเวอร์ชันเฉพาะหรือต้องการ Compile Option พิเศษ
# ติดตั้ง Dependencies
sudo apt install build-essential tcl pkg-config -y
# ดาวน์โหลดและคอมไพล์
cd /tmp
curl -O https://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
make test # ทดสอบก่อนติดตั้ง (ใช้เวลาสักครู่)
sudo make install
# สร้างไดเรกทอรีสำหรับ Configuration
sudo mkdir -p /etc/redis
sudo cp redis.conf /etc/redis/redis.conf
ตั้งค่า Redis เบื้องต้น
ไฟล์ตั้งค่าหลักอยู่ที่ /etc/redis/redis.conf สำหรับการติดตั้งจาก Package Manager หรือที่กำหนดเองสำหรับการคอมไพล์จาก Source
# แก้ไขไฟล์ตั้งค่า
sudo nano /etc/redis/redis.conf
# --- การตั้งค่าพื้นฐาน ---
# Bind Address — กำหนด IP ที่ Redis รับฟัง
# ค่าเริ่มต้น: 127.0.0.1 (เฉพาะ localhost)
bind 127.0.0.1
# ถ้าต้องการให้เข้าถึงจาก IP อื่น:
# bind 127.0.0.1 10.0.1.50
# Port — พอร์ตที่ Redis รับฟัง
port 6379
# Protected Mode — เปิดไว้เพื่อความปลอดภัย
protected-mode yes
# Daemonize — รันเป็น Background Process
daemonize yes
# PID File
pidfile /var/run/redis/redis-server.pid
# Log Level (debug, verbose, notice, warning)
loglevel notice
logfile /var/log/redis/redis-server.log
# จำนวน Database (ค่าเริ่มต้น 16 → DB 0-15)
databases 16
ตั้งค่า Memory Management
เนื่องจาก Redis เก็บข้อมูลใน RAM การจำกัดและจัดการ Memory เป็นเรื่องสำคัญมากเพื่อป้องกันไม่ให้ระบบ Out of Memory
# กำหนด Memory สูงสุดที่ Redis ใช้ได้
# แนะนำไม่เกิน 70-80% ของ RAM ทั้งหมด เพื่อเผื่อ OS และ Process อื่น
maxmemory 512mb
# นโยบายเมื่อ Memory เต็ม (Eviction Policy)
# allkeys-lru: ลบ Key ที่ไม่ได้ใช้นานที่สุดออก (แนะนำสำหรับ Cache)
# volatile-lru: ลบเฉพาะ Key ที่มี TTL และไม่ได้ใช้นานที่สุด
# allkeys-lfu: ลบ Key ที่ใช้น้อยที่สุด (Least Frequently Used)
# noeviction: ไม่ลบเลย → คืน Error เมื่อ Memory เต็ม
maxmemory-policy allkeys-lru
# จำนวน Sample สำหรับ LRU Algorithm (ค่ามากยิ่งแม่นยำแต่ช้าขึ้น)
maxmemory-samples 5
ตั้งค่า Persistence (บันทึกข้อมูลลง Disk)
แม้ Redis จะเก็บข้อมูลใน RAM แต่สามารถบันทึกข้อมูลลง Disk เพื่อป้องกันข้อมูลหายเมื่อ Restart ได้ มี 2 วิธีหลัก
RDB (Redis Database Backup)
RDB สร้าง Snapshot ของข้อมูลทั้งหมดเป็นไฟล์ .rdb ตามเงื่อนไขที่กำหนด เช่น ทุก 60 วินาทีถ้ามีการเปลี่ยนแปลงอย่างน้อย 1000 Key ข้อดีคือไฟล์กะทัดรัดและ Restore เร็ว แต่อาจสูญเสียข้อมูลระหว่าง Snapshot
# RDB Configuration
save 900 1 # บันทึกถ้ามีอย่างน้อย 1 Key เปลี่ยนใน 900 วินาที (15 นาที)
save 300 10 # บันทึกถ้ามีอย่างน้อย 10 Key เปลี่ยนใน 300 วินาที (5 นาที)
save 60 10000 # บันทึกถ้ามีอย่างน้อย 10000 Key เปลี่ยนใน 60 วินาที
# หยุด Redis ถ้า RDB Save ล้มเหลว (แนะนำเปิดไว้)
stop-writes-on-bgsave-error yes
# บีบอัดไฟล์ RDB
rdbcompression yes
# ตรวจสอบ Checksum เมื่อโหลด RDB
rdbchecksum yes
# ชื่อไฟล์และที่เก็บ
dbfilename dump.rdb
dir /var/lib/redis
AOF (Append Only File)
AOF บันทึกทุกคำสั่งที่เปลี่ยนแปลงข้อมูลลงไฟล์แบบ Append สูญเสียข้อมูลน้อยกว่า RDB แต่ไฟล์มีขนาดใหญ่กว่าและ Restore ช้ากว่า
# เปิดใช้ AOF
appendonly yes
# ชื่อไฟล์ AOF
appendfilename "appendonly.aof"
# ความถี่ในการ Sync ลง Disk
# always: ทุกคำสั่ง (ช้าที่สุดแต่ปลอดภัยที่สุด)
# everysec: ทุก 1 วินาที (แนะนำ — สมดุลระหว่างความเร็วและความปลอดภัย)
# no: ให้ OS จัดการ (เร็วที่สุดแต่อาจสูญข้อมูลได้มาก)
appendfsync everysec
# ทำ AOF Rewrite อัตโนมัติเมื่อไฟล์ใหญ่ขึ้น
auto-aof-rewrite-percentage 100 # Rewrite เมื่อไฟล์ใหญ่กว่า 100% ของ Rewrite ครั้งก่อน
auto-aof-rewrite-min-size 64mb # ไม่ Rewrite ถ้าไฟล์ยังเล็กกว่า 64 MB
สำหรับ Production แนะนำเปิดทั้ง RDB และ AOF เพื่อให้ได้ทั้ง Snapshot ที่ Restore เร็วและ AOF ที่สูญเสียข้อมูลน้อย เมื่อ Redis เริ่มต้นใหม่จะใช้ AOF ในการ Restore เพราะมีข้อมูลครบกว่า
ตั้งค่าความปลอดภัย
Redis ไม่ได้ออกแบบมาให้เปิดรับการเชื่อมต่อจากอินเทอร์เน็ตโดยตรง การรักษาความปลอดภัยเป็นสิ่งจำเป็นอย่างยิ่งเมื่อติดตั้งบน VPS
ตั้ง Password
# ตั้งรหัสผ่านใน redis.conf
requirepass YourStrongPassword123!
# ตั้ง Password สำหรับ Replication (ถ้าใช้ Master-Replica)
masterauth YourStrongPassword123!
# เชื่อมต่อด้วย Password
redis-cli -a YourStrongPassword123!
# หรือใช้คำสั่ง AUTH หลังเชื่อมต่อ
redis-cli
AUTH YourStrongPassword123!
ACL (Access Control List) — Redis 6+
ตั้งแต่ Redis 6 เป็นต้นมา สามารถสร้างผู้ใช้หลายคนพร้อมกำหนดสิทธิ์ได้ละเอียด
# สร้างผู้ใช้ใน redis.conf หรือ aclfile
# รูปแบบ: user [username] [flags] [permissions]
# ผู้ใช้สำหรับ App — อ่านเขียนได้เฉพาะ Key ที่ขึ้นต้นด้วย app:
user appuser on >AppPassword123 ~app:* +@all -@dangerous
# ผู้ใช้สำหรับอ่านอย่างเดียว
user readonly on >ReadPassword123 ~* +@read -@write -@admin -@dangerous
# ปิด Default User (ถ้าใช้ ACL แทน)
user default off
# หรือใช้ ACL File แยก
aclfile /etc/redis/users.acl
# จัดการ ACL ผ่าน redis-cli
ACL SETUSER appuser on >AppPassword123 ~app:* +@all -@dangerous
ACL LIST
ACL SAVE
ตั้งค่า Firewall
# อนุญาตเฉพาะ IP ที่ต้องการ
sudo ufw allow from 10.0.1.0/24 to any port 6379
# หรือใช้ iptables
sudo iptables -A INPUT -s 10.0.1.0/24 -p tcp --dport 6379 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6379 -j DROP
ปิดคำสั่งอันตราย
# เปลี่ยนชื่อคำสั่งที่อันตรายใน redis.conf
# Redis 6+ ใช้ ACL แทน rename-command
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG "CONFIG_SECRET_CMD"
# ห้ามใช้คำสั่ง KEYS ใน Production (ใช้ SCAN แทน)
rename-command KEYS ""
ทดสอบการทำงาน
# เชื่อมต่อ Redis
redis-cli
# ทดสอบ Ping
127.0.0.1:6379> PING
PONG
# เขียนและอ่านข้อมูล
127.0.0.1:6379> SET greeting "Hello Redis"
OK
127.0.0.1:6379> GET greeting
"Hello Redis"
# ตั้ง TTL (หมดอายุใน 60 วินาที)
127.0.0.1:6379> SET session:abc123 "user_data" EX 60
OK
127.0.0.1:6379> TTL session:abc123
(integer) 58
# ใช้ Hash
127.0.0.1:6379> HSET user:1001 name "Somchai" email "[email protected]"
(integer) 2
127.0.0.1:6379> HGETALL user:1001
1) "name"
2) "Somchai"
3) "email"
4) "[email protected]"
# ดูข้อมูลเซิร์ฟเวอร์
127.0.0.1:6379> INFO server
127.0.0.1:6379> INFO memory
127.0.0.1:6379> INFO stats
ปรับแต่ง Performance
TCP Backlog และ Connection
# redis.conf
tcp-backlog 511 # ขนาด TCP Backlog Queue
timeout 300 # ปิด Connection ที่ Idle เกิน 300 วินาที (0=ไม่ปิด)
tcp-keepalive 300 # ส่ง TCP Keepalive ทุก 300 วินาที
# ตั้งค่า OS — เพิ่ม TCP Backlog
echo "net.core.somaxconn=1024" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
ปิด Transparent Huge Pages
Redis แนะนำให้ปิด Transparent Huge Pages (THP) เพราะทำให้เกิด Latency Spike ระหว่าง Fork Process สำหรับ RDB/AOF
# ปิด THP ชั่วคราว
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# ปิดถาวร — เพิ่มใน /etc/rc.local หรือสร้าง systemd service
cat <<EOF | sudo tee /etc/systemd/system/disable-thp.service
[Unit]
Description=Disable Transparent Huge Pages
Before=redis-server.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable disable-thp
Overcommit Memory
# Redis ใช้ Fork สำหรับ Background Save ซึ่งต้องการ Overcommit Memory
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# ถ้าไม่ตั้งค่านี้ Background Save อาจล้มเหลวเมื่อ Memory ใช้มาก
เชื่อมต่อจากแอปพลิเคชัน
Python
# ติดตั้ง redis-py
pip install redis
# เชื่อมต่อ
import redis
r = redis.Redis(
host='127.0.0.1',
port=6379,
password='YourStrongPassword123!',
db=0,
decode_responses=True
)
# ใช้งาน
r.set('name', 'Somchai')
print(r.get('name')) # Somchai
# ใช้ Connection Pool
pool = redis.ConnectionPool(
host='127.0.0.1',
port=6379,
password='YourStrongPassword123!',
max_connections=20
)
r = redis.Redis(connection_pool=pool)
Node.js
// ติดตั้ง ioredis
// npm install ioredis
const Redis = require('ioredis');
const redis = new Redis({
host: '127.0.0.1',
port: 6379,
password: 'YourStrongPassword123!',
db: 0,
retryStrategy(times) {
return Math.min(times * 50, 2000);
}
});
// ใช้งาน
await redis.set('name', 'Somchai');
const name = await redis.get('name');
console.log(name); // Somchai
PHP
// ติดตั้ง phpredis extension
// sudo apt install php-redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('YourStrongPassword123!');
$redis->set('name', 'Somchai');
echo $redis->get('name'); // Somchai
// หรือใช้ Predis (Pure PHP)
// composer require predis/predis
จัดการ Redis ด้วย systemd
# คำสั่งจัดการ Redis Service
sudo systemctl start redis-server
sudo systemctl stop redis-server
sudo systemctl restart redis-server
sudo systemctl reload redis-server # Reload Configuration
sudo systemctl status redis-server
sudo systemctl enable redis-server # เปิดอัตโนมัติเมื่อ Boot
# ดู Log
sudo journalctl -u redis-server -f
# ถ้าติดตั้งจาก Source ต้องสร้าง systemd unit เอง
cat <<EOF | sudo tee /etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable redis
Benchmark ทดสอบประสิทธิภาพ
# ใช้ redis-benchmark ทดสอบ
redis-benchmark -h 127.0.0.1 -p 6379 -a YourStrongPassword123! -q
# ทดสอบเฉพาะคำสั่ง SET/GET ด้วย 50 Client พร้อมกัน
redis-benchmark -h 127.0.0.1 -p 6379 -a YourStrongPassword123! \
-t set,get -c 50 -n 100000 -q
# ตัวอย่างผลลัพธ์:
# SET: 120000.00 requests per second
# GET: 130000.00 requests per second
# ทดสอบด้วย Pipeline (ส่งหลายคำสั่งพร้อมกัน)
redis-benchmark -h 127.0.0.1 -p 6379 -a YourStrongPassword123! \
-t set -c 50 -n 100000 -P 16 -q
Backup และ Restore
# สั่ง Backup ด้วยตนเอง (สร้าง RDB Snapshot ทันที)
redis-cli -a YourStrongPassword123! BGSAVE
# ตรวจสอบสถานะ Backup
redis-cli -a YourStrongPassword123! LASTSAVE
# ไฟล์ RDB อยู่ที่ (ตามค่า dir ใน redis.conf)
ls -la /var/lib/redis/dump.rdb
# สำรอง RDB ไปที่อื่น
sudo cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +%Y%m%d).rdb
# Restore — วางไฟล์ dump.rdb กลับไปที่ dir แล้ว Restart
sudo systemctl stop redis-server
sudo cp /backup/redis/dump_20260407.rdb /var/lib/redis/dump.rdb
sudo chown redis:redis /var/lib/redis/dump.rdb
sudo systemctl start redis-server
# Script สำรองอัตโนมัติ (ใส่ใน Cron)
# 0 */6 * * * /usr/local/bin/redis-cli -a Password BGSAVE && sleep 5 && cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +\%Y\%m\%d_\%H).rdb
Troubleshooting ปัญหาที่พบบ่อย
ปัญหาแรกที่พบบ่อยคือ Redis ไม่ยอมรับการเชื่อมต่อจากภายนอก สาเหตุมักเกิดจาก bind ตั้งเป็น 127.0.0.1 เท่านั้น แก้โดยเพิ่ม IP ของเซิร์ฟเวอร์ในค่า bind และตรวจสอบว่า protected-mode ปิดอยู่หรือตั้ง Password แล้ว ร่วมกับเปิด Firewall พอร์ต 6379
ปัญหาที่สองคือ Memory ใช้มากเกินไป ตรวจสอบด้วยคำสั่ง INFO memory ดูค่า used_memory_human และ maxmemory ถ้าไม่ได้ตั้ง maxmemory Redis จะใช้ Memory ไปเรื่อย ๆ จนกว่า OS จะ Kill Process ด้วย OOM Killer ควรตั้ง maxmemory และ maxmemory-policy ให้เหมาะสม
ปัญหาที่สามคือ BGSAVE ล้มเหลวเมื่อ Memory ใช้มาก เกิดจาก Fork Process ต้องการ Memory เพิ่มแต่ OS ไม่อนุญาต แก้โดยตั้ง vm.overcommit_memory=1 ตามที่อธิบายในหัวข้อ Performance
สรุป
Redis เป็นเครื่องมือที่ทรงพลังสำหรับจัดการข้อมูลแบบ In-Memory การติดตั้งบน VPS ไม่ยุ่งยากแต่ต้องใส่ใจเรื่องความปลอดภัยเป็นพิเศษ โดยเฉพาะการตั้ง Password, จำกัด Bind Address, ตั้งค่า Firewall และปิดคำสั่งอันตราย สำหรับ Production ควรเปิด Persistence ทั้ง RDB และ AOF, ตั้ง maxmemory ให้เหมาะกับ RAM ที่มี, ปิด THP และตั้ง Overcommit Memory เพื่อให้ Background Save ทำงานได้ราบรื่น และควรมี Backup อัตโนมัติอย่างสม่ำเสมอ
แนะนำบริการ DE
การรัน Redis บนเซิร์ฟเวอร์ของตัวเองให้ประสิทธิภาพสูงสุดต้องการ VPS ที่มี RAM เพียงพอและ SSD ที่เร็ว Cloud VPS ของ DE มาพร้อม SSD NVMe และ RAM ที่สเกลได้ตามต้องการ เหมาะสำหรับรัน Redis ทั้งแบบ Standalone และ Cluster
สำหรับผู้ที่ต้องการโฮสต์เว็บแอปพลิเคชันที่ใช้ Redis เป็น Cache โดยไม่ต้องจัดการเซิร์ฟเวอร์เอง Cloud Hosting ของ DE เป็นอีกทางเลือกที่สะดวกพร้อมระบบจัดการที่ใช้งานง่าย

