[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69ANWN23JDVVP85X0EXG561":3,"skill-same:01M69ANWN23JDVVP85X0EXG561":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M69ANWN23JDVVP85X0EXG561","azure-resource-manager-redis-dotnet",null,"Azure Resource Manager SDK for Redis in .NET. Use for MANAGEMENT PLANE operations: creating\u002Fmanaging Azure Cache for Redis instances, firewall rules, access keys, patch schedules, linked servers (geo-replication), and private endpoints via Azure Resource Manager. NOT for data plane operations (get\u002Fset keys, pub\u002Fsub) - use StackExchange.Redis for that. Triggers: \"Redis cache\", \"create Redis\", \"manage Redis\", \"ARM Redis\", \"RedisResource\", \"provision Redis\", \"Azure Cache for Redis\".","microsoft\u002Fskills","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69AJYYW4E1RMSYCQDJ4FJSH",3195,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-resource-manager-redis-dotnet\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,9],"dotnet","azure","azure resource manager redis dotnet","manager","redis","azure resource manager","patch","for","plane","replication","triggers","get","instances","geo","manage","sdk","access","firewall","SET","data","create","2026-11-10 10:12:30",false,"---\nname: azure-resource-manager-redis-dotnet\ndescription: |\n  Azure Resource Manager SDK for Redis in .NET. Use for MANAGEMENT PLANE operations: creating\u002Fmanaging Azure Cache for Redis instances, firewall rules, access keys, patch schedules, linked servers (geo-replication), and private endpoints via Azure Resource Manager. NOT for data plane operations (get\u002Fset keys, pub\u002Fsub) - use StackExchange.Redis for that. Triggers: \"Redis cache\", \"create Redis\", \"manage Redis\", \"ARM Redis\", \"RedisResource\", \"provision Redis\", \"Azure Cache for Redis\".\nlicense: MIT\nmetadata:\n  author: Microsoft\n  version: \"1.0.0\"\n  package: Azure.ResourceManager.Redis\n---\n\n# Azure.ResourceManager.Redis (.NET)\n\nManagement plane SDK for provisioning and managing Azure Cache for Redis resources via Azure Resource Manager.\n\n> **⚠️ Management vs Data Plane**\n> - **This SDK (Azure.ResourceManager.Redis)**: Create caches, configure firewall rules, manage access keys, set up geo-replication\n> - **Data Plane SDK (StackExchange.Redis)**: Get\u002Fset keys, pub\u002Fsub, streams, Lua scripts\n\n## Installation\n\n```bash\ndotnet add package Azure.ResourceManager.Redis\ndotnet add package Azure.Identity\n```\n\n**Current Version**: 1.5.1 (Stable)  \n**API Version**: 2024-11-01  \n**Target Frameworks**: .NET 8.0, .NET Standard 2.0\n\n## Environment Variables\n\n```bash\nAZURE_SUBSCRIPTION_ID=\u003Cyour-subscription-id>  # Required: Azure subscription ID\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\nAZURE_TENANT_ID=\u003Ctenant-id>  # For service principal auth (optional)\nAZURE_CLIENT_ID=\u003Cclient-id>  # For service principal auth (optional)\nAZURE_CLIENT_SECRET=\u003Cclient-secret>  # For service principal auth (optional)\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.Redis;\n\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nvar credential = new DefaultAzureCredential(\n    DefaultAzureCredential.DefaultEnvironmentVariableName\n);\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-dotnet#credential-classes\n\u002F\u002F var credential = new ManagedIdentityCredential();\nvar armClient = new ArmClient(credential);\n\n\u002F\u002F Get subscription\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\");\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\n```\n\n## Resource Hierarchy\n\n```\nArmClient\n└── SubscriptionResource\n    └── ResourceGroupResource\n        └── RedisResource\n            ├── RedisFirewallRuleResource\n            ├── RedisPatchScheduleResource\n            ├── RedisLinkedServerWithPropertyResource\n            ├── RedisPrivateEndpointConnectionResource\n            └── RedisCacheAccessPolicyResource\n```\n\n## Core Workflows\n\n### 1. Create Redis Cache\n\n```csharp\nusing Azure.ResourceManager.Redis;\nusing Azure.ResourceManager.Redis.Models;\n\n\u002F\u002F Get resource group\nvar resourceGroup = await subscription\n    .GetResourceGroupAsync(\"my-resource-group\");\n\n\u002F\u002F Define cache configuration\nvar cacheData = new RedisCreateOrUpdateContent(\n    location: AzureLocation.EastUS,\n    sku: new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 1))\n{\n    EnableNonSslPort = false,\n    MinimumTlsVersion = RedisTlsVersion.Tls1_2,\n    RedisConfiguration = new RedisCommonConfiguration\n    {\n        MaxMemoryPolicy = \"volatile-lru\"\n    },\n    Tags =\n    {\n        [\"environment\"] = \"production\"\n    }\n};\n\n\u002F\u002F Create cache (long-running operation)\nvar cacheCollection = resourceGroup.Value.GetAllRedis();\nvar operation = await cacheCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-redis-cache\",\n    cacheData);\n\nRedisResource cache = operation.Value;\nConsole.WriteLine($\"Cache created: {cache.Data.HostName}\");\n```\n\n### 2. Get Redis Cache\n\n```csharp\n\u002F\u002F Get existing cache\nvar cache = await resourceGroup.Value\n    .GetRedisAsync(\"my-redis-cache\");\n\nConsole.WriteLine($\"Host: {cache.Value.Data.HostName}\");\nConsole.WriteLine($\"Port: {cache.Value.Data.Port}\");\nConsole.WriteLine($\"SSL Port: {cache.Value.Data.SslPort}\");\nConsole.WriteLine($\"Provisioning State: {cache.Value.Data.ProvisioningState}\");\n```\n\n### 3. Update Redis Cache\n\n```csharp\nvar patchData = new RedisPatch\n{\n    Sku = new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 2),\n    RedisConfiguration = new RedisCommonConfiguration\n    {\n        MaxMemoryPolicy = \"allkeys-lru\"\n    }\n};\n\nvar updateOperation = await cache.Value.UpdateAsync(\n    WaitUntil.Completed,\n    patchData);\n```\n\n### 4. Delete Redis Cache\n\n```csharp\nawait cache.Value.DeleteAsync(WaitUntil.Completed);\n```\n\n### 5. Get Access Keys\n\n```csharp\nvar keys = await cache.Value.GetKeysAsync();\nConsole.WriteLine($\"Primary Key: {keys.Value.PrimaryKey}\");\nConsole.WriteLine($\"Secondary Key: {keys.Value.SecondaryKey}\");\n```\n\n### 6. Regenerate Access Keys\n\n```csharp\nvar regenerateContent = new RedisRegenerateKeyContent(RedisRegenerateKeyType.Primary);\nvar newKeys = await cache.Value.RegenerateKeyAsync(regenerateContent);\nConsole.WriteLine($\"New Primary Key: {newKeys.Value.PrimaryKey}\");\n```\n\n### 7. Manage Firewall Rules\n\n```csharp\n\u002F\u002F Create firewall rule\nvar firewallData = new RedisFirewallRuleData(\n    startIP: System.Net.IPAddress.Parse(\"10.0.0.1\"),\n    endIP: System.Net.IPAddress.Parse(\"10.0.0.255\"));\n\nvar firewallCollection = cache.Value.GetRedisFirewallRules();\nvar firewallOperation = await firewallCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"allow-internal-network\",\n    firewallData);\n\n\u002F\u002F List all firewall rules\nawait foreach (var rule in firewallCollection.GetAllAsync())\n{\n    Console.WriteLine($\"Rule: {rule.Data.Name} ({rule.Data.StartIP} - {rule.Data.EndIP})\");\n}\n\n\u002F\u002F Delete firewall rule\nvar ruleToDelete = await firewallCollection.GetAsync(\"allow-internal-network\");\nawait ruleToDelete.Value.DeleteAsync(WaitUntil.Completed);\n```\n\n### 8. Configure Patch Schedule (Premium SKU)\n\n```csharp\n\u002F\u002F Patch schedules require Premium SKU\nvar scheduleData = new RedisPatchScheduleData(\n    new[]\n    {\n        new RedisPatchScheduleSetting(RedisDayOfWeek.Saturday, 2) \u002F\u002F 2 AM Saturday\n        {\n            MaintenanceWindow = TimeSpan.FromHours(5)\n        },\n        new RedisPatchScheduleSetting(RedisDayOfWeek.Sunday, 2) \u002F\u002F 2 AM Sunday\n        {\n            MaintenanceWindow = TimeSpan.FromHours(5)\n        }\n    });\n\nvar scheduleCollection = cache.Value.GetRedisPatchSchedules();\nawait scheduleCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    RedisPatchScheduleDefaultName.Default,\n    scheduleData);\n```\n\n### 9. Import\u002FExport Data (Premium SKU)\n\n```csharp\n\u002F\u002F Import data from blob storage\nvar importContent = new ImportRdbContent(\n    files: new[] { \"https:\u002F\u002Fmystorageaccount.blob.core.windows.net\u002Fcontainer\u002Fdump.rdb\" },\n    format: \"RDB\");\n\nawait cache.Value.ImportDataAsync(WaitUntil.Completed, importContent);\n\n\u002F\u002F Export data to blob storage\nvar exportContent = new ExportRdbContent(\n    prefix: \"backup\",\n    container: \"https:\u002F\u002Fmystorageaccount.blob.core.windows.net\u002Fcontainer?sastoken\",\n    format: \"RDB\");\n\nawait cache.Value.ExportDataAsync(WaitUntil.Completed, exportContent);\n```\n\n### 10. Force Reboot\n\n```csharp\nvar rebootContent = new RedisRebootContent\n{\n    RebootType = RedisRebootType.AllNodes,\n    ShardId = 0 \u002F\u002F For clustered caches\n};\n\nawait cache.Value.ForceRebootAsync(rebootContent);\n```\n\n## SKU Reference\n\n| SKU | Family | Capacity | Features |\n|-----|--------|----------|----------|\n| Basic | C | 0-6 | Single node, no SLA, dev\u002Ftest only |\n| Standard | C | 0-6 | Two nodes (primary\u002Freplica), SLA |\n| Premium | P | 1-5 | Clustering, geo-replication, VNet, persistence |\n\n**Capacity Sizes (Family C - Basic\u002FStandard)**:\n- C0: 250 MB\n- C1: 1 GB\n- C2: 2.5 GB\n- C3: 6 GB\n- C4: 13 GB\n- C5: 26 GB\n- C6: 53 GB\n\n**Capacity Sizes (Family P - Premium)**:\n- P1: 6 GB per shard\n- P2: 13 GB per shard\n- P3: 26 GB per shard\n- P4: 53 GB per shard\n- P5: 120 GB per shard\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ArmClient` | Entry point for all ARM operations |\n| `RedisResource` | Represents a Redis cache instance |\n| `RedisCollection` | Collection for cache CRUD operations |\n| `RedisFirewallRuleResource` | Firewall rule for IP filtering |\n| `RedisPatchScheduleResource` | Maintenance window configuration |\n| `RedisLinkedServerWithPropertyResource` | Geo-replication linked server |\n| `RedisPrivateEndpointConnectionResource` | Private endpoint connection |\n| `RedisCacheAccessPolicyResource` | RBAC access policy |\n| `RedisCreateOrUpdateContent` | Cache creation payload |\n| `RedisPatch` | Cache update payload |\n| `RedisSku` | SKU configuration (name, family, capacity) |\n| `RedisAccessKeys` | Primary and secondary access keys |\n| `RedisRegenerateKeyContent` | Key regeneration request |\n\n## Best Practices\n\n1. **Use `WaitUntil.Completed`** for operations that must finish before proceeding\n2. **Use `WaitUntil.Started`** when you want to poll manually or run operations in parallel\n3. **Always use `DefaultAzureCredential`** — never hardcode keys\n4. **Handle `RequestFailedException`** for ARM API errors\n5. **Use `CreateOrUpdateAsync`** for idempotent operations\n6. **Navigate hierarchy** via `Get*` methods (e.g., `cache.GetRedisFirewallRules()`)\n7. **Use Premium SKU** for production workloads requiring geo-replication, clustering, or persistence\n8. **Enable TLS 1.2 minimum** — set `MinimumTlsVersion = RedisTlsVersion.Tls1_2`\n9. **Disable non-SSL port** — set `EnableNonSslPort = false` for security\n10. **Rotate keys regularly** — use `RegenerateKeyAsync` and update connection strings\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var operation = await cacheCollection.CreateOrUpdateAsync(\n        WaitUntil.Completed, cacheName, cacheData);\n}\ncatch (RequestFailedException ex) when (ex.Status == 409)\n{\n    Console.WriteLine(\"Cache already exists\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 400)\n{\n    Console.WriteLine($\"Invalid configuration: {ex.Message}\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Common Pitfalls\n\n1. **SKU downgrades not allowed** — You cannot downgrade from Premium to Standard\u002FBasic\n2. **Clustering requires Premium** — Shard configuration only available on Premium SKU\n3. **Geo-replication requires Premium** — Linked servers only work with Premium caches\n4. **VNet injection requires Premium** — Virtual network support is Premium-only\n5. **Patch schedules require Premium** — Maintenance windows only configurable on Premium\n6. **Cache name globally unique** — Redis cache names must be unique across all Azure subscriptions\n7. **Long provisioning times** — Cache creation can take 15-20 minutes; use `WaitUntil.Started` for async patterns\n\n## Connecting with StackExchange.Redis (Data Plane)\n\nAfter creating the cache with this management SDK, use StackExchange.Redis for data operations:\n\n```csharp\nusing StackExchange.Redis;\n\n\u002F\u002F Get connection info from management SDK\nvar cache = await resourceGroup.Value.GetRedisAsync(\"my-redis-cache\");\nvar keys = await cache.Value.GetKeysAsync();\n\n\u002F\u002F Connect with StackExchange.Redis\nvar connectionString = $\"{cache.Value.Data.HostName}:{cache.Value.Data.SslPort},password={keys.Value.PrimaryKey},ssl=True,abortConnect=False\";\nvar connection = ConnectionMultiplexer.Connect(connectionString);\nvar db = connection.GetDatabase();\n\n\u002F\u002F Data operations\nawait db.StringSetAsync(\"key\", \"value\");\nvar value = await db.StringGetAsync(\"key\");\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `StackExchange.Redis` | Data plane (get\u002Fset, pub\u002Fsub, streams) | `dotnet add package StackExchange.Redis` |\n| `Azure.ResourceManager.Redis` | Management plane (this SDK) | `dotnet add package Azure.ResourceManager.Redis` |\n| `Microsoft.Azure.StackExchangeRedis` | Azure-specific Redis extensions | `dotnet add package Microsoft.Azure.StackExchangeRedis` |\n","# Azure.ResourceManager.Redis (.NET)\n\nManagement plane SDK for provisioning and managing Azure Cache for Redis resources via Azure Resource Manager.\n\n> **⚠️ Management vs Data Plane**\n> - **This SDK (Azure.ResourceManager.Redis)**: Create caches, configure firewall rules, manage access keys, set up geo-replication\n> - **Data Plane SDK (StackExchange.Redis)**: Get\u002Fset keys, pub\u002Fsub, streams, Lua scripts\n\n## Installation\n\n```bash\ndotnet add package Azure.ResourceManager.Redis\ndotnet add package Azure.Identity\n```\n\n**Current Version**: 1.5.1 (Stable)  \n**API Version**: 2024-11-01  \n**Target Frameworks**: .NET 8.0, .NET Standard 2.0\n\n## Environment Variables\n\n```bash\nAZURE_SUBSCRIPTION_ID=\u003Cyour-subscription-id>  # Required: Azure subscription ID\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\nAZURE_TENANT_ID=\u003Ctenant-id>  # For service principal auth (optional)\nAZURE_CLIENT_ID=\u003Cclient-id>  # For service principal auth (optional)\nAZURE_CLIENT_SECRET=\u003Cclient-secret>  # For service principal auth (optional)\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.Redis;\n\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nvar credential = new DefaultAzureCredential(\n    DefaultAzureCredential.DefaultEnvironmentVariableName\n);\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-dotnet#credential-classes\n\u002F\u002F var credential = new ManagedIdentityCredential();\nvar armClient = new ArmClient(credential);\n\n\u002F\u002F Get subscription\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\");\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\n```\n\n## Resource Hierarchy\n\n```\nArmClient\n└── SubscriptionResource\n    └── ResourceGroupResource\n        └── RedisResource\n            ├── RedisFirewallRuleResource\n            ├── RedisPatchScheduleResource\n            ├── RedisLinkedServerWithPropertyResource\n            ├── RedisPrivateEndpointConnectionResource\n            └── RedisCacheAccessPolicyResource\n```\n\n## Core Workflows\n\n### 1. Create Redis Cache\n\n```csharp\nusing Azure.ResourceManager.Redis;\nusing Azure.ResourceManager.Redis.Models;\n\n\u002F\u002F Get resource group\nvar resourceGroup = await subscription\n    .GetResourceGroupAsync(\"my-resource-group\");\n\n\u002F\u002F Define cache configuration\nvar cacheData = new RedisCreateOrUpdateContent(\n    location: AzureLocation.EastUS,\n    sku: new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 1))\n{\n    EnableNonSslPort = false,\n    MinimumTlsVersion = RedisTlsVersion.Tls1_2,\n    RedisConfiguration = new RedisCommonConfiguration\n    {\n        MaxMemoryPolicy = \"volatile-lru\"\n    },\n    Tags =\n    {\n        [\"environment\"] = \"production\"\n    }\n};\n\n\u002F\u002F Create cache (long-running operation)\nvar cacheCollection = resourceGroup.Value.GetAllRedis();\nvar operation = await cacheCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-redis-cache\",\n    cacheData);\n\nRedisResource cache = operation.Value;\nConsole.WriteLine($\"Cache created: {cache.Data.HostName}\");\n```\n\n### 2. Get Redis Cache\n\n```csharp\n\u002F\u002F Get existing cache\nvar cache = await resourceGroup.Value\n    .GetRedisAsync(\"my-redis-cache\");\n\nConsole.WriteLine($\"Host: {cache.Value.Data.HostName}\");\nConsole.WriteLine($\"Port: {cache.Value.Data.Port}\");\nConsole.WriteLine($\"SSL Port: {cache.Value.Data.SslPort}\");\nConsole.WriteLine($\"Provisioning State: {cache.Value.Data.ProvisioningState}\");\n```\n\n### 3. Update Redis Cache\n\n```csharp\nvar patchData = new RedisPatch\n{\n    Sku = new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 2),\n    RedisConfiguration = new RedisCommonConfiguration\n    {\n        MaxMemoryPolicy = \"allkeys-lru\"\n    }\n};\n\nvar updateOperation = await cache.Value.UpdateAsync(\n    WaitUntil.Completed,\n    patchData);\n```\n\n### 4. Delete Redis Cache\n\n```csharp\nawait cache.Value.DeleteAsync(WaitUntil.Completed);\n```\n\n### 5. Get Access Keys\n\n```csharp\nvar keys = await cache.Value.GetKeysAsync();\nConsole.WriteLine($\"Primary Key: {keys.Value.PrimaryKey}\");\nConsole.WriteLine($\"Secondary Key: {keys.Value.SecondaryKey}\");\n```\n\n### 6. Regenerate Access Keys\n\n```csharp\nvar regenerateContent = new RedisRegenerateKeyContent(RedisRegenerateKeyType.Primary);\nvar newKeys = await cache.Value.RegenerateKeyAsync(regenerateContent);\nConsole.WriteLine($\"New Primary Key: {newKeys.Value.PrimaryKey}\");\n```\n\n### 7. Manage Firewall Rules\n\n```csharp\n\u002F\u002F Create firewall rule\nvar firewallData = new RedisFirewallRuleData(\n    startIP: System.Net.IPAddress.Parse(\"10.0.0.1\"),\n    endIP: System.Net.IPAddress.Parse(\"10.0.0.255\"));\n\nvar firewallCollection = cache.Value.GetRedisFirewallRules();\nvar firewallOperation = await firewallCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"allow-internal-network\",\n    firewallData);\n\n\u002F\u002F List all firewall rules\nawait foreach (var rule in firewallCollection.GetAllAsync())\n{\n    Console.WriteLine($\"Rule: {rule.Data.Name} ({rule.Data.StartIP} - {rule.Data.EndIP})\");\n}\n\n\u002F\u002F Delete firewall rule\nvar ruleToDelete = await firewallCollection.GetAsync(\"allow-internal-network\");\nawait ruleToDelete.Value.DeleteAsync(WaitUntil.Completed);\n```\n\n### 8. Configure Patch Schedule (Premium SKU)\n\n```csharp\n\u002F\u002F Patch schedules require Premium SKU\nvar scheduleData = new RedisPatchScheduleData(\n    new[]\n    {\n        new RedisPatchScheduleSetting(RedisDayOfWeek.Saturday, 2) \u002F\u002F 2 AM Saturday\n        {\n            MaintenanceWindow = TimeSpan.FromHours(5)\n        },\n        new RedisPatchScheduleSetting(RedisDayOfWeek.Sunday, 2) \u002F\u002F 2 AM Sunday\n        {\n            MaintenanceWindow = TimeSpan.FromHours(5)\n        }\n    });\n\nvar scheduleCollection = cache.Value.GetRedisPatchSchedules();\nawait scheduleCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    RedisPatchScheduleDefaultName.Default,\n    scheduleData);\n```\n\n### 9. Import\u002FExport Data (Premium SKU)\n\n```csharp\n\u002F\u002F Import data from blob storage\nvar importContent = new ImportRdbContent(\n    files: new[] { \"https:\u002F\u002Fmystorageaccount.blob.core.windows.net\u002Fcontainer\u002Fdump.rdb\" },\n    format: \"RDB\");\n\nawait cache.Value.ImportDataAsync(WaitUntil.Completed, importContent);\n\n\u002F\u002F Export data to blob storage\nvar exportContent = new ExportRdbContent(\n    prefix: \"backup\",\n    container: \"https:\u002F\u002Fmystorageaccount.blob.core.windows.net\u002Fcontainer?sastoken\",\n    format: \"RDB\");\n\nawait cache.Value.ExportDataAsync(WaitUntil.Completed, exportContent);\n```\n\n### 10. Force Reboot\n\n```csharp\nvar rebootContent = new RedisRebootContent\n{\n    RebootType = RedisRebootType.AllNodes,\n    ShardId = 0 \u002F\u002F For clustered caches\n};\n\nawait cache.Value.ForceRebootAsync(rebootContent);\n```\n\n## SKU Reference\n\n| SKU | Family | Capacity | Features |\n|-----|--------|----------|----------|\n| Basic | C | 0-6 | Single node, no SLA, dev\u002Ftest only |\n| Standard | C | 0-6 | Two nodes (primary\u002Freplica), SLA |\n| Premium | P | 1-5 | Clustering, geo-replication, VNet, persistence |\n\n**Capacity Sizes (Family C - Basic\u002FStandard)**:\n- C0: 250 MB\n- C1: 1 GB\n- C2: 2.5 GB\n- C3: 6 GB\n- C4: 13 GB\n- C5: 26 GB\n- C6: 53 GB\n\n**Capacity Sizes (Family P - Premium)**:\n- P1: 6 GB per shard\n- P2: 13 GB per shard\n- P3: 26 GB per shard\n- P4: 53 GB per shard\n- P5: 120 GB per shard\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ArmClient` | Entry point for all ARM operations |\n| `RedisResource` | Represents a Redis cache instance |\n| `RedisCollection` | Collection for cache CRUD operations |\n| `RedisFirewallRuleResource` | Firewall rule for IP filtering |\n| `RedisPatchScheduleResource` | Maintenance window configuration |\n| `RedisLinkedServerWithPropertyResource` | Geo-replication linked server |\n| `RedisPrivateEndpointConnectionResource` | Private endpoint connection |\n| `RedisCacheAccessPolicyResource` | RBAC access policy |\n| `RedisCreateOrUpdateContent` | Cache creation payload |\n| `RedisPatch` | Cache update payload |\n| `RedisSku` | SKU configuration (name, family, capacity) |\n| `RedisAccessKeys` | Primary and secondary access keys |\n| `RedisRegenerateKeyContent` | Key regeneration request |\n\n## Best Practices\n\n1. **Use `WaitUntil.Completed`** for operations that must finish before proceeding\n2. **Use `WaitUntil.Started`** when you want to poll manually or run operations in parallel\n3. **Always use `DefaultAzureCredential`** — never hardcode keys\n4. **Handle `RequestFailedException`** for ARM API errors\n5. **Use `CreateOrUpdateAsync`** for idempotent operations\n6. **Navigate hierarchy** via `Get*` methods (e.g., `cache.GetRedisFirewallRules()`)\n7. **Use Premium SKU** for production workloads requiring geo-replication, clustering, or persistence\n8. **Enable TLS 1.2 minimum** — set `MinimumTlsVersion = RedisTlsVersion.Tls1_2`\n9. **Disable non-SSL port** — set `EnableNonSslPort = false` for security\n10. **Rotate keys regularly** — use `RegenerateKeyAsync` and update connection strings\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var operation = await cacheCollection.CreateOrUpdateAsync(\n        WaitUntil.Completed, cacheName, cacheData);\n}\ncatch (RequestFailedException ex) when (ex.Status == 409)\n{\n    Console.WriteLine(\"Cache already exists\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 400)\n{\n    Console.WriteLine($\"Invalid configuration: {ex.Message}\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Common Pitfalls\n\n1. **SKU downgrades not allowed** — You cannot downgrade from Premium to Standard\u002FBasic\n2. **Clustering requires Premium** — Shard configuration only available on Premium SKU\n3. **Geo-replication requires Premium** — Linked servers only work with Premium caches\n4. **VNet injection requires Premium** — Virtual network support is Premium-only\n5. **Patch schedules require Premium** — Maintenance windows only configurable on Premium\n6. **Cache name globally unique** — Redis cache names must be unique across all Azure subscriptions\n7. **Long provisioning times** — Cache creation can take 15-20 minutes; use `WaitUntil.Started` for async patterns\n\n## Connecting with StackExchange.Redis (Data Plane)\n\nAfter creating the cache with this management SDK, use StackExchange.Redis for data operations:\n\n```csharp\nusing StackExchange.Redis;\n\n\u002F\u002F Get connection info from management SDK\nvar cache = await resourceGroup.Value.GetRedisAsync(\"my-redis-cache\");\nvar keys = await cache.Value.GetKeysAsync();\n\n\u002F\u002F Connect with StackExchange.Redis\nvar connectionString = $\"{cache.Value.Data.HostName}:{cache.Value.Data.SslPort},password={keys.Value.PrimaryKey},ssl=True,abortConnect=False\";\nvar connection = ConnectionMultiplexer.Connect(connectionString);\nvar db = connection.GetDatabase();\n\n\u002F\u002F Data operations\nawait db.StringSetAsync(\"key\", \"value\");\nvar value = await db.StringGetAsync(\"key\");\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `StackExchange.Redis` | Data plane (get\u002Fset, pub\u002Fsub, streams) | `dotnet add package StackExchange.Redis` |\n| `Azure.ResourceManager.Redis` | Management plane (this SDK) | `dotnet add package Azure.ResourceManager.Redis` |\n| `Microsoft.Azure.StackExchangeRedis` | Azure-specific Redis extensions | `dotnet add package Microsoft.Azure.StackExchangeRedis` |\n",{"name":5,"license":15,"metadata":45,"description":48},{"author":12,"package":46,"version":47},"Azure.ResourceManager.Redis","1.0.0","Azure Resource Manager SDK for Redis in .NET. Use for MANAGEMENT PLANE operations: creating\u002Fmanaging Azure Cache for Redis instances, firewall rules, access keys, patch schedules, linked servers (geo-replication), and private endpoints via Azure Resource Manager. NOT for data plane operations (get\u002Fset keys, pub\u002Fsub) - use StackExchange.Redis for that. Triggers: \"Redis cache\", \"create Redis\", \"manage Redis\", \"ARM Redis\", \"RedisResource\", \"provision Redis\", \"Azure Cache for Redis\".\n","main","3f5b461b2314e01c400564051e92469114c5b68f",".github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-resource-manager-redis-dotnet",365,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","https:\u002F\u002Fmicrosoft.github.io\u002Fskills\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-12 02:02:58",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add microsoft\u002Fskills --skill azure-resource-manager-redis-dotnet",{"tool":65,"command":66},"bunx","bunx skills add microsoft\u002Fskills --skill azure-resource-manager-redis-dotnet",{"tool":68,"command":69},"pnpm","pnpm dlx skills add microsoft\u002Fskills --skill azure-resource-manager-redis-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-resource-manager-redis-dotnet\u002FSKILL.md",true,[],[74,102,140,167,187,224],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":85,"publishedAt":40},"01M69B4JCRQV5SPXAFCKXQRV0H","skill-creator","Guide for creating effective skills for AI coding agents working with Azure SDKs and Microsoft Foundry services. Use when creating new skills or updating existing skills.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fskill-creator\u002FSKILL.md",[80],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[86,87,88,9,89,90,91,20,92,93,94,95,96,97,98,26,99,100,101],"skill creator","creator","coding agents","foundry","microsoft foundry","ai coding agents","services","coding","guide","use","ai coding","with","sdks","Existing","when","new",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":118,"publishedAt":40},"01M69B4FD57V1MYKRWAJJECTZ7","podcast-generation","Generate AI-powered podcast-style audio narratives using Azure OpenAI's GPT Realtime Mini model via WebSocket. Use when building text-to-speech features, audio narrative generation, podcast creation from content, or integrating with Azure OpenAI Realtime API for real audio output. Covers full-stack implementation from React frontend to Python FastAPI backend with WebSocket streaming.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fpodcast-generation\u002FSKILL.md",[108,111,114,117],{"categoryNo":109,"categoryName":110,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":112,"categoryName":113,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":115,"categoryName":116,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[119,120,121,122,123,124,125,20,126,127,128,129,130,131,132,133,134,135,136,137,138,100,139],"podcast generation","podcast","generation","frontend","python","react","realtime","azure openai","generate","streaming","api","Audio","stack","text","model","fastapi","creation","python fastapi","narrative","features","fastapi backend",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":147,"publishedAt":40},"01M69B4CYPM5SESY5ZWEFDXEQZ","microsoft-docs","Understand Microsoft technologies by querying official documentation. Use whenever the user asks how something works, wants tutorials, needs configuration options, limits, quotas, or best practices for any Microsoft technology (Azure, .NET, M365, Windows, Power Platform, etc.)—even if they don't mention \"docs.\" If the question is about understanding a concept rather than writing code, this is the right skill.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fmicrosoft-docs\u002FSKILL.md",[146],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[148,9,149,150,151,152,153,154,155,156,157,20,158,159,160,95,161,62,162,163,164,165,166,26],"docs","microsoft docs","MCP","writing","cli","mcp server","windows","power platform","official","documentation","learn","best practices","question","power","back","technology","platform","learn mcp","concept",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":40},"01M69B49C3YPD1ZJ3NC0HPCY58","mcp-builder","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP), Node\u002FTypeScript (MCP SDK), or C#\u002F.NET (Microsoft MCP SDK).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fmcp-builder\u002FSKILL.md",[173],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},[150,175,176,177,123,178,34,179,9,180,181,133,182,183,94,95,184,185,186,97,26,100],"mcp builder","builder","typescript","llms","model context protocol","fastmcp","Tools","node","context","integrate","mcp sdk","building mcp servers",{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":205,"publishedAt":40},"01M69B467A7CDMFQ0T6Q0ZA12Q","kql","KQL language expertise for writing correct, efficient Kusto Query Language queries. Covers syntax gotchas, join patterns, dynamic types, datetime pitfalls, regex patterns, serialization, memory management, result-size discipline, and advanced functions (geo, vector, graph). USE THIS SKILL whenever writing, debugging, or reviewing KQL queries — even simple ones — because the gotchas section prevents the most common errors that waste tool calls and cause expensive retry cascades. Trigger on: KQL, Kusto, ADX, Azure Data Explorer, Fabric Real-Time Intelligence, EventHouse, Log Analytics, log analysis, data exploration, time series, anomaly detection, summarize, where clause, join, extend, project, let statement, parse operator, extract function, any mention of pipe-forward query syntax.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fkql\u002FSKILL.md",[193,196,197,202],{"categoryNo":194,"categoryName":195,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},{"categoryNo":198,"categoryName":199,"taxonomyType":200,"taxonomyTypeDesc":201},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",{"categoryNo":203,"categoryName":204,"taxonomyType":200,"taxonomyTypeDesc":201},"01JBSEEDCAT000000000000036","内容创作者",[189,151,206,207,208,20,209,210,211,212,213,32,214,215,216,217,218,219,220,26,221,222,223],"summarize","memory","analytics","vector","time series","tool","discipline","log","exploration","pipe","time","project","regex","join","datetime","section","anomaly","parse",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":228,"categories":229,"keywords":230,"publishedAt":40},"01M69B44HJQ7897EZ7NE7DWQX3","github-issue-creator","Convert raw notes, error logs, voice dictation, or screenshots into crisp GitHub-flavored markdown issue reports. Use when the user pastes bug info, error messages, or informal descriptions and wants a structured GitHub issue. Supports images\u002FGIFs for visual evidence.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fgithub-issue-creator\u002FSKILL.md",[],[231,232,233,234,87,235,236,237,238,239,240,241,95,242,243,244,245,246,247,26,100],"github","github issue creator","github issue","issue","issue creator","screenshots","notes","logs","error messages","messages","convert","evidence","reports","images","info","visual","error"]