Redis实践之缓存:.NET CORE实现泛型仓储模式redis接口

第一步:创建ASP.NET Core 6项目

首先,创建一个新的ASP.NET Core 6 Web API项目:

复制代码
dotnet new webapi -n RedisDemo
cd RedisDemo

第二步:安装必要的NuGet包

接下来,安装StackExchange.Redis和Microsoft.Extensions.Caching.StackExchangeRedis包:

复制代码
dotnet add package StackExchange.Redis
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis

第三步:配置Redis

appsettings.json文件中添加Redis的连接字符串:

复制代码
{
  "ConnectionStrings": {
    "Redis": "localhost:6379"
  }
}

第四步:设置依赖注入

Program.cs文件中配置Redis缓存:

复制代码
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// Configure Redis
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = builder.Configuration.GetConnectionString("Redis");
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

第五步:创建泛型仓储接口和实现

创建一个新的文件夹Repositories,并在其中创建以下接口和类:

IRepository.cs
复制代码
using System.Collections.Generic;
using System.Threading.Tasks;

namespace RedisDemo.Repositories
{
    public interface IRepository<T>
    {
        Task<T> GetAsync(string id);
        Task<IEnumerable<T>> GetAllAsync();
        Task AddAsync(T entity);
        Task UpdateAsync(string id, T entity);
        Task DeleteAsync(string id);
    }
}
RedisRepository.cs
复制代码
using Microsoft.Extensions.Caching.Distributed;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RedisDemo.Repositories
{
    public class RedisRepository<T> : IRepository<T>
    {
        private readonly IDistributedCache _cache;
        private readonly string _entityName;

        public RedisRepository(IDistributedCache cache)
        {
            _cache = cache;
            _entityName = typeof(T).Name.ToLower();
        }

        public async Task<T> GetAsync(string id)
        {
            var data = await _cache.GetStringAsync($"{_entityName}:{id}");
            return data == null ? default : JsonConvert.DeserializeObject<T>(data);
        }

        public async Task<IEnumerable<T>> GetAllAsync()
        {
            // This is a simplified example. In a real-world scenario, you would need a more sophisticated way to manage keys.
            var keys = Enumerable.Range(1, 100).Select(i => $"{_entityName}:{i}").ToList();
            var result = new List<T>();

            foreach (var key in keys)
            {
                var data = await _cache.GetStringAsync(key);
                if (data != null)
                {
                    result.Add(JsonConvert.DeserializeObject<T>(data));
                }
            }

            return result;
        }

        public async Task AddAsync(T entity)
        {
            var id = Guid.NewGuid().ToString();
            var data = JsonConvert.SerializeObject(entity);
            await _cache.SetStringAsync($"{_entityName}:{id}", data);
        }

        public async Task UpdateAsync(string id, T entity)
        {
            var data = JsonConvert.SerializeObject(entity);
            await _cache.SetStringAsync($"{_entityName}:{id}", data);
        }

        public async Task DeleteAsync(string id)
        {
            await _cache.RemoveAsync($"{_entityName}:{id}");
        }
    }
}

第六步:创建实体类和控制器

创建一个新的文件夹Models,并在其中创建一个实体类:

Product.cs
复制代码
namespace RedisDemo.Models
{
    public class Product
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
}

然后创建一个控制器来使用这个仓储:

ProductsController.cs
复制代码
using Microsoft.AspNetCore.Mvc;
using RedisDemo.Models;
using RedisDemo.Repositories;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace RedisDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ProductsController : ControllerBase
    {
        private readonly IRepository<Product> _repository;

        public ProductsController(IRepository<Product> repository)
        {
            _repository = repository;
        }

        [HttpGet("{id}")]
        public async Task<ActionResult<Product>> GetProduct(string id)
        {
            var product = await _repository.GetAsync(id);
            if (product == null)
            {
                return NotFound();
            }
            return product;
        }

        [HttpGet]
        public async Task<ActionResult<IEnumerable<Product>>> GetProducts()
        {
            var products = await _repository.GetAllAsync();
            return Ok(products);
        }

        [HttpPost]
        public async Task<ActionResult> CreateProduct(Product product)
        {
            await _repository.AddAsync(product);
            return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);
        }

        [HttpPut("{id}")]
        public async Task<ActionResult> UpdateProduct(string id, Product product)
        {
            await _repository.UpdateAsync(id, product);
            return NoContent();
        }

        [HttpDelete("{id}")]
        public async Task<ActionResult> DeleteProduct(string id)
        {
            await _repository.DeleteAsync(id);
            return NoContent();
        }
    }
}

第七步:注册仓储服务

Program.cs文件中注册仓储服务:

复制代码
builder.Services.AddScoped(typeof(IRepository<>), typeof(RedisRepository<>));

最后一步:运行项目

现在,你可以运行项目并测试API端点了:

复制代码
dotnet run

你可以使用Postman或其他工具来测试API端点,例如:

  • GET /api/products
  • GET /api/products/{id}
  • POST /api/products
  • PUT /api/products/{id}
  • DELETE /api/products/{id}

总结

这样就完成了在ASP.NET Core 6项目中整合使用Redis,并实现泛型接口和仓储模式的完整实例。

相关推荐
csdn_aspnet7 分钟前
ASP.NET Core 中的多租户 SaaS 应用程序
.netcore·saas
曼妥思12 分钟前
PosterKit:跨框架海报生成工具
前端·开源
爱喝奶茶的企鹅42 分钟前
Ethan独立开发新品速递 | 2025-08-18
人工智能·程序员·开源
程序媛Dev1 小时前
还在 SSH 连服务器敲 SQL?我用 Sealos 把数据库管理后台搬进了浏览器!
开源·github
★YUI★1 小时前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
谷宇.2 小时前
【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
游戏·unity·c#·游戏程序·unity3d·游戏开发·游戏编程
LZQqqqqo2 小时前
C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
windows·c#·list
猫头虎3 小时前
猫头虎AI分享|一款Coze、Dify类开源AI应用超级智能体Agent快速构建工具:FastbuildAI
人工智能·开源·github·aigc·ai编程·ai写作·ai-native
海梨花5 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
Dm_dotnet5 小时前
Stylet启动机制详解:从Bootstrap到View显示
c#