使用 asp.net core 使用 Docker 探索 Redis 缓存 – 第 1 部分
回顾
在我之前的文章中,我们已经了解了 Docker 和 Docker vs Container 的概念。如果您还没有阅读,我鼓励您从这里阅读。
前提条件
- 安装在本地机器上的 Docker desktop
- Visual Studio/ Visual Studio Code
介绍
Redis 缓存是一种内存数据结构存储,可用作数据库、消息代理和缓存。它支持哈希、集合、列表、字符串、流等数据结构。它还包括其他功能,例如
- Transactions
- 发布/订阅
- 生命周期的秘钥
- 自动故障转移
运行 Redis 容器
通过运行从 Docker 中心拉取最新的 Redis 版本
docker pull redis
这里我们给它一个名字(local-redis)并暴露了默认的redis端口——6379
docker run -d -p 6379:6379 --name local-redis redis
检查它是否正在运行
docker ps
并查看日志输出
docker logs local-redis
在容器中运行 Redis CLI
我们将在正在运行的容器中启动一个新的交互式会话(-it),并使用它来运行 redis-cli。
docker exec -it local-redis sh
现在我们已连接到我们的 redis 容器。让我们运行 redis-cli
# redis-cli
尝试一些基本命令
如果我们发送“ping”,应该返回“Pong”
127.0.0.1:6379> ping
PONG
尝试添加更多命令,例如设置键,增加计数器
127.0.0.1:6379> set name Anika
OK
127.0.0.1:6379> get name
"Anika"
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> incr counter
(integer) 2
127.0.0.1:6379> get counter
"2"
当我们完成退出 redis-cli 和 sh
127.0.0.1:6379> exit
# exit
编码
现在,Redis 已经在 docker 中成功运行了。那么,让我们从代码的角度来了解 Redis 是如何工作的。
我为本文创建了一个 asp.net core web-api 项目。将 StackExchange.Redis nuget 包添加到项目中
让我们从 Startup 类开始
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
IConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
services.AddScoped(x => redis.GetDatabase());
}
以上是连接Redis的代码。
在控制器中,我使用 key 属性从缓存中检索数据
[HttpGet("{key}")]
public async Task<string> GetAsync(string key)
{
return await _database.StringGetAsync(key);
}
在这两种 http post 方法中,我都使用 KeyValuePair<string,string>
[HttpPost]
public async Task PostAsync([FromBody]KeyValuePair<string, string> keyValue)
{
await _database.StringSetAsync(keyValue.Key, keyValue.Value);
}
上面的方法很简单,只是将 KeyValuePair 添加到缓存中。
[HttpPost(template:"expiry")]
public async Task SaveExpiry([FromBody] KeyValuePair<string, string> keyValue)
{
await _database.StringSetAsync(keyValue.Key, keyValue.Value, expiry: TimeSpan.FromSeconds(10));
}
除了将过期参数添加到 StringSetAsync 之外,SaveExpiry 方法的代码或多或少保持不变。我为到期参数设置了 10 秒的时间跨度。
注意:我不建议在 http post 动词中使用 expiry。相反,您可以在 WorkerService(即 BackGroundService)中实现它。我将使用相同的示例发布一篇关于 Azure Web 作业的文章。
最后,我们设法将所有代码更改到位。运行应用程序并验证结果。
似乎一切都按预期工作。
在本文的第 2 部分系列中,我将专注于在 docker 中运行当前应用程序以及容器(Redis 和我们的应用程序容器)之间的通信是如何发生的。
我希望你喜欢这篇文章。如果您觉得文章有趣,请点赞并分享。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!