Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

Redis เป็นที่เก็บข้อมูลที่เก็บข้อมูลไว้ในหน่วยความจำเป็นหลัก เร็วกว่าฐานข้อมูลแบบเดิม และได้รับความนิยมเพิ่มมากขึ้น

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้พื้นฐานการทำงานของ Redis เมื่อใดที่ควรใช้งาน วิธีติดตั้งบนอุปกรณ์ของคุณ และวิธีการใช้เป็นระบบแคชในเว็บแอปพลิเคชัน PHP

เรดิสคืออะไร?

Redis เป็นที่เก็บข้อมูล – เช่นเดียวกับฐานข้อมูล แต่เป็นที่จัดเก็บข้อมูลในหน่วยความจำเป็นหลัก ทำให้เร็วกว่าฐานข้อมูลแบบเดิมที่เก็บข้อมูลไว้ในดิสก์มาก เนื่องจากความเร็วนี้ Redis จึงมักถูกใช้เป็นเครื่องมือแคช

Redis สามารถจัดเก็บข้อมูลในรูปแบบข้อมูลใดก็ได้ เนื่องจากใช้ระบบคู่คีย์-ค่าในการจัดเก็บข้อมูล สิ่งนี้ไม่เหมือนกับฐานข้อมูลแบบเดิมที่ใช้เอกสารหรือแถว

คุณอาจนึกถึงฐานข้อมูล Redis ว่าเป็นออบเจ็กต์ JSON ขนาดใหญ่ โดยที่ทุกอย่างในฐานข้อมูลเป็นคู่คีย์-ค่า ซึ่งหมายความว่าอาจไม่ใช่ที่ที่ดีที่สุดในการจัดเก็บข้อมูลที่มีโครงสร้าง

คุณยังสามารถใช้ Redis เป็นฐานข้อมูลได้ เนื่องจากมีความสามารถในการเขียนข้อมูลลงดิสก์เพื่อความคงอยู่ คุณสามารถกำหนดค่า Redis ให้คงข้อมูลไว้เป็นระยะๆ หรือหลังจากทุกคำสั่งที่คุณออก เมื่อไม่ได้กำหนดค่า Redis ให้คงข้อมูลไว้ จะมีความผันผวนอย่างมาก และระบบล่มจะส่งผลให้ข้อมูลสูญหาย

Redis ได้รับความนิยมในแอปพลิเคชันระดับการผลิตและถูกใช้โดยบริษัทขนาดใหญ่ เช่น Twitter, Github, SnapChat และ StackOverFlow

  • สำหรับรหัสผ่านแบบใช้ครั้งเดียว (OTP):รหัสผ่านเหล่านี้มักจะสร้างขึ้นเพื่อใช้เพียงครั้งเดียวและมีอายุการใช้งานสั้น ด้วยความสามารถของ Redis ในการกำหนดวันหมดอายุของข้อมูล คุณสามารถจัดเก็บ OTP ได้อย่างปลอดภัยโดยไม่ต้องกังวลกับการลบออกหลังจากช่วงระยะเวลาหนึ่ง
  • สำหรับทรัพยากรที่เข้าถึงบ่อย:สำหรับข้อมูลที่ไม่เปลี่ยนแปลงบ่อยเกินไปแต่มีการเข้าถึงบ่อย คุณสามารถใช้ Redis เพื่อประหยัดเวลาที่จะใช้ในการสืบค้นฐานข้อมูลหรือทำการเรียกบริการภายนอกบางอย่าง
  • สำหรับการสืบค้นที่มีงานหนัก:สำหรับการสืบค้นฐานข้อมูลที่ต้องใช้เวลาและจะไม่เปลี่ยนแปลงบ่อยเกินไป ให้ใช้ Redis เพื่อลดเวลานี้โดยการจัดเก็บผลลัพธ์ไว้นานเท่าที่คุณต้องการ

วิธีการติดตั้ง Redis

คุณสามารถติดตั้ง Redis บนระบบปฏิบัติการใดก็ได้ ต่อไปนี้เป็นคำแนะนำสำหรับ macOS, ระบบย่อย Windows สำหรับ Linux และ Linux

macOS

หากต้องการติดตั้ง Redis บน macOS ให้เรียกใช้:

brew install redis

จากนั้น รันคำสั่งนี้เพื่อเริ่ม Redis:

redis-server

ระบบย่อย Windows สำหรับ Linux และ Linux

Redis ยังไม่รองรับระบบปฏิบัติการ Windows อย่างแน่นอน ดังนั้นคุณจึงสามารถติดตั้ง WSL (ระบบย่อย Windows สำหรับ Linux) บน windows เพื่อให้มีสภาพแวดล้อม Linux ได้

