[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CS71NT9HDS6YMFADNSNV2C":3,"skill-same:01M6CS71NT9HDS6YMFADNSNV2C":54},{"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":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":32,"commitSha":33,"skillDirectory":34,"forksCount":35,"repositoryHtmlUrl":36,"repositoryHomepageUrl":36,"ownerHtmlUrl":37,"ownerBlogUrl":6,"ownerDescription":38,"updatedAt":39,"install":40,"resources":53},"01M6CS71NT9HDS6YMFADNSNV2C","azure-resource-manager-redis-dotnet",null,"Azure Resource Manager SDK for Redis in .NET.","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fazure-resource-manager-redis-dotnet\u002FSKILL.md",[],[19,20,21,22,23,24],"dotnet","azure","azure resource manager redis dotnet","redis","sdk","community","2026-11-10 10:12:30",false,"---\nname: azure-resource-manager-redis-dotnet\ndescription: Azure Resource Manager SDK for Redis in .NET.\nrisk: unknown\nsource: community\ndate_added: '2026-02-27'\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",{"name":5,"risk":30,"source":24,"date_added":31,"description":7},"unknown","2026-02-27","main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fazure-resource-manager-redis-dotnet",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":41,"prompt":51,"zipAvailable":52},[42,45,48],{"tool":43,"command":44},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill azure-resource-manager-redis-dotnet",{"tool":46,"command":47},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill azure-resource-manager-redis-dotnet",{"tool":49,"command":50},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill azure-resource-manager-redis-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fazure-resource-manager-redis-dotnet\u002FSKILL.md",true,[],[55,68,84,111,130,157],{"skillNo":56,"name":57,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":65,"publishedAt":25},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[60],{"categoryNo":61,"categoryName":62,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[66,67],"Test Skill","test",{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":25},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[75,76,77,78,79,80,81,24,82,83],"zustand store ts","zustand","store","with","types","middleware","patterns","create","typescript",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":93,"publishedAt":25},"01M6GDRKEA0WE670SPFWX5GKCN","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\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[90],{"categoryNo":91,"categoryName":92,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000023","Skill与智能体开发",[94,95,96,97,98,99,100,101,102,103,104,105,106,107,24,108,109,110],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management","tracking",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":118,"publishedAt":25},"01M6GDRFS1452PC71JQ38S24HR","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\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[117],{"categoryNo":91,"categoryName":92,"taxonomyType":63,"taxonomyTypeDesc":64},[119,94,120,121,122,123,124,24,99,125,107,126,104,103,98,127,82,128,100,129],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":139,"publishedAt":25},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[136],{"categoryNo":137,"categoryName":138,"taxonomyType":63,"taxonomyTypeDesc":64},"01JBSEEDCAT000000000000009","前端开发",[140,141,142,143,144,83,145,146,147,148,149,150,78,151,152,153,154,24,155,156],"expert","zod","zod validation expert","validation","react","safe","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":25},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[163],{"categoryNo":91,"categoryName":92,"taxonomyType":63,"taxonomyTypeDesc":64},[165,166,167,168,169,170,171,172,24,173,174,175,176,177,178,179,180,181,182,100],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]