RedisをC#とGoから使ってみる(Dockerで動作確認)
はじめに
今回は、普段は既に完成されていることが多いRedisへデータ格納・データ取得を確認します。
Docker上のRedisに対して
C# (.NET Framework4.8) と Go (1.22) の両方からアクセスし、
同じキーを共有できるかを確認してみます。
Redisはインメモリ型のデータストアとして有名で、
セッション管理やキャッシュ用途などに幅広く使われています。
2024年3月28日にRedis OSS 7.2.4からフォークされたValKeyが登場しましたが
現在はRedisの方が簡易に環境を用意できるため、Redisで行います。
今後、ValKeyでも確認しようと思います。
環境構築をシンプルにするため、RedisはDockerで立ち上げます。
開発環境
| 項目 | 内容 |
|---|
| OS | Windows 11(10でもおそらく大丈夫) |
| Redis | Docker公式イメージ |
| C# | .NET Framework4.8 |
| Go | 1.22 |
Redisの起動(Docker)
Redisは公式イメージがあるため、以下の1行で起動できます。
docker run -d --name redis-demo -p 6379:6379 redis
これで localhost:6379 にRedisサーバーが立ち上がります。
C#からRedisにアクセスしてみる
1. プロジェクト作成
コマンドを作成しましたがVisualStudioがある人はそっち空で大丈夫です。
パッケージについてもツール⇒NuGetパッケージマネージャーから
StackExchange.Redisで検索すれば見つかります。
dotnet new console -n RedisCSharpDemo
cd RedisCSharpDemo
dotnet add package StackExchange.Redis
2. ソースコード(Program.cs)
using StackExchange.Redis;
using System;
namespace RedisDemoApp
{
internal class Program
{
static void Main(string[] args)
{
var redis = ConnectionMultiplexer.Connect("localhost:6379");
var setKey = "demo:key";
var setString = "Hello from C#!";
var db = redis.GetDatabase();
//片方をコメントアウトしてビルドすれば相互確認が可能
// 値を保存
db.StringSet(setKey, setString);
Console.WriteLine($"Redisに格納 Key: {setKey} Value: {setString}");
// 値を取得
var value = db.StringGet(setKey);
Console.WriteLine($"Redisから取得: {value}");
}
}
}
GoからRedisにアクセスしてみる
1. プロジェクト作成
こちらもコマンドを作成しましたがVScodeで自由に作ってもらって大丈夫です。
mkdir RedisGoDemo
cd RedisGoDemo
go mod init redis-demo
go get github.com/redis/go-redis/v9
実行時はカレントをプロジェクトのルート(main.go)にして下記で可能。
2. ソースコード(main.go)
package main
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func main() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
setKey := "demo:key"
setString := "Hello from Go!"
//片方をコメントアウトしてビルドすれば相互確認が可能
// 値を保存
err := rdb.Set(ctx, setKey, setString, 0).Err()
if err != nil {
panic(err)
}
fmt.Printf("Redisに格納: Key:%s\n Value:%s\n", setKey, setString)
// 値を取得
val, err := rdb.Get(ctx, setKey).Result()
if err != nil {
panic(err)
}
fmt.Println("Redisから取得:", val)
}
動作確認
"demo:key" に値を書き込み
"demo:key" の値を取得
結果として、C#とGoの両方から同じデータを扱えることが確認できます。
C#で格納。C#で取得。
D:\csharp\Redis_Demo\RedisDemoApp\RedisDemoApp\bin\Release>RedisDemoApp.exe
Redisに格納 Key: demo:key Value: Hello from C#!
Redisから取得: Hello from C#!
Goで格納。Goで取得。
PS D:\go\GoRedisDemo> go run main.go
redis: 2025/11/10 22:45:56 redis.go:478: auto mode fallback: maintnotifications disabled due to handshake error: ERR unknown subcommand 'maint_notifications'. Try CLIENT HELP.
Redisに格納: Key:demo:key
Value:Hello from Go!
Redisから取得: Hello from Go!
C#で格納。Goで取得。
D:\csharp\Redis_Demo\RedisDemoApp\RedisDemoApp\bin\Release>RedisDemoApp.exe
Redisに格納 Key: demo:key Value: Hello from C#!
PS D:\go\GoRedisDemo> go run main.go
redis: 2025/11/10 23:09:57 redis.go:478: auto mode fallback: maintnotifications disabled due to handshake error: ERR unknown subcommand 'maint_notifications'. Try CLIENT HELP.
Redisから取得: Hello from C#!
Goで格納。C#で取得。
PS D:\go\GoRedisDemo> go run main.go
redis: 2025/11/10 23:11:03 redis.go:478: auto mode fallback: maintnotifications disabled due to handshake error: ERR unknown subcommand 'maint_notifications'. Try CLIENT HELP.
Redisに格納: Key:demo:key
Value:Hello from Go!
D:\csharp\Redis_Demo\RedisDemoApp\RedisDemoApp\bin\Release>RedisDemoApp.exe
Redisから取得: Hello from Go!
まとめ
- Dockerを使えばRedisの環境構築は1行で完了
- C#では
StackExchange.Redis、Goでは go-redis/v9 を使用
- 言語を跨いでも同じRedisサーバーにアクセス可能
今後は、この構成をベースに
- ValKeyでの動作検証
- Redisクラスタ接続
- Pub/Subによるリアルタイム通知
なども展開できます。
もう少しセッション管理部分の構築など知識を深めていこうと思います。
参考サイト