Очистка 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/

Другие вопросы по тегам