.NET 缓存

原文链接:https://blog.csdn.net/dabusidede/article/details/124858045

内存缓存包:

Microsoft.Extensions.Caching.Memory

1.注册内存缓存

1
services.AddMemoryCache();

2.基本使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
 
    private readonly IServiceProvider _serviceProvider;
 
    public Worker(ILogger<Worker> logger, IServiceProvider serviceProvider)
    {
        _logger = logger;
        _serviceProvider = serviceProvider;
    }
 
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine(Get());
            await Task.Delay(1000, stoppingToken);
        }
    }
 
    public string Get()
    {
        IMemoryCache cache = _serviceProvider.GetService<IMemoryCache>();
 
        // 从缓存中获取键为 key1 的项,如果没有或过期,则调用第二个参数Fun生成
        return cache.GetOrCreate<string>("key1", cacheEntity => {
            // 设置过期时间,过期后会重新调用该函数生成值
            // 设置过期时间
            // 如果5秒内没有访问该值,则过期
            // 否则,过期时间刷新为访问的时间 +5 秒
            cacheEntity.SlidingExpiration = TimeSpan.FromSeconds(5);
 
            // 设置绝对过期时间
            // 过期时间为15秒后,无论这15秒内是否有访问都会过期
            cacheEntity.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(15);
 
            // 设置该项优先级
            // NeverRemove 为不会从缓存中移除,除非过期
            // 优先级越低,内存不足时,将会移除该项
            cacheEntity.SetPriority(CacheItemPriority.NeverRemove);
 
            // 注册缓存项从缓存移除时的回调函数
            cacheEntity.RegisterPostEvictionCallback(
                (object key, object value, EvictionReason reason, object state) => { });
 
            return DateTime.Now.ToString();
        });
    }
 
    public void Remove()
    {
        IMemoryCache cache = _serviceProvider.GetService<IMemoryCache>();
 
        // 从缓存中移除键为key1的缓存项
        cache.Remove("key1");
    }
}

  3.内存缓存与EFCore
EFCore也使用内存缓存,如果我们使用依赖注入注入IMemoryCache ,则注入的可能是EFCore使用的缓存,所以最好的方法是我们重新注入我们的缓存(单例)

1
2
3
4
5
6
7
8
public class IEMemoryCache : MemoryCache, IIEMemoryCache
{
    public IEMemoryCache() : base(new MemoryCacheOptions {
        SizeLimit = null
    })
    {
    }
}

  分布式缓存

1.使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public string Get()
{
    IDistributedCache cache = _serviceProvider.GetService<IDistributedCache>();
 
    // 获取键为 mykey1 的缓存项
    string value = cache.GetString("mykey1");
    if (string.IsNullOrEmpty(value))
    {
        // 设置键为 mykey1 的缓存项
        cache.SetString("mykey1", "abc");
        return "no value";
    }
     
    return value;
}
 
public void Remove()
{
    IDistributedCache cache = _serviceProvider.GetService<IDistributedCache>();
    // 从缓存中移除键为mykey1的缓存项
    cache.Remove("mykey1");
}

  2.注册分布式缓存
目前有很多种分布式缓存可以注册
1)内存分布式缓存
内存分布式缓存其使用内存作为缓存,单其却实现了分布式缓存的接口

1
services.AddDistributedMemoryCache();

  2)redis分布式缓存

1
2
3
4
5
6
7
services.AddStackExchangeRedisCache (options => {
    // 配置 Redis 连接字符串
    // 127.0.0.1:6379 为 Redis 服务地址,123456 为 Redis 连接密码
    options.Configuration = "127.0.0.1:6379,password=123456";
    // 随便起的实例名,我们在 Redis 服务器保存的 key 均以该实例名开头
    options.InstanceName = "SampleInstance";
});

  

posted @   yinghualeihenmei  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
历史上的今天:
2022-07-01 给三十几万条数据加序号(sqlserver与excel)
2022-07-01 .csv文件与excel文件的区别
2022-07-01 人脸数据库的特征提取
点击右上角即可分享
微信分享提示