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 ป>
ข้อมูลเบื้องต้นเกี่ยวกับ Redis
หากต้องการใช้ Redis เป็น REPL หรือเป็นแอปพลิเคชันแบบสแตนด์อโลน ให้เรียกใช้ 12 . มันจะเปิดสภาพแวดล้อม REPL
วิธีการตั้งค่าข้อมูล
ใช้ 25 คำหลักเพื่อตั้งค่าคู่ค่าคีย์ใน Redis หากต้องการตั้งค่า 34 คีย์ไปที่ค่า 49 ให้รันสิ่งนี้:
SET username Zubs
การตั้งค่าคู่คีย์-ค่า ป>
วิธีรับข้อมูล
เพื่อรับ 53 ที่บันทึกไว้ล่าสุด คีย์ ให้ใช้ 68 คำหลักเช่นนี้:
GET username
รับค่าด้วยคีย์ ป>
วิธีการลบข้อมูล
คุณยังสามารถลบคีย์ที่เก็บไว้ก่อนหน้านี้ได้โดยใช้ 79 คำหลักเช่นนี้:
DEL username
การลบค่าด้วยคีย์ ป>
วิธีตรวจสอบว่ามีค่าอยู่หรือไม่
คุณสามารถตรวจสอบการมีอยู่ของคีย์ได้โดยใช้ 88 คำหลัก ส่งคืน 90 เมื่อไม่มีคีย์ และ 101 ถ้ามันเป็นเช่นนั้น คุณสามารถทดสอบได้โดยตรวจสอบว่า 114 ที่ถูกลบล่าสุดหรือไม่ มีกุญแจอยู่ เช่นนี้:
วิธีตั้งเวลาใช้ชีวิตเพื่อคีย์
Redis ช่วยให้คุณระบุระยะเวลาที่ควรมีคีย์บางอันเมื่อสร้างคีย์ นี่เป็นคุณสมบัติที่ยอดเยี่ยมอย่างหนึ่งของ Redis เมื่อต้องการทำเช่นนี้ ให้ใช้ 128 คำหลักเช่นนี้:
SETEX key seconds value
คุณสามารถตรวจสอบเวลาที่ใช้งานสำหรับคีย์เฉพาะได้โดยใช้ 138 คำหลัก สิ่งนี้จะส่งกลับ 140 หากคีย์ไม่มีการหมดอายุที่กำหนดไว้ หมายความว่าคีย์นั้นจะถูกเก็บไว้อย่างไม่มีกำหนด ส่งคืน 152 หากไม่มีกุญแจ และจะส่งกลับเวลาเป็นวินาทีหากมีคีย์อยู่
คุณสามารถตั้งเวลาหมดอายุเป็นวินาทีสำหรับคีย์ที่สร้างไว้ก่อนหน้านี้โดยไม่มีเวลาหมดอายุได้โดยใช้ 161 คำหลัก ตัวอย่างเช่น สร้างคีย์เพื่อจัดเก็บตัวแปร 177 ด้วยค่า 180 . ป>
SET age 26
จากนั้นตั้งเวลาหมดอายุไว้ที่ 10 วินาที
EXPIRE age 20
ตรวจสอบเวลาที่เหลืออยู่ซ้ำๆ สองสามครั้งเพื่อดูว่าจริง ๆ แล้วเวลานั้นลดลงอย่างไรและในที่สุดก็ไม่มีอีกต่อไป
วิธีสร้างแอปพลิเคชันอย่างง่ายด้วย Redis
เพื่อช่วยให้คุณเข้าใจวิธีการทำงานของ Redis ตอนนี้เราจะสร้างเว็บแอปพลิเคชันพื้นฐานที่ใช้ Redis เพื่อแคชข้อมูลเพื่อให้โหลดการตอบสนองเร็วขึ้น คุณจะสร้างแอปพลิเคชันง่ายๆ ที่ดึงข้อมูลรูปภาพจาก JSONPlaceholder แล้วส่งคืน
สร้างโครงการ PHP ใหม่โดยใช้นักแต่งเพลง
สร้างโฟลเดอร์ใหม่สำหรับโปรเจ็กต์ เปลี่ยนไดเร็กทอรีเป็นโฟลเดอร์ที่สร้างขึ้นใหม่ และรันองค์ประกอบต่อไปนี้เพื่อสร้างโปรเจ็กต์ผู้แต่งใหม่:
composer init -q
สิ่งนี้จะสร้าง 193 ใหม่ ไฟล์ที่ควรมีลักษณะดังนี้:
{
"require": {}
}
จากนั้น สร้างโฟลเดอร์สาธารณะเพื่อจัดเก็บไฟล์โค้ดสาธารณะของคุณ จากนั้นสร้าง 207 ใหม่ ไฟล์ในโฟลเดอร์
ใส่เนื้อหาสำเร็จรูปบางส่วนลงในไฟล์ 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 . ป>
บรรทัดสุดท้ายจำเป็นตามเอกสารประกอบของแพ็คเกจเราเตอร์เพื่อดำเนินการปิดที่กำหนดในการประกาศเส้นทางจริง
คุณสามารถทดสอบเส้นทางเหล่านี้ได้โดยใช้บุรุษไปรษณีย์
เส้นทางสวัสดีชาวโลก ป>
รับเส้นทางรูปภาพทั้งหมด ป>
รับเส้นทางภาพถ่ายเดี่ยว ป>
เวลาเหล่านี้สามารถลดลงได้โดยการแคชผลลัพธ์ของคำขอดั้งเดิมไปยัง JSONPlaceholder จากนั้นส่งคืนการตอบกลับจากแคชแทนที่จะส่งคำขอทุกครั้ง
หากต้องการใช้ Redis กับ PHP ให้ติดตั้งส่วนขยาย PhpRedis ส่วนขยายนี้มี API สำหรับการสื่อสารกับ Redis คุณสามารถติดตั้งได้อย่างง่ายดายโดยใช้คำสั่ง:
หลังจากการติดตั้ง คุณสามารถใช้คลาสนี้ในโปรเจ็กต์ PHP ของคุณได้ นำเข้าชั้นเรียนและสร้างอินสแตนซ์ที่ด้านบนของ
เมื่อทำสิ่งนี้แล้ว ตอนนี้คุณสามารถใช้ Redis ในโปรเจ็กต์ของคุณได้
จัดเก็บการตอบสนอง JSON แบบดิบที่ส่งคืนจาก JSONPlaceholder ไปยัง Redis โดยมีเวลาหมดอายุ 1 ชั่วโมง (3600 วินาที)
ที่นี่ คุณสร้างคีย์ใหม่ที่เรียกว่า
แต่ ณ จุดนี้ API ยังคงใช้เวลานานในการตอบสนอง เนื่องจากคุณจัดเก็บเฉพาะการตอบกลับนี้ คุณจึงไม่ได้ใช้ Redis เพื่อส่งคืนการตอบกลับ ป>
เพื่อแก้ไขปัญหานี้ เมื่อมีคำขอใหม่เข้ามา ให้ตรวจสอบว่าคุณมีข้อมูลบางส่วนที่จัดเก็บไว้ในหน่วยความจำก่อนหน้านี้หรือไม่ หากใช่ คุณจะส่งคืนข้อมูลในหน่วยความจำ มิเช่นนั้น คุณจะโทรหา JSONPlaceholder
อัปเดต
การทดสอบในบุรุษไปรษณีย์เพื่อดูการปรับปรุง คุณจะเห็นเวลาตอบสนองโดยเฉลี่ยหลังจากการโทรครั้งแรก (การโทรเดิมก่อนที่จะถูกแคช) ลดลงเหลือเฉลี่ย 20ms สำหรับ
อัปเดต
ฉันหวังว่าคุณจะเข้าใจแล้วว่า Redis คืออะไร พื้นฐานของมัน และวิธีที่คุณสามารถใช้มันเพื่อเพิ่มความเร็วให้กับเว็บแอปพลิเคชัน PHP ของคุณ คุณสามารถค้นหาไฟล์โค้ดที่ใช้ในบทความนี้ได้ที่ GitHub
หากคุณมีคำถามหรือคำแนะนำที่เกี่ยวข้อง โปรดติดต่อฉันเพื่อแบ่งปัน
หากต้องการอ่านบทความของฉันเพิ่มเติมหรือติดตามผลงานของฉัน คุณสามารถเชื่อมต่อกับฉันได้ทาง LinkedIn, Twitter และ Github รวดเร็ว ง่ายดาย และฟรี!
เรียนรู้การเขียนโค้ดฟรี หลักสูตรโอเพ่นซอร์สของ freeCodeCamp ช่วยให้ผู้คนมากกว่า 40,000 คนได้งานในตำแหน่งนักพัฒนา เริ่มต้น 266รหัส> เส้นทางใช้เวลาเฉลี่ย 1,400 มิลลิวินาทีต่อคำขอ 275รหัส> ใช้เวลาเฉลี่ย 900ms ต่อคำขอ ป> ติดตั้งและสร้างอินสแตนซ์ Redis
pecl install redis
286 ของคุณ ไฟล์:$redis = new Redis();
$redis->connect('127.0.0.1');
วิธีแคชข้อมูลด้วย Redis
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
$redis->setex(
'photos',
3600,
$response->getBody()->getContents()
);
293 ให้เวลาหมดอายุ 1 ชั่วโมง จากนั้นกำหนดการตอบสนองดิบที่ได้รับจาก JSONPlaceholder302 บล็อกสิ่งนี้:/**
* 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'))
]);
});
313 เส้นทาง นี่คือการปรับปรุงมากกว่า 50 เท่า Redis ช่วยประหยัดเวลาและพลังงานในการประมวลผลได้มาก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 เท่าสรุป