หากต้องการติดตั้ง Redis บน Linux ให้รัน:

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-get update
sudo apt-get install redis

จากนั้น รันคำสั่งนี้เพื่อเริ่ม Redis:

sudo service redis-server start

เมื่อติดตั้ง Redis แล้ว คุณสามารถทดสอบได้ด้วยการเรียกใช้ 03 . สิ่งนี้จะส่งออก "PONG" . เช่นนี้:

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ การทดสอบการติดตั้ง Redis

ข้อมูลเบื้องต้นเกี่ยวกับ Redis

หากต้องการใช้ Redis เป็น REPL หรือเป็นแอปพลิเคชันแบบสแตนด์อโลน ให้เรียกใช้ 12 . มันจะเปิดสภาพแวดล้อม REPL

วิธีการตั้งค่าข้อมูล

ใช้ 25 คำหลักเพื่อตั้งค่าคู่ค่าคีย์ใน Redis หากต้องการตั้งค่า 34 คีย์ไปที่ค่า 49 ให้รันสิ่งนี้:

SET username Zubs

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ การตั้งค่าคู่คีย์-ค่า

วิธีรับข้อมูล

เพื่อรับ 53 ที่บันทึกไว้ล่าสุด คีย์ ให้ใช้ 68 คำหลักเช่นนี้:

GET username

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ รับค่าด้วยคีย์

วิธีการลบข้อมูล

คุณยังสามารถลบคีย์ที่เก็บไว้ก่อนหน้านี้ได้โดยใช้ 79 คำหลักเช่นนี้:

DEL username

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ การลบค่าด้วยคีย์

วิธีตรวจสอบว่ามีค่าอยู่หรือไม่

คุณสามารถตรวจสอบการมีอยู่ของคีย์ได้โดยใช้ 88 คำหลัก ส่งคืน 90 เมื่อไม่มีคีย์ และ 101 ถ้ามันเป็นเช่นนั้น คุณสามารถทดสอบได้โดยตรวจสอบว่า 114 ที่ถูกลบล่าสุดหรือไม่ มีกุญแจอยู่ เช่นนี้:

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

วิธีตั้งเวลาใช้ชีวิตเพื่อคีย์

Redis ช่วยให้คุณระบุระยะเวลาที่ควรมีคีย์บางอันเมื่อสร้างคีย์ นี่เป็นคุณสมบัติที่ยอดเยี่ยมอย่างหนึ่งของ Redis เมื่อต้องการทำเช่นนี้ ให้ใช้ 128 คำหลักเช่นนี้:

SETEX key seconds value

คุณสามารถตรวจสอบเวลาที่ใช้งานสำหรับคีย์เฉพาะได้โดยใช้ 138 คำหลัก สิ่งนี้จะส่งกลับ 140 หากคีย์ไม่มีการหมดอายุที่กำหนดไว้ หมายความว่าคีย์นั้นจะถูกเก็บไว้อย่างไม่มีกำหนด ส่งคืน 152 หากไม่มีกุญแจ และจะส่งกลับเวลาเป็นวินาทีหากมีคีย์อยู่

คุณสามารถตั้งเวลาหมดอายุเป็นวินาทีสำหรับคีย์ที่สร้างไว้ก่อนหน้านี้โดยไม่มีเวลาหมดอายุได้โดยใช้ 161 คำหลัก ตัวอย่างเช่น สร้างคีย์เพื่อจัดเก็บตัวแปร 177 ด้วยค่า 180 .

SET age 26

จากนั้นตั้งเวลาหมดอายุไว้ที่ 10 วินาที

EXPIRE age 20

ตรวจสอบเวลาที่เหลืออยู่ซ้ำๆ สองสามครั้งเพื่อดูว่าจริง ๆ แล้วเวลานั้นลดลงอย่างไรและในที่สุดก็ไม่มีอีกต่อไป

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

วิธีสร้างแอปพลิเคชันอย่างง่ายด้วย Redis

เพื่อช่วยให้คุณเข้าใจวิธีการทำงานของ Redis ตอนนี้เราจะสร้างเว็บแอปพลิเคชันพื้นฐานที่ใช้ Redis เพื่อแคชข้อมูลเพื่อให้โหลดการตอบสนองเร็วขึ้น คุณจะสร้างแอปพลิเคชันง่ายๆ ที่ดึงข้อมูลรูปภาพจาก JSONPlaceholder แล้วส่งคืน

สร้างโครงการ PHP ใหม่โดยใช้นักแต่งเพลง

