Coding Gun

Cache ข้อมูลลง Redis ด้วย Python

Caching คือการนำข้อมูลที่ถูกใช้บ่อยๆมาเก็บไว้ใน Storage ที่สามารถอ่านเขียนได้อย่างรวดเร็วเพื่อให้ประสิทธิภาพของระบบโดยรวมดีขึ้น(ช่วยให้ดึงข้อมูลได้เร็วขึ้น)

ในบทความนี้เราจะพาไปดูวิธีการ Cache ด้วย Redis

การ Cache ด้วย Python

ในบทความนี้เราจะยกตัวอย่างการ Cache ข้อมูลลงไปใน Redis Database ด้วย Python

  1. เราต้องติดตั้ง Library ชื่อว่า Redis เข้ามาก่อน ด้วยคำสั่ง

    $ pip install redis
    
  2. หลังจากนั้น 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")
    
  3. ถ้าต้องการ Set ต่าลงไปใน Redis เราจะเขียน Code แบบนี้

    r.set('name', 'John')
    
  4. ถ้าต้องการ Get ค่าใน Cache ออกมาเราจะใช้คำสั่ง

    r.get('name')
    
  5. ถ้าต้องการกำหนดเวลาหมดอายุ(Time to Live:TTL) ของข่้อมูล เช่นต้องการให้ข้อมูลที่เข้าไปนี้ถูกลบออกไปโดยอัตโนมัติหลังจากผ่านไป 5 นาที เราจะเขียน Code แบบนี้

    r.expire('name', 5 * 60)
    
  6. ถ้าต้องการให้ Set ข้อมูลเข้าไปพร้อมกับ Expire เราจะใช้คำสั่ง

    r.setex('name', 'John', 5 * 60)
    
  7. ถ้าต้องการลบ Key ที่ไม่ได้ใช้ออกให้ใช้คำสั่ง

    r.delete('name')
    

เก็บข้อมูลเป็น Hash

การเก็บข้อมูลโดยใช้ Datatype เป็น Hash จะเหมือนเป็นการเก็บ Json Object ลงไป ซึ่งใน Python จะมี Datatype ที่เป็น Dict ที่จะสามารถส่งเข้าไปเก็บเป็น Hash ได้พอดี

ตัวอย่างการ Cache Data

ในตัวอย่างนี้จะเป็นการ Cache ข้อมูลโดยที่เราจะสร้าง API ขึ้นมาด้วย Flask แล้วหลังจากนั้นเราจะ Cache Data ในตอนที่ดึงข้อมูลออกมาจาก Database แทนที่เราจะต้องดึงข้อมูลจาก Database ตลอดเวลาเราจะลดเวลาในการดึงข้อมูลด้วยการดึงข้อมูลจาก Redis แทนการดึงข้อมูลจาก Database

Redis Cache

สร้าง API

ตัวอย่าง Code นี้จะเป็นการสร้าง API ขึ้นมาด้วย Flask โดยจะใช้ฟังก์ชั่น fetch_user_data() ในการดึงข้อมูลออกมา

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/api/users/<user_id>', methods=['GET'])
def get_user(user_id):
    # Code สำหรับดึง Data มาจาก Database ปลายทาง
    user_data = fetch_user_data(user_id)
    return jsonify(user_data)

if __name__ == '__main__':
    app.run()

เข้าไปทดสอบการทำงานของ API โดยเข้าไปที่ http://localhost:5000/api/users/1

Caching ด้วย Redis

ถ้าไม่มี Cache เราจะต้องดึงข้อมูลจาก Database ตรงๆตลอด แต่พอเราเพิ่ม Cache เข้ามาเราจะใช้คำสั่ง r.get() และ r.set() ในการดึงข้อมูลออกมาจาก Cache และเพิ่มข้อมูลลงไปใน Cache

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def fetch_user_data(user_id):
    user = r.get(user_id)
    if user is None:
        # ดึงข้อมูลจาก Database โดยใช้ Primary Key
        user = User.query.get(user_id)
        # กำหนด Key เป็น user_id
        # Value เป็น user ที่ถูก Serialize เป็น String
        # กำหนด TTL เป็น 1 ชั่วโมง
        r.setex(user_id, json.dumps(user), 60 * 60)
    return user

ในตัวอย่างนี้เราจะดึง user_data จาก API ที่ได้เตรียมไว้ในขั้นตอนแรกและทำการตรวจสอบว่า r.get() ได้ข้อมูลมาหรือไม่ ถ้าไม่มีแสดงว่ายังไม่เคย Cache ดังนั้นเราจะใช้คำสั่ง r.set() เพื่อ Save ข้อมูลที่ได้จาก API ลงไปใน Cache

Best Practices

การใช้งาน Redis จะมีข้อควรระวังดังนี้

  1. ระวังจะกำหนด TTL สั้นเกินไป ข้อมูลจะหายไปก่อนถูกเรียกใช้งาน
  2. ต้อง check ค่าที่ return ออกมาจาก r.expire() ถ้า return False จะหมายถึงไม่มีข้อมูลนั้นอยู่ใน Cache

การใช้งาน Redis อย่างปลอดภัย

  1. ต้องมีการ Enable Authentication และต้องใช้ Password ที่มีความแข็งแรง
  2. ต้องมีการ encryption ข้อมูลที่เป็น Sensitive Data
Phanupong Permpimol
Follow me