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

Redisと.NET 8/9/10の統合:完全ステップバイステップチュートリアル

Redisは、キャッシュ、セッション管理、リアルタイム分析などに広く活用されている高性能なインメモリデータストアです。本ガイドでは、.NET向けに最も人気のあるRedisクライアントの一つであるStackExchange.Redisを使用して、Redisを.NETアプリケーションに統合する方法を段階的に解説します。

1. 前提条件

作業を始める前に、以下の環境が整っていることを確認してください。

  • .NET 8/9/10 SDK がインストール済みであること
  • Visual Studio または VS Code
  • ローカルまたはDocker上で稼働しているRedisサーバー

Dockerを使えば、次のコマンド一つでRedisをローカル環境で簡単に起動できます。

docker run --name redis -p 6379:6379 -d redis

2. 必要なNuGetパッケージのインストール

ソリューションエクスプローラーでプロジェクトを右クリックし、「NuGetパッケージの管理」から以下のパッケージをインストールします。

Microsoft.EntityFrameworkCore
Npgsql.EntityFrameworkCore.PostgreSQL
Microsoft.Extensions.Caching.StackExchangeRedis

これにより、Entity Framework Core経由でPostgreSQLに接続しつつ、IDistributedCacheインターフェースを通じてRedisの分散キャッシュを利用できるようになります。

3. Program.cs のセットアップ

using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// PostgreSQL
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseNpgsql("Host=localhost;Port=5432;Database=testdb;Username=postgres;Password=1234"));

// Redis
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost:6379";
});

builder.Services.AddControllers();

var app = builder.Build();
app.MapControllers();
app.Run();

AddStackExchangeRedisCacheをサービスに登録することで、DIコンテナからIDistributedCacheを任意のクラスに注入できるようになります。

4. モデルとDbContextの作成

👉 Product.cs

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

👉 AppDbContext.cs

using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) {}
    public DbSet<Product> Products { get; set; }
}

5. PostgreSQLにテーブルとテストデータを作成

CREATE TABLE "Products" (
    "Id" SERIAL PRIMARY KEY,
    "Name" TEXT
);

INSERT INTO "Products" ("Name") VALUES ('Laptop'), ('Mobile');

6. コントローラーの作成

Controllersフォルダを右クリック →「追加」→「コントローラー」→「APIコントローラー」を選択します。

👉 ProductController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using System.Text.Json;

[ApiController]
[Route("api/[controller]")]
public class ProductController : ControllerBase
{
    private readonly AppDbContext _context;
    private readonly IDistributedCache _cache;

    public ProductController(AppDbContext context, IDistributedCache cache)
    {
        _context = context;
        _cache = cache;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> Get(int id)
    {
        string cacheKey = $"product_{id}";

        // 🔴 Redisキャッシュの確認
        var cachedData = await _cache.GetStringAsync(cacheKey);
        if (cachedData != null)
        {
            var product = JsonSerializer.Deserialize<Product>(cachedData);
            return Ok(new
            {
                source = "Redis",
                data = product
            });
        }

        // 🗄️ データベースへのアクセス
        var productFromDb = await _context.Products.FindAsync(id);
        if (productFromDb == null)
            return NotFound();

        // 🔥 Redisへ保存
        var options = new DistributedCacheEntryOptions()
            .SetAbsoluteExpiration(TimeSpan.FromMinutes(5));

        await _cache.SetStringAsync(
            cacheKey,
            JsonSerializer.Serialize(productFromDb),
            options
        );

        return Ok(new
        {
            source = "Database",
            data = productFromDb
        });
    }
}

処理の流れ:

  1. まずRedisキャッシュを確認する。
  2. キャッシュミスの場合はデータベースからデータを取得する。
  3. 有効期限(TTL)を設定したうえで、データをRedisに保存する。

7. プロジェクトの実行とテスト

👉 プロジェクトを実行する
👉 ブラウザまたはPostmanから以下のURLにアクセスする

https://localhost:xxxx/api/product/1

初回リクエストではレスポンスの source が "Database" となり、2回目以降は "Redis" が返されます。この違いを確認することで、キャッシュが正しく機能していることがわかります。

8. 高度なRedis活用

ここからは、IConnectionMultiplexerを直接注入して、より高度なRedisのデータ構造を活用する方法を紹介します。

ハッシュ(Hashes):構造化データの保存

await _db.HashSetAsync("user:1", new HashEntry[]
{
    new HashEntry("name", "Shafaet"),
    new HashEntry("age", 26)
});

リスト(Lists):キュー・メッセージリストの実装

await _db.ListRightPushAsync("messages", "Hello World");
var msg = await _db.ListLeftPopAsync("messages");

Publish/Subscribe:リアルタイム通知

var sub = _redis.GetSubscriber();
await sub.SubscribeAsync("channel", (ch, val) => Console.WriteLine(val));
await sub.PublishAsync("channel", "Hello subscribers!");

9. ベストプラクティス

  • ConnectionMultiplexerはシングルトンとして登録し、接続の多重生成を避ける。
  • Redisはあくまでキャッシュとして活用し、プライマリデータベースとして扱わない。
  • キャッシュキーには必ず有効期限(TTL)を設定し、メモリ不足を防止する。
  1. .NET CoreでRedisを使った分散ロックの実装方法を徹底解説

    はじめに 本記事では、.NET Core環境においてRedisを活用して分散ロックを実装する方法について詳しく解説します。 分散システムを構築する際、複数のプロセスが同じ共有リソースへ同時にアクセスする場面に直面することがあります。共有リソースは同時に1つのプロセスしか利用できないため、適切な制御を行わないと予期しない問題が発生してしまいます。 このような課題を解決するために有効なのが「分散ロック」です。 なぜ分散ロックが必要なのか? 通常、この種の問題に対してはロックを使用して対処します。以下はC#における一般的なlock構文の使用例です。 public void SomeMethod()

  2. Redisマルチリージョンアーキテクチャ徹底解説:レイテンシ・レプリケーション・実運用の課題

    本記事は、C# Cornerの公式ライブ配信チャンネル「CSharp TV」で公開された「Redisマルチリージョンアーキテクチャ」に関する技術解説(3月18日公開)をもとに、その内容を整理・再構成したものです。動画の視聴にはJavaScriptが有効なHTML5対応ブラウザが必要です。Redisマルチリージョンアーキテクチャとはグローバルにユーザーを持つアプリケーションでは、単一リージョンに配置したRedisでは応答速度や可用性の面で限界が生じます。たとえば東京のユーザーが米国東部のキャッシュサーバーへアクセスすると、物理的な距離に起因するネットワーク遅延(RTT)が100ms以上になること