在将新版本的Web应用程序部署到Azure App Service时,我需要清除关联的Azure Redis缓存中的数据。这是为了确保我们不会返回在新版本中具有架构更改的旧版本项目。
我们正在使用Octopus Deploy进行部署,之前我尝试执行以下PowerShell命令来重置缓存:
Reset-AzureRmRedisCache -ResourceGroupName "$ResourceGroup" -Name "$PrimaryCacheName" -RebootType "AllNodes" -Force
这项工作成功但有点笨拙,我们遇到间歇性的连接问题,我怀疑是因为我们正在重启Redis并丢弃现有的连接。
理想情况下,我只想通过PowerShell执行FLUSHALL
命令。这是一种更好的方法,是否可以使用StackExchange.Redis库在PowerShell中执行?
答案 0 :(得分:2)
重置AzureRmRedisCache cmdlet重新启动Azure Redis缓存实例的节点,我同意这对您的要求有点过分。
是的,可以在PowerShell中执行Redis FLUSHALL命令。
作为先决条件,您应该安装Redis CLI并设置环境变量以指向您环境中的Redis CLI可执行文件/二进制路径。
然后,您可以使用Redis-CLI命令在PowerShell中执行,如下所示。
Invoke-Command -ScriptBlock { redis-cli -h <hostname>.redis.cache.windows.net -p <redisPort> -a <password> }
Invoke-Command -ScriptBlock { redis-cli flushall }
答案 1 :(得分:1)
我最终实现此目标的方法是通过PowerShell调用StackExchange.Redis库,因此您需要在某个地方方便地获得此DLL的副本。在部署期间,我可以访问连接字符串,因此此函数将剥夺主机和端口以连接到服务器。此方法无需打开非SSL端口,并且连接字符串允许管理员访问缓存:
function FlushCache($RedisConnString)
{
# Extract the Host/Port from the start of the connection string (ignore the remainder)
# e.g. MyUrl.net:6380,password=abc123,ssl=True,abortConnect=False
$hostAndPort = $RedisConnString.Substring(0, $RedisConnString.IndexOf(","))
# Split the Host and Port e.g. "MyUrl.net:6380" --> ["MyUrl.net", "6380"]
$RedisCacheHost, $RedisCachePort = $hostAndPort.split(':')
Write-Host "Flushing cache on host - $RedisCacheHost - Port $RedisCachePort" -ForegroundColor Yellow
# Add the Redis type from the assembly
$asm = [System.Reflection.Assembly]::LoadFile("StackExchange.Redis.dll")
# Open a connection
[object]$redis_cache = [StackExchange.Redis.ConnectionMultiplexer]::Connect("$RedisConnString,allowAdmin=true",$null)
# Flush the cache
$redisServer = $redis_cache.GetServer($RedisCacheHost, $RedisCachePort,$null)
$redisServer.FlushAllDatabases()
# Dispose connection
$redis_cache.Dispose()
Write-Host "Cache flush done" -ForegroundColor Yellow
}
答案 2 :(得分:0)
我已使用netcat的Windows端口从Windows计算机远程清除Redis缓存,如下所示:
$redisCommands = "SELECT $redisDBIndex`r`nFLUSHDB`r`nQUIT`r`n"
$redisCommands | .\nc $redisServer 6379
$redisDBIndex
是您要清除的Redis缓存索引。或者,如果您想清除所有内容,则只需使用命令FLAUSHALL
。 $redisServer
是您的Redis服务器。只需管道传输到nc。
我也在此处进行了记录:https://jaeyow.github.io/fullstack-developer/automate-redis-cache-flush-in-powershell/#