Cache ข้อมูลลง Redis ด้วย Python
Caching คือการนำข้อมูลที่ถูกใช้บ่อยๆมาเก็บไว้ใน Storage ที่สามารถอ่านเขียนได้อย่างรวดเร็วเพื่อให้ประสิทธิภาพของระบบโดยรวมดีขึ้น(ช่วยให้ดึงข้อมูลได้เร็วขึ้น)
ในบทความนี้เราจะพาไปดูวิธีการ Cache ด้วย Redis
การ Cache ด้วย Python
ในบทความนี้เราจะยกตัวอย่างการ Cache ข้อมูลลงไปใน Redis Database ด้วย Python
-
เราต้องติดตั้ง Library ชื่อว่า Redis เข้ามาก่อน ด้วยคำสั่ง
$ pip install redis
-
หลังจากนั้น Connect ไปที่ Redis Server ด้วย Code แบบนี้
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True)
decode_response=True หมายถึง เมื่อได้รับ Response มาจาก Redis(ฺจะเป็น Binary) Redis Library จะทำการ Decode เป็น Utf-8 ให้โดยอัตโนมัติ
ถ้าต้องการ Connect ไปยัง Redis ที่ได้มีการ Enable Authentication ไว้(ซึ่งควรจะต้องมี) เราจะใส่ Username และ Password เข้าไปแบบนี้
import redis r = redis.Redis(host='localhost', port=6380, username='demo', password='strongpassword', decode_responses=True)
ถ้าเราต้องการ Connect Redis ด้วย TLS Protocol(มีการเข้ารหัสระหว่างเดินทาง) เราจะใช้
import redis r = redis.Redis(host='localhost', port=6666, ssl=True, ssl_cert_reqs="none")
-
ถ้าต้องการ Set ต่าลงไปใน Redis เราจะเขียน Code แบบนี้
r.set('name', 'John')
-
ถ้าต้องการ Get ค่าใน Cache ออกมาเราจะใช้คำสั่ง
r.get('name')
-
ถ้าต้องการกำหนดเวลาหมดอายุ(Time to Live:TTL) ของข่้อมูล เช่นต้องการให้ข้อมูลที่เข้าไปนี้ถูกลบออกไปโดยอัตโนมัติหลังจากผ่านไป 5 นาที เราจะเขียน Code แบบนี้
r.expire('name', 5 * 60)
-
ถ้าต้องการให้ Set ข้อมูลเข้าไปพร้อมกับ Expire เราจะใช้คำสั่ง
r.setex('name', 'John', 5 * 60)
-
ถ้าต้องการลบ Key ที่ไม่ได้ใช้ออกให้ใช้คำสั่ง
r.delete('name')
เก็บข้อมูลเป็น Hash
การเก็บข้อมูลโดยใช้ Datatype เป็น Hash จะเหมือนเป็นการเก็บ Json Object ลงไป ซึ่งใน Python จะมี Datatype ที่เป็น Dict ที่จะสามารถส่งเข้าไปเก็บเป็น Hash ได้พอดี
- ถ้าต้องการ Set ค่าลงไปใน Redis เราจะใช้คำสั่ง
r.hset('user-session:123', mapping={ 'name': 'John', "surname": 'Doe', "age": 35 })
- และถ้าเราต้องการดึงค่าที่เก็บไว้ใน Cache ออกมาเราจะใช้คำสั่ง
ผลลัพธ์จะออกมาเป็น
r.hgetall('user-session:123')
{'surname': 'Doe', 'name': 'John', 'age': '35'}
ตัวอย่างการ Cache Data
ในตัวอย่างนี้จะเป็นการ Cache ข้อมูลโดยที่เราจะสร้าง API ขึ้นมาด้วย Flask แล้วหลังจากนั้นเราจะ Cache Data ในตอนที่ดึงข้อมูลออกมาจาก Database แทนที่เราจะต้องดึงข้อมูลจาก Database ตลอดเวลาเราจะลดเวลาในการดึงข้อมูลด้วยการดึงข้อมูลจาก Redis แทนการดึงข้อมูลจาก Database
สร้าง API
ตัวอย่าง Code นี้จะเป็นการสร้าง API ขึ้นมาด้วย Flask โดยจะใช้ฟังก์ชั่น fetch_user_data()
ในการดึงข้อมูลออกมา
|
|
เข้าไปทดสอบการทำงานของ API โดยเข้าไปที่ http://localhost:5000/api/users/1
Caching ด้วย Redis
ถ้าไม่มี Cache เราจะต้องดึงข้อมูลจาก Database ตรงๆตลอด แต่พอเราเพิ่ม Cache เข้ามาเราจะใช้คำสั่ง r.get()
และ r.set()
ในการดึงข้อมูลออกมาจาก Cache และเพิ่มข้อมูลลงไปใน Cache
|
|
ในตัวอย่างนี้เราจะดึง user_data จาก API ที่ได้เตรียมไว้ในขั้นตอนแรกและทำการตรวจสอบว่า r.get()
ได้ข้อมูลมาหรือไม่ ถ้าไม่มีแสดงว่ายังไม่เคย Cache ดังนั้นเราจะใช้คำสั่ง r.set()
เพื่อ Save ข้อมูลที่ได้จาก API ลงไปใน Cache
Best Practices
การใช้งาน Redis จะมีข้อควรระวังดังนี้
- ระวังจะกำหนด TTL สั้นเกินไป ข้อมูลจะหายไปก่อนถูกเรียกใช้งาน
- ต้อง check ค่าที่ return ออกมาจาก
r.expire()
ถ้า return False จะหมายถึงไม่มีข้อมูลนั้นอยู่ใน Cache
การใช้งาน Redis อย่างปลอดภัย
- ต้องมีการ Enable Authentication และต้องใช้ Password ที่มีความแข็งแรง
- ต้องมีการ encryption ข้อมูลที่เป็น Sensitive Data