Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

.NET 8 Web API のプライマリ データ ストアとしての Redis

はじめに

この記事では、Redis と、データを保存するためのプライマリ データベースとして Redis を使用するユースケースについて説明します。

  • Redis の概要
  • Redis データ型
  • Redis を DB として使用するメリットとデメリット
  • コンテナ内での Redis のセットアップ
  • .NET 8 Web API で Redis をプライマリ データベースとして使用する

前提条件

  • ビジュアルコード
  • .NET 8 SDK
  • Redis デスクトップ マネージャー。 URL(https://redis.io/resources/tools/)からダウンロードできます
  • Docker デスクトップ
  • パッケージ
    • Microsoft.Extensions.Caching.stackExchangeRedis
    • StackExchange.Redis

Redis の概要

Redis はインメモリ データストアおよびキー/値データストアであり、主にキャッシュ レイヤーに使用されます。 Redis はデータをメモリ内に保存するため、データへの低遅延アクセスに適した非常に高速な読み取りおよび書き込み操作が可能になります。 Redis はデータをメモリ内に保存しますが、システムが再起動するとデータが失われるのではないかなどの疑問が生じるでしょう。

データの永続性の問題を解決するために、Redis はスナップショット などのさまざまなメカニズムを提供します。 および追加専用ファイル (AOF) これらのメカニズムにより、データをディスクに永続的に保存できるため、システムの再起動後でもデータを確実に復元できます。 Redis Persistence について詳しくは、URL

をご覧ください。

主に Redis はキャッシュ層として使用されますが、複雑なデータベース システムへの他の呼び出しを減らすためにデータベースとして使用することもできます。 Redis はドキュメント データベース モデルを使用し、ドキュメント内のデータを主に JSON 形式で保存します。 URL から詳細を確認することもできます

Redis データ型

Redis は、キャッシュ、キューイング、イベント処理の問題を解決できるいくつかのデータ型を提供します。

  • 文字列: バイトのシーケンスを表す
  • リスト - 文字列のリスト
  • セット - 一意の文字列の順序付けされていないコレクション
  • ハッシュ - フィールドと値のペアのコレクションとしてモデル化されたレコード タイプ

データ型の詳細については、URL からご覧ください。

Redis を DB として使用する利点

  • 高性能
  • 多彩なデータ構造
  • 低レイテンシ
  • スケーラビリティ

Redis を DB として使用する場合の短所

  • データの耐久性
  • 制限されたクエリ機能
  • メモリの制約

コンテナ内での Redis のセットアップ

Docker Desktop が実行されていることを確認し、Visual Studio 2022 を開きます。

[新しいプロジェクトの作成] を選択し、[ASP.NET Core Web API] をクリックして、[次へ] をクリックします。

[構成] ページで、プロジェクト名を入力し、[次へ] を押します。

.NET 8 Web API のプライマリ データ ストアとしての Redis

[追加情報] ページで、スクリーンショットに従って情報を選択し、[作成] を選択します。

.NET 8 Web API のプライマリ データ ストアとしての Redis

次に、Redis の構成を保持する「docker-compose.yaml」ファイルを作成し、以下のコードを貼り付けます。

version: '3.8'
services:
 redis:
 image: redis:alpine
 container_name: redisStudentAPI
 ports:
 - 6379:6379

その後、[ツール] -> [コマンド ライン] -> [開発者 Powershell] から開発者 Powershell プロンプトを開きます。

次に、プロジェクト フォルダー内に移動し、YAML ファイルを実行するコマンド「docker compose up -d」を入力します。

Docker デスクトップを開き、コンテナーに移動すると、YAML ファイルから作成されたコンテナーが表示されます。また、「docker ps」を実行して、実行中のコンテナを確認することもできます。

.NET 8 Web API のプライマリ データ ストアとしての Redis

Redis サーバーと対話するには、コンテナ ID を指定して以下のコマンドを実行する必要があります。

docker exec -it <container_id> /bin/sh

Docker の基本的なセットアップが完了し、コマンド ラインを介して Redis と対話できるようになります。

ここで、キーと値のペアを文字列として保存するので、文字列データ型についてさらに詳しく見ていきます。

文字列

これは、キーとキーと値の間の 1 対 1 マッピングに関連付けられる最も単純なタイプの値です。

Set を使用して値を設定し、GET

を使用して値を取得することもできます。

Del

を使用してキーを削除することもできます。

ここで、NuGet パッケージ マネージャーから必要なパッケージをインストールする必要があります。

.NET 8 Web API のプライマリ データ ストアとしての Redis

Program.cs ファイルに構成を追加します

プログラム.cs

builder.Services.AddSingleton<IConnectionMultiplexer>(options =>
 ConnectionMultiplexer.Connect(("127.0.0.1:6379")));
builder.Services.AddScoped<IStudentRepository, StudentRepository>();

モデル フォルダーを作成し、モデル Student.cs のファイルを作成して、コードを貼り付けます。

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;
 }
}

