ASP.NET Core Web Api and Azure Cache for Redis
ในวันนี้ ผมจะมาสาธิต การนำ Redis มาใช้เก็บ Data Cache ใน ASP.NET Core Web Api โดยใช้บริการหนึ่งของ Azure ได้แก่ Azure Cache for Redis ซึ่งมีเนื้อหา ดังต่อไปนี้ โดยคุณสามารถ clone source code ที่อธิบายในบทความนี้ ได้จากที่นี่
Redis คืออะไร, มีให้บริการใน Azure อย่างไรบ้าง
Redis คือ data structure store ที่ถูกเก็บอยู่ในหน่วยความจำ ซึ่งเมื่อเป็นแบบนั้น ทำให้การเข้าถึงข้อมูลดังกล่าวทำได้เร็วมาก โดยมันถูกนำมาใช้ประโยชน์ในหลากหลายรูปแบบ ได้แก่ database, cache, streaming engine, and message broker โดยในบทความนี้ เราจะนำเสนอการนำมาใช้เป็น data cache
เราสามารถใช้งาน Redis บน Azure ได้ในหลายแบบ โดยเมื่อคุณลองค้นหา redis ดูใน Azure Market Place จะพบผลการค้นหา ตามรูปด้านล่าง
ในบทความนี้ เราจะกล่าวถึง Azure Cache for Redis โดยคุณสามารถศึกษาเพิ่มเติมอย่างละเอียดได้จาก บทความจาก Microsoft https://docs.microsoft.com/en-us/azure/azure-cache-for-redis/cache-overview
การสร้าง Azure Cache for Redis
เราสามารถสร้าง Azure Cache for Redis ขึ้นมาใหม่ ตามขั้นตอนดังต่อไปนี้ เริ่มต้นจากการ สร้าง resource ใหม่ แล้วกดตามลูกศรบอก
กรอกรายละเอียดทีละหน้าจอ
ในหัวข้อ Network connectivity จะเป็นรูปแบบการเปิดให้บริการว่า จะเป็นแบบใด ถ้าเป็น public endpoint จะหมายความว่า สามารถเข้าถึงจากภายนอกได้ แต่ถ้าเป็นตัวเลือกอื่น จะแตกต่างออกไป ในการใช้งานจริง ผมแนะนำให้ใช้ private endpoint จะดีกว่า แต่ในบทความนี้ เราจะใช้เป็น public endpoint เพื่อให้โปรแกรมของเราที่ local สามารถเข้าถึงบริการได้
ให้สังเกตุที่ tab Advance โดยทั่วไป Redis จะให้บริการอยู่ 2 port ได้แก่
Non-TLS port = 6379 ในข้อนี้ จะไม่ใช่ default จาก azure ถ้าคุณติกเลือก จะหมายความว่า เปิดการทำงานที่พอท 6379 ซึ่งจะไม่มีการเข้ารหัสข้อมูลที่เข้าและออกจาก redis
TLS port = 6380 ในข้อนี้ จะเป็น default จาก azure ที่ให้บริการอยู่แล้ว, ข้อมูลที่วิ่งเข้าออกจาก redis จะถูกเข้ารหัส จึงทำให้มีความปลอดภัย
สำหรับ redis version แนะนำให้เลือก 6
เมื่อทุกอย่างพร้อมแล้ว ให้กด create ที่ด้านล่าง
หลังจากกด create ผมพบว่า มันใช้เวลา 5–10 นาที ในการสร้าง service นี้ขึ้นมา เมื่อรอจนเสร็จ มันก็จะพร้อมใช้งาน ในทันที
เริ่มต้นพัฒนาและทดลองบน Local machine
ในการเริ่มต้น ขอให้ท่าน clone source code มาจากที่นี่ก่อน
ก่อนที่เราจะเริ่มใช้งาน Redis บน Cloud เราจำเป็นต้องพัฒนา software บนเครื่องของเราให้เรียบร้อยก่อน โดยระหว่างการพัฒนานี้ เพื่อความง่าย ผมแนะนำให้ เปิด redis ไว้ในเครื่องตัวเอง โดยใช้ docker-compose ที่มีอยู่ใน soure code ดังนี้ (อนึ่ง ให้สังเกตุว่า ผม expose port 6379 -> 6479 เพราะว่า ในเครื่องผมมีลง redis for window เอาไว้ ซึ่งมันยึด port 6379 ไปแล้ว, แต่ในบทความนี้ ผมอยากเสนอเป็น docker มากกว่า เพราะจะได้ทำได้ทุก OS)
หลังจากนั้น ให้สังเกตุที่ appsetting มันจะมี Connection String สำหรับเชื่อมต่อกับ Redis ที่รันผ่าน docker-compose อยู่ โดยผมเชื่อมต่อไปที่ port 6479 นะครับ เราก็สั่ง dotnet run ได้เลย
เมื่อคุณรันโปรแกรมแล้ว ให้คุณลองเข้า URL นี้ผ่าน browser
https://localhost:7093/api/DemoCache/GetStockById?stockId=aaa
เมื่อคุณเข้ามาครั้งแรก สังเกตุว่า เวลาในการเข้าถึงจะใช้เวลา 1 วินาที กว่าๆ
หลังจากเข้าอีกครั้งหนึ่ง จะพบว่า เวลาลดเหลือแค่ ไม่ถึงเสี้ยววิ แล้ว เนื่องจาก การโหลดข้อมูลครั้งต่อมา มันดึงข้อมูลมาจาก cache บน redis
เรามาลอง รีวิว code กันคร่าวๆ สิ่งที่มันทำ ก็คือง่ายๆว่า มันไปหาว่า ใน redis มีการเก็บข้อมูล stock ตามคีร์ที่ส่งเข้ามาหรือไม่ ถ้าไม่มี มันจะไปโหลดข้อมูลจาก database จำลอง มายัดใส่ไว้ใน redis ก่อน โดยมันจะใช้เวลา 1 วินาทีในการโหลดดังกล่าว จากนั้น เมื่อขอข้อมูลผ่าน api มาอีกครั้งหนึ่ง มันก็จะไปดึงข้อมูลจาก cache มาแทน
ในการตรวจสอบว่า ใน redis เก็บข้อมูลอะไรไว้บ้าง เราจะตรวจสอบผ่าน Redis CLI
การติดตั้ง Redis CLI เพื่อตรวจสอบ keys และ value ใน Redis
คุณสามารถติดตั้ง Redis CLI ได้ 2 วิธี
(1) วิธีแรกคือ ติดตั้ง Redis ลงบน OS ของคุณไปเลย ซึ่งจะแตกต่างกันไปตามแต่ละ OS โดยศึกษาขั้นตอนจากที่นี่ https://redis.io/docs/getting-started/ ซึ่งหลังจาก ติดตั้งด้วยวิธีนี้ ให้รันคำสั่งนี้ (สำหรับ window ให้ set path ไปที่ ที่ติดตั้ง redis ไว้ก่อนด้วย นะคับ)
redis-cli -h 127.0.0.1 -a yourpasswordforredis -p 6479
(2) วิธีที่สองคือ การติดตั้งแบบที่ ไม่ต้องติดตั้ง Redis บนเครื่องของคุณ ซึ่งทำได้ตามวิธีใน URL นี้ https://redis.com/blog/get-redis-cli-without-installing-redis-server/
rdcli -h 127.0.0.1 -a yourpasswordforredis -p 6479
หลังจากนั้น ทดลองพิมพ์คำสั่งต่างๆ ตามรูป เพื่อตรวจสอบ keys และ value ดังนี้
อธิบาย คำสั่งข้างต้น
keys * => มันคือ คำสั่งที่แสดงรายการ keys ทั้งหมดที่มีออกมา
type aaa => มันคือ คำสั่งที่แสดงประเภทของข้อมูลที่เก็บในคีร์ ดังกล่าว
โดย แต่ละประเภทข้อมูล จะมีวิธีการเรียกดูข้อมูล ที่แตกต่างกัน ดังนี้
for “string”: get <key>
for “hash”: hgetall <key>
for “list”: lrange <key> 0 -1
for “set”: smembers <key>
for “zset”: zrange <key> 0 -1 withscores
ซึ่งในตัวอย่างในรูป มันคือ hash ดังนั้น เราจึงใช้คำสั่งดังนี้ ในการแสดงข้อมูลมันออกมา
hgetall aaa
ทดลองเก็บ cache ลงใน Azure Cache for Redis
หลังจากทำความเข้าใจ และทำลองรันใน local จนผ่านแล้ว เรามาลองบน cloud กันบ้าง โดยให้ทำการเข้าเมนู Access Keys ใน azure จากนั้น copy ค่าในกรอบแดงออกมา
จากนั้น นำค่าดังกล่าว มาใส่ใน appsettings ตามตัวอย่างในกรอบแดง แล้วสั่ง dotnet run อีกครั้ง
โดยคราวนี้ มันจะไปเก็บ cache ลงใน Azure Cache for Redis แล้ว
การตรวจสอบ Cache ที่เก็บใน Redis บน Azure
อ้างอิงจาก บทความของ microsoft
https://docs.microsoft.com/en-us/azure/azure-cache-for-redis/cache-how-to-redis-cli-tool
มันมี 2 วิธี คือ การเปิด non-TLS port (ซึ่งค่อนข้างบาปกรรม ถ้าเปิดใช้ใน production) และการใช้ stunnel
อย่างไรก็ตาม น่าจะเป็น เวรกรรม บางอย่างของผม ที่ผมทำการเปิดใช้ stunnel แล้ว แต่มันก็ยังไม่สามารถ เข้าถึง cache บน azure ได้ T_T และเนื่องจากบทความนี้ เป็นการสาธิตเท่านั้น ผมจึงขออนุญาต ใช้วิธีเปิด non-TLS port เพื่อตรวจสอบมันนะคับ วิธีการเปิด ก็ทำดังนี้
จากนั้น ลองใช้ redis cli เพื่อเข้าไปตรวจ ดังนี้
จดคีร์อันนี้ ออกมา
จากนั้นนำมาใส่ตรง <key> ในคำสั่ง ดังนี้
rdcli -h azureredisdemo02.redis.cache.windows.net -a <key> -p 6379
เมื่อตรวจสอบเสร็จแล้ว ก็อย่าลืมไปปิด non-TLS port นะครับ โดยผมสังเกตุว่า ค่าใน cache มันไม่ได้หายไป เมื่อเปิด หรือปิด non-TLS port แสดงว่า น่าจะ ไม่มีการ restart Redis จากขั้นตอนนี้