Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Azure Resource Manager SDK for Redis in .NET.
.claude/skills/azure-resource-manager-redis-dotnet/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-22 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
Management plane SDK for provisioning and managing Azure Cache for Redis resources via Azure Resource Manager.
> ⚠️ Management vs Data Plane > - This SDK (Azure.ResourceManager.Redis): Create caches, configure firewall rules, manage access keys, set up geo-replication > - Data Plane SDK (StackExchange.Redis): Get/set keys, pub/sub, streams, Lua scripts
bashdotnet add package Azure.ResourceManager.Redis dotnet add package Azure.Identity
Current Version: 1.5.1 (Stable) API Version: 2024-11-01 Target Frameworks: .NET 8.0, .NET Standard 2.0
bashAZURE_SUBSCRIPTION_ID=<your-subscription-id> # For service principal auth (optional) AZURE_TENANT_ID=<tenant-id> AZURE_CLIENT_ID=<client-id> AZURE_CLIENT_SECRET=<client-secret>
csharpusing Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Redis; // Always use DefaultAzureCredential var credential = new DefaultAzureCredential(); var armClient = new ArmClient(credential); // Get subscription var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID"); var subscription = armClient.GetSubscriptionResource( new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
ArmClient
└── SubscriptionResource
└── ResourceGroupResource
└── RedisResource
├── RedisFirewallRuleResource
├── RedisPatchScheduleResource
├── RedisLinkedServerWithPropertyResource
├── RedisPrivateEndpointConnectionResource
└── RedisCacheAccessPolicyResourcecsharpusing Azure.ResourceManager.Redis; using Azure.ResourceManager.Redis.Models; // Get resource group var resourceGroup = await subscription .GetResourceGroupAsync("my-resource-group"); // Define cache configuration var cacheData = new RedisCreateOrUpdateContent( location: AzureLocation.EastUS, sku: new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 1)) { EnableNonSslPort = false, MinimumTlsVersion = RedisTlsVersion.Tls1_2, RedisConfiguration = new RedisCommonConfiguration { MaxMemoryPolicy = "volatile-lru" }, Tags = { ["environment"] = "production" } }; // Create cache (long-running operation) var cacheCollection = resourceGroup.Value.GetAllRedis(); var operation = await cacheCollection.CreateOrUpdateAsync( WaitUntil.Completed, "my-redis-cache", cacheData); RedisResource cache = operation.Value; Console.WriteLine($"Cache created: {cache.Data.HostName}");
csharp// Get existing cache var cache = await resourceGroup.Value .GetRedisAsync("my-redis-cache"); Console.WriteLine($"Host: {cache.Value.Data.HostName}"); Console.WriteLine($"Port: {cache.Value.Data.Port}"); Console.WriteLine($"SSL Port: {cache.Value.Data.SslPort}"); Console.WriteLine($"Provisioning State: {cache.Value.Data.ProvisioningState}");
csharpvar patchData = new RedisPatch { Sku = new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 2), RedisConfiguration = new RedisCommonConfiguration { MaxMemoryPolicy = "allkeys-lru" } }; var updateOperation = await cache.Value.UpdateAsync( WaitUntil.Completed, patchData);
csharpawait cache.Value.DeleteAsync(WaitUntil.Completed);
csharpvar keys = await cache.Value.GetKeysAsync(); Console.WriteLine($"Primary Key: {keys.Value.PrimaryKey}"); Console.WriteLine($"Secondary Key: {keys.Value.SecondaryKey}");
csharpvar regenerateContent = new RedisRegenerateKeyContent(RedisRegenerateKeyType.Primary); var newKeys = await cache.Value.RegenerateKeyAsync(regenerateContent); Console.WriteLine($"New Primary Key: {newKeys.Value.PrimaryKey}");
csharp// Create firewall rule var firewallData = new RedisFirewallRuleData( startIP: System.Net.IPAddress.Parse("10.0.0.1"), endIP: System.Net.IPAddress.Parse("10.0.0.255")); var firewallCollection = cache.Value.GetRedisFirewallRules(); var firewallOperation = await firewallCollection.CreateOrUpdateAsync( WaitUntil.Completed, "allow-internal-network", firewallData); // List all firewall rules await foreach (var rule in firewallCollection.GetAllAsync()) { Console.WriteLine($"Rule: {rule.Data.Name} ({rule.Data.StartIP} - {rule.Data.EndIP})"); } // Delete firewall rule var ruleToDelete = await firewallCollection.GetAsync("allow-internal-network"); await ruleToDelete.Value.DeleteAsync(WaitUntil.Completed);
csharp// Patch schedules require Premium SKU var scheduleData = new RedisPatchScheduleData( new[] { new RedisPatchScheduleSetting(RedisDayOfWeek.Saturday, 2) // 2 AM Saturday { MaintenanceWindow = TimeSpan.FromHours(5) }, new RedisPatchScheduleSetting(RedisDayOfWeek.Sunday, 2) // 2 AM Sunday { MaintenanceWindow = TimeSpan.FromHours(5) } }); var scheduleCollection = cache.Value.GetRedisPatchSchedules(); await scheduleCollection.CreateOrUpdateAsync( WaitUntil.Completed, RedisPatchScheduleDefaultName.Default, scheduleData);
csharp// Import data from blob storage var importContent = new ImportRdbContent( files: new[] { "https://mystorageaccount.blob.core.windows.net/container/dump.rdb" }, format: "RDB"); await cache.Value.ImportDataAsync(WaitUntil.Completed, importContent); // Export data to blob storage var exportContent = new ExportRdbContent( prefix: "backup", container: "https://mystorageaccount.blob.core.windows.net/container?sastoken", format: "RDB"); await cache.Value.ExportDataAsync(WaitUntil.Completed, exportContent);
csharpvar rebootContent = new RedisRebootContent { RebootType = RedisRebootType.AllNodes, ShardId = 0 // For clustered caches }; await cache.Value.ForceRebootAsync(rebootContent);
| SKU | Family | Capacity | Features | |-----|--------|----------|----------| | Basic | C | 0-6 | Single node, no SLA, dev/test only | | Standard | C | 0-6 | Two nodes (primary/replica), SLA | | Premium | P | 1-5 | Clustering, geo-replication, VNet, persistence |
Capacity Sizes (Family C - Basic/Standard):
Capacity Sizes (Family P - Premium):
| Type | Purpose | |------|---------| | ArmClient | Entry point for all ARM operations | | RedisResource | Represents a Redis cache instance | | RedisCollection | Collection for cache CRUD operations | | RedisFirewallRuleResource | Firewall rule for IP filtering | | RedisPatchScheduleResource | Maintenance window configuration | | RedisLinkedServerWithPropertyResource | Geo-replication linked server | | RedisPrivateEndpointConnectionResource | Private endpoint connection | | RedisCacheAccessPolicyResource | RBAC access policy | | RedisCreateOrUpdateContent | Cache creation payload | | RedisPatch | Cache update payload | | RedisSku | SKU configuration (name, family, capacity) | | RedisAccessKeys | Primary and secondary access keys | | RedisRegenerateKeyContent | Key regeneration request |
WaitUntil.Completed for operations that must finish before proceedingWaitUntil.Started when you want to poll manually or run operations in parallelDefaultAzureCredential — never hardcode keysRequestFailedException for ARM API errorsCreateOrUpdateAsync for idempotent operationsGet* methods (e.g., cache.GetRedisFirewallRules())MinimumTlsVersion = RedisTlsVersion.Tls1_2EnableNonSslPort = false for securityRegenerateKeyAsync and update connection stringscsharpusing Azure; try { var operation = await cacheCollection.CreateOrUpdateAsync( WaitUntil.Completed, cacheName, cacheData); } catch (RequestFailedException ex) when (ex.Status == 409) { Console.WriteLine("Cache already exists"); } catch (RequestFailedException ex) when (ex.Status == 400) { Console.WriteLine($"Invalid configuration: {ex.Message}"); } catch (RequestFailedException ex) { Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}"); }
WaitUntil.Started for async patternsAfter creating the cache with this management SDK, use StackExchange.Redis for data operations:
csharpusing StackExchange.Redis; // Get connection info from management SDK var cache = await resourceGroup.Value.GetRedisAsync("my-redis-cache"); var keys = await cache.Value.GetKeysAsync(); // Connect with StackExchange.Redis var connectionString = $"{cache.Value.Data.HostName}:{cache.Value.Data.SslPort},password={keys.Value.PrimaryKey},ssl=True,abortConnect=False"; var connection = ConnectionMultiplexer.Connect(connectionString); var db = connection.GetDatabase(); // Data operations await db.StringSetAsync("key", "value"); var value = await db.StringGetAsync("key");
| SDK | Purpose | Install | |-----|---------|---------| | StackExchange.Redis | Data plane (get/set, pub/sub, streams) | dotnet add package StackExchange.Redis | | Azure.ResourceManager.Redis | Management plane (this SDK) | dotnet add package Azure.ResourceManager.Redis | | Microsoft.Azure.StackExchangeRedis | Azure-specific Redis extensions | dotnet add package Microsoft.Azure.StackExchangeRedis |
This skill is applicable to execute the workflow or actions described in the overview.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.