文章目錄
ASP.NET Core 註冊 StackExchange.Redis 的方式
最近有個專案需要用到 RedLock.net,在做可行性評估時發現 StackExchange.Redis 有幾個註冊方式自己都沒有紀錄過,趁著工作空檔簡單筆記一下
基本環境說明
- mac Big Sur 11.6
- .NET Core SDK 5.0.401
- docker desktop 3.6.0(67351)
- docker images
- redis 6.2.6
NuGet packages
- StackExchange.Redis.Extensions.AspNetCore 7.1.1
- StackExchange.Redis.Extensions.System.Text.Json 7.1.1
- StackExchange.Redis 2.2.79
redis cluster
因為團隊使用 redis cluster,今天就以 redis cluster 做範例,建立方式可以參考之前筆記 使用 Docker Compose 建立 Redis Cluster 或是直接下載 docker-compose yowko/docker-compose-redis-cluster
註冊方式
使用 singleton 方式註冊 IConnectionMultiplexer
- 安裝 NuGet 套件:
StackExchange.Redis
config 新增 redis 連線字串
"RedisConnection": "192.168.80.3:7000,192.168.80.3:7001,192.168.80.3:7002,192.168.80.3:7003,192.168.80.3:7004,192.168.80.3:7005, password=pass.123"
註冊
IConnectionMultiplexer
Startup.cs
–>ConfigureServices
方法services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(Configuration.GetValue<string>("RedisConnection")));
使用方式
使用 DI 取得 redis IConnectionMultiplexer,並在 key 不存在時寫入
key
:yowko 與value
:test 至db0
並指定 expire 為60 秒
public TestController : Controller { private readonly IConnectionMultiplexer _connectionMultiplexer; public TestController(IConnectionMultiplexer multiplexer) { _connectionMultiplexer = multiplexer; _connectionMultiplexer.GetDatabase(0).StringSetAsync("yowko", "test", TimeSpan.FromSeconds(60), When.NotExists); } }
- 安裝 NuGet 套件:
使用 singleton 方式註冊 IDatabase
因為 redis cluster 只有
db0
對於 redis cluster 使用者沒有切換 database 需求,直接註冊 IDatabase 對於後續使用比較方便- 安裝 NuGet 套件:
StackExchange.Redis
config 新增 redis 連線字串
"RedisConnection": "192.168.80.3:7000,192.168.80.3:7001,192.168.80.3:7002,192.168.80.3:7003,192.168.80.3:7004,192.168.80.3:7005, password=pass.123"
註冊
IDatabase
Startup.cs
–>ConfigureServices
方法services.AddSingleton<IDatabase>(ConnectionMultiplexer.Connect(Configuration.GetValue<string>("RedisConnection")).GetDatabase(0));
使用方式
使用 DI 取得 redis IDatabase,並在 key 不存在時寫入
key
:yowko 與value
:test 至db0
並指定 expire 為60 秒
public TestController : Controller { private readonly IDatabase _redisDb; public TestController(IDatabase redisDb) { _redisDb = redisDb; _redisDb.StringSetAsync("yowko", "test", TimeSpan.FromSeconds(60), When.NotExists); } }
- 安裝 NuGet 套件:
使用擴充方法註冊
- 安裝 NuGet 套件:
StackExchange.Redis.Extensions.AspNetCore
與StackExchange.Redis.Extensions.System.Text.Json
config 新增 redis 連線字串
"RedisConnection": { "Password": "pass.123", "Hosts": [ { "Host": "192.168.80.3", "Port": "7000" }, { "Host": "192.168.80.3", "Port": "7001" }, { "Host": "192.168.80.3", "Port": "7002" }, { "Host": "192.168.80.3", "Port": "7003" }, { "Host": "192.168.80.3", "Port": "7004" }, { "Host": "192.168.80.3", "Port": "7005" } ] }
註冊
IConnectionMultiplexer
Startup.cs
–>ConfigureServices
方法services.AddStackExchangeRedisExtensions<SystemTextJsonSerializer>(Configuration.GetSection("RedisConnection").Get<RedisConfiguration>());
使用方式
使用 DI 取得 redis IRedisCacheClient,並在 key 不存在時寫入
key
:yowko 與value
:test 至db0
並指定 expire 為60 秒
public TestController : Controller { private readonly IRedisCacheClient _redisCacheClient; public TestController(IRedisCacheClient redisCacheClient) { _redisCacheClient = redisCacheClient; _redisCacheClient.Db0.AddAsync("yowko","test", TimeSpan.FromSeconds(60), When.NotExists); } }
- 安裝 NuGet 套件:
心得
原本覺得直接將 IConnectionMultiplexer
或是 IDatabase
註冊為 singleton 有點醜,感覺用 extention method 註冊比較帥,不過 IRedisCacheClient 的缺點讓我無法忽視:
IRedisCacheClient 的屬性直接寫死 db0-db16,用到不存在的 db 會拋 exception
config 的設定較繁瑣
仔細想想我還是用老方法好了XD
參考資訊
文章作者 Yowko Tsai
上次更新 2021-10-22
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。