परिचय
<पी> इस लेख में, मैं रेडिस पर चर्चा करने जा रहा हूं और इसे अपने डेटा को संग्रहीत करने के लिए प्राथमिक डेटाबेस के रूप में उपयोग करने के मामलों का उपयोग करूंगा। - रेडिस का परिचय
- रेडिस डेटाटाइप्स
- रेडिस को डीबी के रूप में उपयोग करने के फायदे और नुकसान
- एक कंटेनर में रेडिस स्थापित करना
- .NET 8 वेब एपीआई के साथ प्राथमिक डेटाबेस के रूप में Redis का उपयोग करना।
<पी> पूर्वापेक्षाएँ पी> - विज़ुअल कोड
- .NET 8 SDK
- रेडिस डेस्कटॉप मैनेजर। आप इसे URL(https://redis.io/resources/tools/)
से डाउनलोड कर सकते हैं - डॉकर डेस्कटॉप
- पैकेज
- Microsoft.Extensions.Caching.stackExchangeRedis
- StackExchange.Redis
रेडिस का परिचय
<पी> रेडिस एक इन-मेमोरी डेटास्टोर और की-वैल्यू डेटास्टोर है, और इसका उपयोग ज्यादातर कैशिंग परत के लिए किया जाता है। क्योंकि रेडिस डेटा को मेमोरी में संग्रहीत करता है, यह बहुत तेजी से पढ़ने और लिखने के संचालन की अनुमति देता है जो डेटा तक कम-विलंबता पहुंच के लिए उपयुक्त है। आपके पास प्रश्न होंगे जैसे कि रेडिस डेटा को मेमोरी में संग्रहीत करता है लेकिन जब सिस्टम रीबूट होता है तो हम डेटा खो देंगे। <पी> डेटा दृढ़ता की समस्या को हल करने के लिए, रेडिस विभिन्न तंत्र प्रदान करता है जैसे स्नैपशॉट और केवल-संलग्न फ़ाइलें (AOF). ये तंत्र आपको डिस्क पर डेटा को लगातार संग्रहीत करने की अनुमति देते हैं, यह सुनिश्चित करते हुए कि सिस्टम रिबूट के बाद भी इसे पुनर्प्राप्त किया जा सकता है। आप URL में रेडिस पर्सिस्टेंस के बारे में अधिक जान सकते हैं <पी> अधिकतर रेडिस का उपयोग कैश लेयर के रूप में किया जाता है लेकिन हम इसे जटिल डेटाबेस सिस्टम में अन्य कॉल को कम करने के लिए डेटाबेस के रूप में भी उपयोग कर सकते हैं। रेडिस दस्तावेज़ डेटाबेस मॉडल का उपयोग करता है जहां यह दस्तावेज़ों में डेटा को ज्यादातर JSON प्रारूप में संग्रहीत करता है। आप URL से भी इसके बारे में अधिक जान सकते हैं रेडिस डेटाटाइप्स
<पी> रेडिस मुट्ठी भर डेटा प्रकार प्रदान करता है जो हमें कैशिंग, क्यूइंग और इवेंट प्रोसेसिंग से संबंधित समस्याओं को हल करने की अनुमति देता है। - स्ट्रिंग्स: बाइट्स के अनुक्रम का प्रतिनिधित्व
- सूचियाँ - स्ट्रिंग्स की सूचियाँ
- सेट - अद्वितीय स्ट्रिंग का अव्यवस्थित संग्रह
- हैश - फ़ील्ड-वैल्यू जोड़े के संग्रह के रूप में तैयार किए गए रिकॉर्ड प्रकार
<पी> आप URL से डेटा प्रकारों के बारे में अधिक जानेंगे रेडिस को डीबी के रूप में उपयोग करने के पेशेवर
- उच्च प्रदर्शन
- बहुमुखी डेटा संरचना
- कम विलंबता
- स्केलेबिलिटी
रेडिस को DB के रूप में उपयोग करने के नुकसान
- डेटा टिकाऊपन
- सीमित क्वेरी क्षमताएं
- स्मृति बाधाएँ
एक कंटेनर में रेडिस स्थापित करना
<पी> सुनिश्चित करें कि, डॉकर डेस्कटॉप चल रहा है और विजुअल स्टूडियो 2022 खोलें। <पी> "एक नया प्रोजेक्ट बनाएं" चुनें --> "ASP.NET कोर वेब एपीआई" पर क्लिक करें और फिर "अगला" पर क्लिक करें। <पी> पी> <पी> कॉन्फ़िगर पृष्ठ पर, प्रोजेक्ट का नाम दर्ज करें और फिर "अगला" दबाएँ। <पी>
<पी> अतिरिक्त जानकारी पृष्ठ पर, स्क्रीनशॉट के अनुसार जानकारी चुनें और "बनाएँ" चुनें। <पी>
<पी> अब, हमारे रेडिस के लिए कॉन्फ़िगरेशन को होल्ड करने के लिए "docker-compose.yaml" फ़ाइल बनाएं और नीचे दिए गए कोड को पेस्ट करें।
version: '3.8'
services:
redis:
image: redis:alpine
container_name: redisStudentAPI
ports:
- 6379:6379
<पी> उसके बाद, टूल्स -> कमांड लाइन -> डेवलपर पॉवरशेल से डेवलपर पॉवरशेल प्रॉम्प्ट खोलें। <पी> फिर प्रोजेक्ट फ़ोल्डर के अंदर नेविगेट करें और YAML फ़ाइल "docker compose up -d" को चलाने के लिए कमांड दर्ज करें <पी> पी> <पी> डॉकर डेस्कटॉप खोलें, और कंटेनरों पर नेविगेट करें, आप YAML फ़ाइल से बनाए गए कंटेनर को देख सकते हैं। इसके अलावा, आप चल रहे कंटेनरों को देखने के लिए 'docker ps' चला सकते हैं। <पी>
<पी> पी> <पी> रेडिस सर्वर के साथ इंटरैक्ट करने के लिए, आपको कंटेनर आईडी के साथ नीचे दिए गए कमांड को चलाने की आवश्यकता है।
docker exec -it <container_id> /bin/sh
<पी> पी> <पी> डॉकर का बुनियादी सेटअप पूरा हो गया है और हम कमांड लाइन के माध्यम से रेडिस के साथ बातचीत करने में सक्षम हैं। <पी> अब, हम स्ट्रिंग डेटा प्रकारों के बारे में और अधिक देखने जा रहे हैं क्योंकि हम कुंजी और मान जोड़ी को स्ट्रिंग के रूप में संग्रहीत करने जा रहे हैं स्ट्रिंग्स
<पी> यह कुंजी के साथ संबद्ध होने वाला मान का सबसे सरल प्रकार है और कुंजी और मान के बीच एक-से-एक मैपिंग है। <पी> हम Set का उपयोग करके मान निर्धारित कर सकते हैं और GET का उपयोग करके भी मान प्राप्त कर सकते हैं <पी> आप Del का उपयोग करके कुंजी को हटा भी सकते हैं <पी> पी> <पी> अब, आपको NuGet पैकेज मैनेजर से आवश्यक पैकेज इंस्टॉल करने की आवश्यकता है। <पी>
प्रोग्राम.cs फ़ाइलों में कॉन्फ़िगरेशन जोड़ें
<पी> Programs.cs पी>
builder.Services.AddSingleton<IConnectionMultiplexer>(options =>
ConnectionMultiplexer.Connect(("127.0.0.1:6379")));
builder.Services.AddScoped<IStudentRepository, StudentRepository>();
<पी> एक मॉडल फ़ोल्डर बनाएं और हमारे मॉडल स्टूडेंट.सीएस के लिए एक फ़ाइल बनाएं, फिर कोड पेस्ट करें। <पी> Student.cs पी>
namespace StudentAPIWithRedisDB.Models
{
public class Student
{
public string Id { get; set; } = $"student:{Guid.NewGuid().ToString()}";
public required string StudentName { get; set; } = string.Empty;
}
}
<पी> फिर नीचे दिए गए कोड को कॉपी करें और रेस्पेक्ट फाइलों पर पेस्ट करें। <पी> StudentRepository.cs पी>
using StudentAPIWithRedisDB.Models;
namespace StudentAPIWithRedisDB.Data
{
public interface IStudentRepository
{
IEnumerable<Student> GetAllStudents();
Student? GetStudentById(string id);
void AddStudent(Student student);
Student? UpdateStudent(Student student);
Student? DeleteStudent(string id);
}
}
<पी> studentRepository.cs IStudentRepository.cs इंटरफ़ेस और उसके सभी तरीकों का कार्यान्वयन है।
using StackExchange.Redis;
using StudentAPIWithRedisDB.Models;
using System.Text.Json;
namespace StudentAPIWithRedisDB.Data
{
public class StudentRepository : IStudentRepository
{
private readonly IConnectionMultiplexer _redis;
public StudentRepository(IConnectionMultiplexer redis)
{
_redis = redis;
}
public void AddStudent(Student student)
{
if(student == null)
{
throw new ArgumentOutOfRangeException(nameof(student));
}
var db = _redis.GetDatabase();
var serializedStudent = JsonSerializer.Serialize(student);
db.StringSet(student.Id, serializedStudent);
}
public Student? DeleteStudent(string id)
{
var db = _redis.GetDatabase();
var student = db.StringGet(id);
if (student.IsNullOrEmpty)
{
return null;
}
db.KeyDelete(id);
return JsonSerializer.Deserialize<Student>(student);
}
public IEnumerable<Student> GetAllStudents()
{
var db = _redis.GetDatabase();
var studentKeys = db.Multiplexer.GetServer(_redis.GetEndPoints().First()).Keys(pattern: "student:*");
var students = new List<Student>();
foreach (var key in studentKeys)
{
var studentJson = db.StringGet(key);
if (!studentJson.IsNullOrEmpty)
{
var student = JsonSerializer.Deserialize<Student>(studentJson);
students.Add(student);
}
}
return students;
}
public Student? GetStudentById(string id)
{
var db = _redis.GetDatabase();
var student = db.StringGet(id);
if(student.IsNullOrEmpty)
{
return null;
}
return JsonSerializer.Deserialize<Student>(student);
}
public Student UpdateStudent(Student student)
{
var db = _redis.GetDatabase();
var id = student.Id;
if (db.KeyExists(id))
{
var updatedStudentJson = JsonSerializer.Serialize(student);
db.StringSet(id, updatedStudentJson);
return student;
}
else
{
return null;
}
}
}
}
<पी> StudentsController.cs पी>
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using StudentAPIWithRedisDB.Data;
using StudentAPIWithRedisDB.Models;
namespace StudentAPIWithRedisDB.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class StudentsController : ControllerBase
{
private readonly IStudentRepository _studentRepository;
public StudentsController(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
}
[HttpGet("{Id}", Name = "GetStudentById")]
public ActionResult<Student> GetStudentById(string Id)
{
var student = _studentRepository.GetStudentById(Id);
if(student == null)
{
return NotFound();
}
return Ok(student);
}
[HttpPost]
public ActionResult<Student> AddStudent(Student student)
{
_studentRepository.AddStudent(student);
return CreatedAtRoute(nameof(GetStudentById), new { Id = student.Id }, student);
}
[HttpGet(Name = "GetAllStudents")]
public ActionResult<Student> GetAllStudents()
{
var students = _studentRepository.GetAllStudents();
return Ok(students);
}
[HttpDelete("{id}")]
public ActionResult<Student> DeleteStudent(string id)
{
var student = _studentRepository.DeleteStudent(id);
if(student == null)
{
return NotFound();
}
return Ok(student);
}
[HttpPatch]
public ActionResult<Student> UpdateStudent(Student student)
{
var studentToUpdate = _studentRepository.GetStudentById(student.Id);
if(studentToUpdate == null)
{
return NotFound();
}
_studentRepository.UpdateStudent(student);
return NoContent();
}
}
}
<पी> अब, उस एप्लिकेशन को चलाएं जिसे आप स्वैगर का उपयोग करके ब्राउज़र पर दिखाए जा रहे एंडपॉइंट्स को देखने में सक्षम कर सकते हैं। <पी>
<पी> साथ ही, यदि आप डेटा देखने के लिए रेडिस डेस्कटॉप मैनेजर खोलें तो इससे मदद मिलेगी। प्रारंभ में, इसमें बिना किसी डेटा के 16 डेटाबेस होंगे। <पी> पी> <पी> एक बार जब आप क्रिएट एंडपॉइंट पर पहुंच जाते हैं तो यह स्वचालित रूप से DB0 में एक रिकॉर्ड बना देगा। बनाएं
<पी> आसान परीक्षण उद्देश्यों के लिए, मैंने एंडपॉइंट्स का परीक्षण करने के लिए पोस्टमैन का उपयोग किया है। <पी> केवल नाम पास करें, फिर यह स्वचालित रूप से छात्र के नाम और नए गाइड के साथ प्रत्यय के साथ एक आईडी बनाएगा <पी> पी> <पी> और दस्तावेज़ DB0 पर बनाया गया है। <पी> पी> GetStudentById
<पी> इसके लिए आपको डॉक्यूमेंट से आईडी कॉपी करनी होगी. फिर इसे अनुरोध URL पर पास करें। <पी> पी> <पी> और यह आईडी के आधार पर मान लौटाता है। सभी छात्र प्राप्त करें
<पी> यह डेटाबेस में उपलब्ध सभी दस्तावेज़ लौटाता है। <पी> पी> अद्यतन
<पी> आपको आईडी और अद्यतन मूल्य पास करना होगा। तो, यह आईडी के आधार पर अपडेट हो जाएगा। <पी> पी> <पी> एक बार, आप प्रबंधक को रीफ्रेश करें तो आपको अद्यतन मूल्य दिखाई देगा। <पी> पी> हटाएं
<पी> किसी उपयोगकर्ता को हटाने के लिए, कृपया आईडी पास करें, फिर यह दस्तावेज़ को छात्र डीबी से हटा देगा। <पी> पी> <पी> और दस्तावेज़ फ़ाइल से हटा दिया गया है। <पी> पी> <पी> पहले, मेरे पास छात्र की मेज पर दो दस्तावेज़ थे लेकिन अब पहला हटा दिया गया है। <पी> यह हमारे एप्लिकेशन में डेटाबेस के रूप में रेडिस के उपयोग को दिखाने का एक सरल तरीका है। यहां, हमने कैश को कम कर दिया है और डेटा को सीधे रेडिस में संग्रहीत किया है और इसमें पुनर्प्राप्त और परिवर्तन भी किए हैं। इसी तरह, आप भी इसे अपने आवेदन पर लागू कर सकते हैं।