Giới thiệu
Trong bài viết này, tôi sẽ thảo luận về Redis và các trường hợp sử dụng nó làm Cơ sở dữ liệu chính để lưu trữ dữ liệu của chúng ta.
- Giới thiệu về Redis
- Các kiểu dữ liệu Redis
- Ưu điểm và nhược điểm của việc sử dụng Redis làm DB
- Thiết lập Redis trong Vùng chứa
- Sử dụng Redis làm cơ sở dữ liệu chính với API Web .NET 8.
Điều kiện tiên quyết
- Mã hình ảnh
- SDK .NET 8
- Trình quản lý máy tính để bàn Redis. Bạn có thể tải xuống từ URL(https://redis.io/resources/tools/)
- Máy tính để bàn Docker
- Gói
- Microsoft.Extensions.Caching.stackExchangeRedis
- StackExchange.Redis
Giới thiệu về Redis
Redis là kho dữ liệu trong bộ nhớ và kho dữ liệu khóa-giá trị và được sử dụng chủ yếu cho lớp bộ nhớ đệm. Vì Redis lưu trữ dữ liệu trong bộ nhớ nên nó cho phép thực hiện các thao tác đọc và ghi rất nhanh, rất phù hợp để truy cập dữ liệu có độ trễ thấp. Bạn sẽ có thắc mắc như Redis lưu trữ dữ liệu trong bộ nhớ nhưng khi hệ thống khởi động lại chúng ta sẽ mất dữ liệu.
Để giải quyết vấn đề về tính bền vững của dữ liệu, Redis cung cấp các cơ chế khác nhau như ảnh chụp nhanh và tệp chỉ nối thêm (AOF). Các cơ chế này cho phép bạn lưu trữ dữ liệu liên tục trên đĩa, đảm bảo rằng dữ liệu có thể được phục hồi ngay cả sau khi khởi động lại hệ thống. Bạn có thể tìm hiểu thêm về Redis Persistence trongURL
Chủ yếu Redis được sử dụng làm lớp Cache nhưng chúng ta cũng có thể sử dụng nó làm Cơ sở dữ liệu để giảm bớt lệnh gọi khác đến các hệ thống cơ sở dữ liệu phức tạp. Redis sử dụng mô hình cơ sở dữ liệu Tài liệu nơi lưu trữ dữ liệu trong tài liệu chủ yếu ở định dạng JSON. Bạn cũng có thể biết thêm thông tin từ URL
Các kiểu dữ liệu Redis
Redis cung cấp một số loại dữ liệu cho phép chúng tôi giải quyết các vấn đề từ bộ nhớ đệm, xếp hàng và xử lý sự kiện.
- Chuỗi: đại diện cho một chuỗi byte
- Danh sách - Danh sách các chuỗi
- Bộ - Tập hợp chuỗi duy nhất không có thứ tự
- Băm - loại bản ghi được mô hình hóa dưới dạng tập hợp các cặp giá trị trường
Bạn sẽ tìm hiểu thêm về các loại dữ liệu từ URL
Ưu điểm của việc sử dụng Redis làm DB
- Hiệu suất cao
- Cấu trúc dữ liệu đa năng
- Độ trễ thấp
- Khả năng mở rộng
Nhược điểm của việc sử dụng Redis làm DB
- Độ bền của dữ liệu
- Khả năng truy vấn hạn chế
- Hạn chế về bộ nhớ
Thiết lập Redis trong Vùng chứa
Đảm bảo rằng Docker Desktop đang chạy và mở Visual Studio 2022.
Chọn "Tạo dự án mới" --> Nhấp vào "API Web ASP.NET Core" rồi nhấp vào "Tiếp theo".
Trên trang Cấu hình, nhập Tên dự án rồi nhấn "tiếp theo".

Trên trang Thông tin bổ sung, chọn thông tin theo ảnh chụp màn hình và chọn "Tạo".

Bây giờ, hãy tạo tệp "docker-compose.yaml" để giữ cấu hình cho Redis của chúng tôi và dán mã bên dưới.
version: '3.8'
services:
redis:
image: redis:alpine
container_name: redisStudentAPI
ports:
- 6379:6379 Sau đó, mở lời nhắc Developer Powershell từ Công cụ -> Dòng lệnh -> Developer Powershell.
Sau đó điều hướng vào bên trong thư mục Project và nhập lệnh để chạy file YAML "docker soạn thảo -d"
Mở màn hình docker và điều hướng đến các vùng chứa, bạn có thể thấy vùng chứa được tạo từ tệp YAML. Ngoài ra, bạn có thể chạy 'docker ps' để xem các container đang chạy.

Để tương tác với Redis Server, bạn cần chạy lệnh bên dưới với ID vùng chứa.
docker exec -it <container_id> /bin/sh
Quá trình thiết lập cơ bản của Docker đã hoàn tất và chúng ta có thể tương tác với Redis thông qua dòng lệnh.
Bây giờ, chúng ta sẽ tìm hiểu thêm về các kiểu dữ liệu chuỗi vì chúng ta sẽ lưu trữ cặp khóa và giá trị dưới dạng chuỗi
Chuỗi
Đây là loại giá trị đơn giản nhất được liên kết với khóa và ánh xạ một-một giữa khóa và giá trị.
Chúng ta có thể đặt giá trị bằng cách sử dụng Set
Bạn cũng có thể xóa khóa bằng Del
Bây giờ, bạn cần cài đặt các gói cần thiết từ Trình quản lý gói NuGet.

Thêm cấu hình trong tệp Program.cs
Programs.cs
builder.Services.AddSingleton<IConnectionMultiplexer>(options =>
ConnectionMultiplexer.Connect(("127.0.0.1:6379")));
builder.Services.AddScoped<IStudentRepository, StudentRepository>(); Tạo Thư mục Mô hình và Tạo một tệp cho Mô hình Sinh viên.cs của chúng tôi sau đó dán mã.
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;
}
}
Sau đó sao chép và dán mã bên dưới vào tệp Tôn trọng.
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);
}
}
Sinh viênRepository.cs là việc triển khai giao diện IStudentRespository.cs và tất cả các phương thức của nó.
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();
}
}
}
Bây giờ, hãy chạy ứng dụng, bạn có thể xem các điểm cuối hiển thị trên trình duyệt bằng Swagger.