次に、以下のコードをコピーして、Respection ファイルに貼り付けます。

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 は、IStudentRespository.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();
 }
 }
}

次に、アプリケーションを実行すると、Swagger を使用してブラウザ上にエンドポイントが表示されるのを確認できます。

.NET 8 Web API のプライマリ データ ストアとしての Redis

また、Redis デスクトップ マネージャーを開いてデータを確認すると役に立ちます。当初は、データのない 16 個のデータベースが存在します。

作成エンドポイントを押すと、DB0 にレコードが自動的に作成されます。

作成

簡単にテストするために、Postman を使用してエンドポイントをテストしました。

名前のみを渡すと、学生の名前と新しい GUID をサフィックスにした ID が自動的に作成されます。

そして、ドキュメントは DB0 上に作成されます。

GetStudentById

このためには、ドキュメントから ID をコピーする必要があります。次に、それをリクエスト URL に渡します。

ID に基づいて値を返します。

すべての生徒を取得

データベース内で利用可能なすべてのドキュメントを返します。

アップデート

ID と更新された値を渡す必要があります。そのため、ID に基づいて更新されます。

一度マネージャーを更新すると、更新された値が表示されます。

削除

ユーザーを削除するには、ID を渡してください。そうすれば、学生 DB からドキュメントが削除されます。

そして、ドキュメントがファイルから削除されます。

以前は、生徒のテーブルに 2 つの文書がありましたが、現在は最初の文書が削除されています。

これは、アプリケーションでデータベースとして Redis を使用することを示す簡単な方法です。ここでは、キャッシュを削減し、データを Redis に直接保存し、取得して変更を加えました。同様に、同じことをアプリケーションに適用することもできます。


  1. Redis INCRBYFLOAT –Redisで浮動小数点値をインクリメントする方法

    このチュートリアルでは、redisデータストアのキーに格納されている浮動小数点値を表す文字列をインクリメントする方法について学習します。このために、Redis INCRBYFLOATを使用します 指図。 INCRBYFLOATコマンド このコマンドは、キーに格納されている浮動小数点数を表す文字列を指定された値だけインクリメントするために使用されます。キーが存在しない場合は、インクリメント操作を実行する前に、最初にキーが作成されて0に設定されます。キーが存在するが、キーに格納されている値が間違ったデータ型(文字列データ型ではない)であるか、倍精度浮動小数点数として表現できない文字列値が含

  2. Astro、Upstash、GitHub を使用して、無料のオープンソース LinkTree の代替を構築する

    この投稿では、itsmy.fyi (LinkTree に代わるオープンソース) が Upstash、Astro、GitHuband Edgio を使用してどのように構築されるかについて説明します。 Upstash は、すべてのユーザーの (CRUD) データの管理に役立ち、CRUD 操作に対して GitHub API と比較して大幅なレート制限を提供し、きめ細かいレート制限を実装しました。 使用するもの Astro (フロントエンドおよびバックエンド) Upstash (レート制限と CRUD オペレーション) GitHub の問題と Webhook (ユーザー プロファイルを管理するた