3

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

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

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

这工作成功,但有点笨拙,我们遇到间歇性连接问题,我怀疑这是由于我们正在重新启动 Redis 并删除现有连接而引起的。

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

4

3 回答 3

2

Reset-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 }

上面代码示例的执行结果如下图所示: 在此处输入图像描述

于 2017-08-31T10:00:20.470 回答
2

我最终实现这一点的方式是通过 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
}
于 2019-06-17T07:00:40.577 回答
0

我已经使用 netcat 的 Windows 端口从我的 Windows 机器远程清除 Redis 缓存,如下所示:

$redisCommands = "SELECT $redisDBIndex`r`nFLUSHDB`r`nQUIT`r`n"
$redisCommands | .\nc $redisServer 6379

$redisDBIndex要清除的 Redis Cache 索引在哪里。FLAUSHALL如果您想清除所有内容,或者只是命令。$redisServer是你的 Redis 服务器。并简单地通过管道连接到 nc。

我也在这里记录了它:https ://jaeyow.github.io/fullstack-developer/automate-redis-cache-flush-in-powershell/#

于 2019-06-15T22:45:05.233 回答