• asp.net core 缓存使用


    // 在program.cs中加入这句,加入缓存支持
    builder.Services.AddMemoryCache();
    
        public class Book
        {
            public int Id { get; init; }
            public string Title { get; init; }
    
            public Book(int id, string title)
            {
                Id = id;
                Title = title;
            }
    
            public override string ToString()
            {
                return $"book:{Id}, {Title}";
            }
        }
    
        public class BookDbContext
        {
            public Task<Book?> GetBookByIdAsync(int id)
            {
                Book? book = null;
    
                switch (id)
                {
                    case 1:
                        book = new Book(1, "book1");
                        break;
    
                    case 2:
                        book = new Book(2, "book2");
                        break;
    
                    case 3:
                        book = new Book(3, "book3");
                        break;
                }
    
                return Task.FromResult(book);
            }
        }
    
        [ApiController]
        [Route("api/[controller]")]
        public class CacheTestController : ControllerBase
        {
            private IMemoryCache MemoryCache { get; init; }
            private ILogger<CacheTestController> Logger { get; set; }
    
            public CacheTestController(IMemoryCache memoryCache, ILogger<CacheTestController> logger)
            {
                MemoryCache = memoryCache;
                Logger = logger;
            }
    
            [HttpGet("book")]
            public async Task<ActionResult<Book?>> GetBookById(int id)
            {
                Logger.LogInformation($"enter GetBookById, id={id}");
    
                // 尽量使用GetOrCreateAsync,而不是Get/Set。
                // 因为GetOrCreateAsync可以把null也作为缓存值,这样就可以避免缓存穿透。
                Book? book = await MemoryCache.GetOrCreateAsync($"book_{id}", (e) =>
                {
                    Logger.LogInformation($"not found in cache, search in BookDbContext.");
    
                    // 混用SlidingExpiration和AbsoluteExpirationRelativeToNow,这样滑动超时或绝对超时后,缓存都会失效, 
                    e.SlidingExpiration = TimeSpan.FromSeconds(5);
                    // 使用随机数作为超时值,避免缓存雪崩
                    e.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(Random.Shared.Next(10, 50));
                    return new BookDbContext().GetBookByIdAsync(id);
                });
                Logger.LogInformation($"GetOrCreateAsync returns {book}");
    
                if (book == null)
                    return NotFound($"cannot find bood with id:{id}");
    
                return book;
            }
    
    
            [ResponseCache(Duration = 10)]  // 浏览器缓存支持,在响应头里加入cache-control: public,max-age=10
            [HttpGet("Now")]
            public DateTime Now()
            {
                return DateTime.Now;
            }
        }
    
  • 相关阅读:
    [OI学习笔记]排列组合&二项式定理
    [OI学习笔记]拓补排序
    [OI学习笔记]DAG最短路的四种算法整理-floyd,Dijkstra,Bellman-Ford,SPFA
    [OI学习笔记]从蒟蒻的角度理解动态规划(DP)——从暴力搜索到动态规划
    [OI学习笔记]最小生成树之Kruskal算法
    [OI学习笔记]最小生成树之Prim算法
    [OI学习笔记]图的存储与遍历-邻接矩阵&邻接表
    将数组中第n个元素,放到第m个元素后面
    Unity3D中播放序列帧动画
    UVA1589 Xiangqi
  • 原文地址:https://www.cnblogs.com/mryux/p/15876301.html
Copyright © 2020-2023  润新知