Ngoài ra, sẽ rất hữu ích nếu bạn mở Redis Desktop Manager để xem dữ liệu. Ban đầu, nó sẽ có 16 cơ sở dữ liệu không có dữ liệu.
Sau khi bạn nhấn điểm cuối tạo, nó sẽ tự động tạo một bản ghi trong DB0.
TẠO
Để dễ dàng kiểm tra, tôi đã sử dụng Postman để kiểm tra các điểm cuối.
Chỉ nhập tên, sau đó nó sẽ tự động tạo ID có tên của học sinh và hậu tố là Hướng dẫn mới
Và tài liệu được tạo trên DB0.
GetStudentById
Để làm điều này, bạn cần sao chép ID từ tài liệu. Sau đó chuyển nó vào URL yêu cầu.
và nó trả về giá trị dựa trên ID.
Nhận tất cả học sinh
Nó trả về tất cả các tài liệu có sẵn trong Cơ sở dữ liệu.
Cập nhật
Bạn cần chuyển ID và giá trị cập nhật. Vì vậy, nó sẽ cập nhật dựa trên ID.
Sau khi làm mới trình quản lý, bạn sẽ thấy giá trị được cập nhật.
Xóa
Để xóa người dùng, vui lòng chuyển ID, sau đó nó sẽ xóa tài liệu khỏi Cơ sở dữ liệu sinh viên.
Và tài liệu sẽ bị xóa khỏi tệp.
Trước đây tôi có hai tài liệu trên bảng của Sinh viên nhưng bây giờ tài liệu đầu tiên đã bị xóa.
Đây sẽ là một cách đơn giản để hiển thị việc sử dụng Redis làm Cơ sở dữ liệu trong ứng dụng của chúng tôi. Ở đây, chúng tôi đã giảm Bộ đệm và lưu trữ dữ liệu trực tiếp vào Redis, đồng thời truy xuất và thực hiện các thay đổi đối với nó. Tương tự, bạn cũng có thể áp dụng điều tương tự cho đơn đăng ký của mình.