สร้างโฟลเดอร์ใหม่สำหรับโปรเจ็กต์ เปลี่ยนไดเร็กทอรีเป็นโฟลเดอร์ที่สร้างขึ้นใหม่ และรันองค์ประกอบต่อไปนี้เพื่อสร้างโปรเจ็กต์ผู้แต่งใหม่:

composer init -q

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

สิ่งนี้จะสร้าง 193 ใหม่ ไฟล์ที่ควรมีลักษณะดังนี้:

{
 "require": {}
}

จากนั้น สร้างโฟลเดอร์สาธารณะเพื่อจัดเก็บไฟล์โค้ดสาธารณะของคุณ จากนั้นสร้าง 207 ใหม่ ไฟล์ในโฟลเดอร์

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

ใส่เนื้อหาสำเร็จรูปบางส่วนลงในไฟล์ PHP ในตอนนี้และเริ่มเซิร์ฟเวอร์

<?php
echo "Hello World!";
php -S localhost:8080

ติดตั้งเราเตอร์อย่างง่ายและจัดการคำขอ

เพื่อให้โปรเจ็กต์เสร็จสมบูรณ์ ให้ติดตั้งเราเตอร์ PHP แบบธรรมดา 211 และเว็บไคลเอ็นต์ 220 .

composer require altorouter/altorouter guzzlehttp/guzzle

อัปเดต 238 ที่จะมีรหัสนี้:

<?php
// Import composer autoload file
require_once __DIR__ . '/../vendor/autoload.php';
// Import GuzzleHttp Client
use GuzzleHttp\Client;
// Instantiate router and web client
$router = new AltoRouter();
$client = new Client();
// Register Sample route
$router->map('GET', '/', function () {
 // Set response Content-Type
 header('Content-Type: application/json; charset=utf-8');
 // Return basic response
 echo json_encode(['data' => 'Hello World']);
});
/**
 * Route to get all photos
 */
$router->map('GET', '/photos', function () use ($client) {
 // Make request to JSONPlaceholder
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($response->getBody()->getContents())
 ]);
});
/**
 * Route to get single photo by id
 */
$router->map('GET', '/photos/[i:id]', function (int $id) use ($client) {
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($response->getBody()->getContents())
 ]);
});
$match = $router->match();
if( is_array($match) && is_callable( $match['target'] ) ) {
 call_user_func_array( $match['target'], $match['params'] );
} else {
 // no route was matched
 header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}

รหัสนี้ค่อนข้างอธิบายได้ด้วยตนเอง แต่นี่คือรายละเอียดเพื่อความชัดเจน จากบรรทัดที่ 1-11 คลาสที่จำเป็น GuzzleHttp และ AltoRouter จะถูกนำเข้าและสร้างอินสแตนซ์

จากบรรทัดที่ 14-20 เส้นทางแรกได้รับการลงทะเบียน โดยมีการปิดง่ายๆ ที่ส่งคืน "Hello World!" บรรทัดที่ 25-45 ลงทะเบียนอีกสองเส้นทาง หนึ่งเส้นทางดึงรูปภาพทั้งหมด 244 และอีกภาพหนึ่งเพื่อดึงภาพเดียว 256 .

บรรทัดสุดท้ายจำเป็นตามเอกสารประกอบของแพ็คเกจเราเตอร์เพื่อดำเนินการปิดที่กำหนดในการประกาศเส้นทางจริง

คุณสามารถทดสอบเส้นทางเหล่านี้ได้โดยใช้บุรุษไปรษณีย์

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ เส้นทางสวัสดีชาวโลก

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ รับเส้นทางรูปภาพทั้งหมด

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ รับเส้นทางภาพถ่ายเดี่ยว

266 เส้นทางใช้เวลาเฉลี่ย 1,400 มิลลิวินาทีต่อคำขอ 275 ใช้เวลาเฉลี่ย 900ms ต่อคำขอ

ติดตั้งและสร้างอินสแตนซ์ Redis

เวลาเหล่านี้สามารถลดลงได้โดยการแคชผลลัพธ์ของคำขอดั้งเดิมไปยัง JSONPlaceholder จากนั้นส่งคืนการตอบกลับจากแคชแทนที่จะส่งคำขอทุกครั้ง

หากต้องการใช้ Redis กับ PHP ให้ติดตั้งส่วนขยาย PhpRedis ส่วนขยายนี้มี API สำหรับการสื่อสารกับ Redis คุณสามารถติดตั้งได้อย่างง่ายดายโดยใช้คำสั่ง:

pecl install redis

หลังจากการติดตั้ง คุณสามารถใช้คลาสนี้ในโปรเจ็กต์ PHP ของคุณได้ นำเข้าชั้นเรียนและสร้างอินสแตนซ์ที่ด้านบนของ 286 ของคุณ ไฟล์:

