[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RKRWBZECFJM9QQPNJ7QB5":3,"skill-same:01M71RKRWBZECFJM9QQPNJ7QB5":48},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":12,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":33,"install":34,"resources":47},"01M71RKRWBZECFJM9QQPNJ7QB5","azure-resource-manager-redis-dotnet",null,"javiertarazon\u002Fide-agente-free-jt7-","javiertarazon","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F153141207?v=4","01M71R52TB3S9HXKH6WSNT8A7V","01M71R52VG5KS2DKDDH4GDQ30A",0,"MIT","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fazure-resource-manager-redis-dotnet\u002FSKILL.md",[],[17,18,19,20,21,22],"dotnet","azure","azure resource manager redis dotnet","redis","azure resource manager","manager","2026-11-10 13:02:02",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\".\npackage: Azure.ResourceManager.Redis\nrisk: unknown\nsource: community\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>\n# For service principal auth (optional)\nAZURE_TENANT_ID=\u003Ctenant-id>\nAZURE_CLIENT_ID=\u003Cclient-id>\nAZURE_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.Redis;\n\n\u002F\u002F Always use DefaultAzureCredential\nvar credential = new DefaultAzureCredential();\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\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\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>\n# For service principal auth (optional)\nAZURE_TENANT_ID=\u003Ctenant-id>\nAZURE_CLIENT_ID=\u003Cclient-id>\nAZURE_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.Redis;\n\n\u002F\u002F Always use DefaultAzureCredential\nvar credential = new DefaultAzureCredential();\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\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{},"release\u002Fv4.2.11-panel-pro","a92ea02bcf7e2b3dbaf46d49696c29a3cb490d4f",".github\u002Fskills\u002Fazure-resource-manager-redis-dotnet","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-","https:\u002F\u002Fgithub.com\u002Fjaviertarazon","2026-07-12 07:10:45",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-resource-manager-redis-dotnet",{"tool":40,"command":41},"bunx","bunx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-resource-manager-redis-dotnet",{"tool":43,"command":44},"pnpm","pnpm dlx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-resource-manager-redis-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fazure-resource-manager-redis-dotnet\u002FSKILL.md",true,[],[49,81,108,128,143,165],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":60,"publishedAt":23},"01M71TQ7Q6Z10VWF3C2H5X1KW9","zustand-store-ts","Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\u002Faction separation. Use when building React state management, creating global stores, or implementing reacti...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzustand-store-ts\u002FSKILL.md",[55],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],"zustand","store","zustand store ts","community","middleware","implementing","use","react state management","when","unknown","react","with","state","create","state management","typescript","action","management","separation","global",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":90,"publishedAt":23},"01M71TQ5EAR40G6W0MV5ZDVEZT","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoom-automation\u002FSKILL.md",[87],{"categoryNo":88,"categoryName":89,"taxonomyType":58,"taxonomyTypeDesc":59},"01JBSEEDCAT000000000000023","Skill与智能体开发",[91,92,93,64,94,95,96,97,98,70,99,100,101,102,103,104,105,106,78,107],"zoom automation","zoom","automation","creation","for","search","schemas","MCP","first","via","meeting","search tools","tracking","webinars","composio","recordings","Tools",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":115,"publishedAt":23},"01M71TQ29B1EYBCEAP1ZBGXQ1A","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoho-crm-automation\u002FSKILL.md",[114],{"categoryNo":88,"categoryName":89,"taxonomyType":58,"taxonomyTypeDesc":59},[116,117,93,118,119,120,64,121,122,95,123,96,97,124,98,70,125,126,127,74],"crm automation","zoho crm automation","crm","zoho crm","zoho","leads","manage leads","manage","records","convert","tasks","contacts",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":135,"publishedAt":23},"01M71TPZPMN60DH0XV58KVHY23","zendesk-automation","Automate Zendesk tasks via Rube MCP (Composio): tickets, users, organizations, replies. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzendesk-automation\u002FSKILL.md",[134],{"categoryNo":88,"categoryName":89,"taxonomyType":58,"taxonomyTypeDesc":59},[136,93,137,64,95,96,97,98,138,70,126,139,140,99,100,141,102,105,107,142],"zendesk automation","zendesk","organizations","replies","users","tickets","automate",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":23},"01M71TPXDWKHKG4N6TVEPXWD0N","zapier-make-patterns","No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code. But no-code doesn't mean no-complexity ...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzapier-make-patterns\u002FSKILL.md",[],[150,151,152,153,154,155,156,157,158,93,159,70,160,161,162,163,164,142],"zapier make patterns","zapier","patterns","make","No-Code","complexity","writing","spawner","business","workflow","code","integromat","apache","processes","but",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":174,"publishedAt":23},"01M71TPT5T10WXNKW9G7ZXZ27W","youtube-summarizer","Extract transcripts from YouTube videos and generate comprehensive, detailed summaries using intelligent analysis frameworks","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fyoutube-summarizer\u002FSKILL.md",[171],{"categoryNo":172,"categoryName":173,"taxonomyType":58,"taxonomyTypeDesc":59},"01JBSEEDCAT000000000000016","图像与多媒体",[175,176,177,178,64,179,180,181,182,183,184,185,160,186,187,188,189,190,191,192],"summarizer","youtube","youtube summarizer","Video","content-analysis","frameworks","copilot","2025","github-copilot","extract transcripts","analysis","codex","cli","summaries","github","generate","summarization","2026"]