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,并实现泛型接口和仓储模式的完整实例。

相关推荐
源代码•宸4 分钟前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
code bean1 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
武子康3 小时前
Java-193 Spymemcached 深入解析:线程模型、Sharding 与序列化实践全拆解
java·开发语言·redis·缓存·系统架构·memcached·guava
c#上位机3 小时前
halcon刚性变换(平移+旋转)——vector_to_rigid
图像处理·人工智能·计算机视觉·c#·halcon
Miss_SQ3 小时前
Webgl打包后删除StreamingAssets文件夹下多余资源
unity·c#·webgl
xinyu_Jina3 小时前
动态媒体资源解析器:PWA、离线缓存与用户数据隐私的架构设计
缓存·媒体
小猪快跑爱摄影3 小时前
【AutoCad 2025】【C#】零基础教程(二)——遍历 Entity 插件 =》 AutoCAD 核心对象层级结构
开发语言·c#·autocad
致Great3 小时前
Nano Banana提示语精选
人工智能·gpt·chatgpt·开源·agent
chxii3 小时前
开源项目 lottery_results
开源
烛阴4 小时前
C# Dictionary 入门:用键值对告别低效遍历
前端·c#