Очистка Azure Redis Cache с помощью PowerShell во время развертывания
При развертывании новых версий нашего веб-приложения в службе приложений Azure у меня есть требование очистить данные в связанном кеше Redis Cache Azure. Это сделано для того, чтобы мы не возвращали старые версии элементов, которые имеют изменения схемы в новой версии.
Мы развертываем с помощью Octopus Deploy, и я ранее пытался выполнить следующую команду PowerShell для сброса кэша:
Reset-AzureRmRedisCache -ResourceGroupName "$ResourceGroup" -Name "$PrimaryCacheName" -RebootType "AllNodes" -Force
Это работает успешно, но это довольно сложно, и у нас периодически возникают проблемы с подключением, которые, как я подозреваю, вызваны тем, что мы перезагружаем Redis и удаляем существующие подключения.
В идеале я бы хотел выполнить FLUSHALL
Команда через PowerShell. Это лучший подход, и можно ли выполнить в PowerShell с помощью библиотеки StackExchange.Redis?
1 ответ
Командлет Reset-AzureRmRedisCache перезапускает узлы экземпляра Redis Cache Azure, что, я согласен, несколько избыточно для ваших требований.
Да, в PowerShell можно выполнить команду Redis FLUSHALL.
В качестве предварительного условия необходимо установить интерфейс командной строки Redis и установить переменную среды, чтобы указать путь к исполняемому / двоичному файлу Redis CLI в вашей среде.
Затем вы можете выполнить в PowerShell, используя команды Redis-CLI, как показано ниже.
Invoke-Command -ScriptBlock { redis-cli -h <hostname>.redis.cache.windows.net -p <redisPort> -a <password> }
Invoke-Command -ScriptBlock { redis-cli flushall }
В конце концов, я реализовал это путем вызова библиотеки StackExchange.Redis через PowerShell, поэтому вам понадобится копия этой 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
}
Я использовал порт netcat для Windows, чтобы удаленно очистить кэш Redis со своего компьютера с Windows, например:
$redisCommands = "SELECT $redisDBIndex`r`nFLUSHDB`r`nQUIT`r`n"
$redisCommands | .\nc $redisServer 6379
где $redisDBIndex
это индекс Redis Cache, который вы хотите очистить. Или просто команда FLAUSHALL
если хочешь все очистить. $redisServer
ваш сервер Redis. И просто пайп к нк.
Я также задокументировал это здесь: https://jaeyow.github.io/fullstack-developer/automate-redis-cache-flush-in-powershell/