$redis = new Redis();
$redis->connect('127.0.0.1');

เมื่อทำสิ่งนี้แล้ว ตอนนี้คุณสามารถใช้ Redis ในโปรเจ็กต์ของคุณได้

วิธีแคชข้อมูลด้วย Redis

จัดเก็บการตอบสนอง JSON แบบดิบที่ส่งคืนจาก JSONPlaceholder ไปยัง Redis โดยมีเวลาหมดอายุ 1 ชั่วโมง (3600 วินาที)

$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
$redis->setex(
 'photos',
 3600,
 $response->getBody()->getContents()
);

ที่นี่ คุณสร้างคีย์ใหม่ที่เรียกว่า 293 ให้เวลาหมดอายุ 1 ชั่วโมง จากนั้นกำหนดการตอบสนองดิบที่ได้รับจาก JSONPlaceholder

แต่ ณ จุดนี้ API ยังคงใช้เวลานานในการตอบสนอง เนื่องจากคุณจัดเก็บเฉพาะการตอบกลับนี้ คุณจึงไม่ได้ใช้ Redis เพื่อส่งคืนการตอบกลับ

เพื่อแก้ไขปัญหานี้ เมื่อมีคำขอใหม่เข้ามา ให้ตรวจสอบว่าคุณมีข้อมูลบางส่วนที่จัดเก็บไว้ในหน่วยความจำก่อนหน้านี้หรือไม่ หากใช่ คุณจะส่งคืนข้อมูลในหน่วยความจำ มิเช่นนั้น คุณจะโทรหา JSONPlaceholder

อัปเดต 302 บล็อกสิ่งนี้:

/**
 * Route to get all photos
 */
$router->map('GET', '/photos', function () use ($client, $redis) {
 // Check if Redis has the key
 if (!$redis->exists('photos')) {
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
 // Store the data for next use
 $redis->setex(
 'photos',
 REDIS_STANDARD_EXPIRY,
 $response->getBody()->getContents()
 );
 }
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($redis->get('photos'))
 ]);
});

การทดสอบในบุรุษไปรษณีย์เพื่อดูการปรับปรุง คุณจะเห็นเวลาตอบสนองโดยเฉลี่ยหลังจากการโทรครั้งแรก (การโทรเดิมก่อนที่จะถูกแคช) ลดลงเหลือเฉลี่ย 20ms สำหรับ 313 เส้นทาง นี่คือการปรับปรุงมากกว่า 50 เท่า Redis ช่วยประหยัดเวลาและพลังงานในการประมวลผลได้มาก

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

อัปเดต 329 เส้นทางเพื่อใช้ Redis ด้วย:

$router->map('GET', '/photos/[i:id]', function (int $id) use ($client, $redis) {
 if (!$redis->exists('photos:' . $id)) {
 $response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
 $redis->setex(
 'photos:' . $id,
 REDIS_STANDARD_EXPIRY,
 $response->getBody()->getContents()
 );
 }
 header('Content-Type: application/json; charset=utf-8');
 echo json_encode([
 'data' => json_decode($redis->get('photos:' . $id))
 ]);
});

332 ขณะนี้เส้นทางเร็วขึ้นมากเช่นกัน เนื่องจากใช้เวลาน้อยกว่า 5 มิลลิวินาทีในการรับการตอบสนอง ซึ่งเพิ่มขึ้นมากกว่า 45 เท่า

การเรียนรู้ Redis สำหรับ PHP:คู่มือปฏิบัติสำหรับการแคชในหน่วยความจำ

สรุป

ฉันหวังว่าคุณจะเข้าใจแล้วว่า Redis คืออะไร พื้นฐานของมัน และวิธีที่คุณสามารถใช้มันเพื่อเพิ่มความเร็วให้กับเว็บแอปพลิเคชัน PHP ของคุณ คุณสามารถค้นหาไฟล์โค้ดที่ใช้ในบทความนี้ได้ที่ GitHub

หากคุณมีคำถามหรือคำแนะนำที่เกี่ยวข้อง โปรดติดต่อฉันเพื่อแบ่งปัน

หากต้องการอ่านบทความของฉันเพิ่มเติมหรือติดตามผลงานของฉัน คุณสามารถเชื่อมต่อกับฉันได้ทาง LinkedIn, Twitter และ Github รวดเร็ว ง่ายดาย และฟรี!

เรียนรู้การเขียนโค้ดฟรี หลักสูตรโอเพ่นซอร์สของ freeCodeCamp ช่วยให้ผู้คนมากกว่า 40,000 คนได้งานในตำแหน่งนักพัฒนา เริ่มต้น