在部署期间使用PowerShell清除Azure Redis缓存

时间:2017-08-31 09:35:48

标签: azure redis azure-powershell stackexchange.redis redis-cli

在将新版本的Web应用程序部署到Azure App Service时,我需要清除关联的Azure Redis缓存中的数据。这是为了确保我们不会返回在新版本中具有架构更改的旧版本项目。

我们正在使用Octopus Deploy进行部署,之前我尝试执行以下PowerShell命令来重置缓存:

Reset-AzureRmRedisCache -ResourceGroupName "$ResourceGroup" -Name "$PrimaryCacheName" -RebootType "AllNodes" -Force

这项工作成功但有点笨拙,我们遇到间歇性的连接问题,我怀疑是因为我们正在重启Redis并丢弃现有的连接。

理想情况下,我只想通过PowerShell执行FLUSHALL命令。这是一种更好的方法,是否可以使用StackExchange.Redis库在PowerShell中执行?

3 个答案:

答案 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 }

上面代码示例的执行结果如下所示: enter image description here

答案 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/#