在ASP.NET中使用Azure Cache for Redis的方法和注意事项
今次将会从Azure Web Service(以下简称Web Server)读取和写入数据到Azure Redis(以下简称Redis)。我想介绍在此过程中需要注意的事项以及被视为最佳实践的方法。
简要介绍Redis。
只需要一种选择,用中文復述如下:
・可以使用键值对的组合来保存数据的数据库。
・读写速度非常快。
・可以设置数据保存期限,以便可以定期删除。
・具有简单的功能,如获取、设置、更新和排序等。
・不能用于持久保存想要的数据(会在重新启动时消失)。
・只是一个中间件(可以自由下载,也可以在本地搭建Redis服务器)。
首先,我想告诉考虑利用这一点的人的事项。
与其他Azure服务相比,定价较高。
这取决于您想进行缓存的内容,但我认为在提升数据库性能方面可能更值得投资。
(因为我只想缓存认证信息,所以我最终选择为数据库投资了金钱。)
我希望您能根据缓存数据的量和Redis的功能来判断。
・即可开始使用,操作和设置非常简单,功能简洁直观,没有令人上瘾的地方(直接赞扬)。
在实施规模扩大时(在过程中提升计划),需要重新启动。
为了提高运行效能,中途进行规模升级会导致服务停机。(也许这个问题可以通过分片配置来解决)
在Azure门户中创建Redis
请注意,在创建时将Web服务器和Redis配置在同一个区域。引用自官方。
为了实现最佳性能和最短等待时间,应将 Azure Cache for Redis 部署在与缓存客户端应用程序相同的区域。
选择计划的指标是基本上根据价格表和说明书来参考,我会针对我有疑问的部分进行补充说明。
Redis 的定价表
https://azure.microsoft.com/zh-cn/pricing/details/cache/
・客户端连接数量
这次的客户端将成为Web服务器。
因此,连接到Redis的客户端数量将取决于Web服务器实例的数量(实际上会稍微多一些)。
Web服务器最多有10个实例,所以256就足够了。
实际上,我过去是通过一个Web服务器使用Redis,但当我检查连接数时,最多有13个连接。我猜这可能是Azure监视系统服务器或控制台的计数,但我不能确定。
如果只是处理认证信息,那么带宽可以设置为”低”并没有问题。
每秒处理7KB的数据并不会成为瓶颈,但是建议在处理大量数据之前先进行验证。
在实施之前,需要进行环境配置。
设置Redis的连接字符串。
从门户打开Redis并查看子菜单中的概述和访问密钥,以确认URL和密钥。
在Web.config文件中添加到Redis的连接字符串。
<appSettings>
<add key="CacheConnection" value="概要のURL.redis.cache.windows.net:6380,abortConnect=false,ssl=true,allowAdmin=true,password=アクセスキー"/>
</appSettings>
如果不想把密钥信息放在源代码上,也可以放在Azure门户上。放置位置是:门户>应用服务>配置>添加新的应用设置。将上述内容放入键和值中并保存。请注意,在保存时服务器将重新启动。
无论选择哪一个位置,从代码上引用方式都不会改变。
安装用于处理Redis的软件包。
在Nuget软件包管理器中安装”StackExchange.Redis”。
使用上述设置来演示实际用法。
只需以下代码即可完成与Redis的连接部分。
这是官方推荐的写法,确保所有Redis连接都通过同一个实例进行。
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
// Web.configに設定してもポータル上の場合でも、ConfigurationManagerで取得できます。
string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"];
return ConnectionMultiplexer.Connect(cacheConnection);
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
我实际在Redis中尝试Get和Set。
var cacheKey = "Redis_Key_Name";
// Redisにはシリアライズしたオブジェクトも入れることができます。
var cacheValue = "Allow_Content_SerializeObject";
// Connectionはどこから参照してもOKな、スレッドセーフになっています。
IDatabase cache = Connection.GetDatabase();
// Redisに値をセットします。(Key, Value, 保存期間、 Set動作の詳細)
cache.StringSet(cacheKey, cacheValue, TimeSpan.FromMinutes(5), When.Always);
// Redisの値をゲットします。非同期もできます。StringGetAsync,StringSetAsync
RedisValue value = cache.StringGet(cacheKey);
if (value.IsNullOrEmpty)
{
return null;
}
// 保存期間の再セットです。
cache.KeyExpire(cacheKey, TimeSpan.FromMinutes(5));
请部署并尝试一下。
接下来,我会介绍如何验证实际上是否将值存入Redis。
可以通过控制台访问Redis。
我们可以通过Redis控制台访问并操作键值。
可以通过Azure门户进入或通过本地cmd访问。
只要在Azure门户中,我觉得很容易就能找到Redis的SSH选项卡,并且可以从那里访问。(对不起,我有点记不清楚)
请尝试使用各种命令。
请查阅官方文档以了解如何通过cmd进入:
https://docs.microsoft.com/ja-jp/azure/azure-cache-for-redis/cache-how-to-redis-cli-tool
在进行负载测试时遇到的困难。
进行负载测试后,发现Redis的超时问题频繁发生。
尽管提升了Redis的计划,但问题仍未解决,一度找不到原因。
后来发现Web Server的CPU占用率达到了100%,提升了Web Server的计划后,Redis的超时问题消失了。
由于非常费解,所以进行了调查,发现官方已经有相关记录。
Redis客户端遇到内存不足问题
https://docs.microsoft.com/zh-cn/azure/azure-cache-for-redis/cache-troubleshoot-client
如果客户端的性能不足,即使Redis立即返回响应,也无法接收到并导致Redis超时。责备Redis而不是Web服务器很可怜。
最後
我认为Redis本身确实很快。
希望在计划的网络带宽方面能提供更详细的描述。