使用redis包

install-package Microsoft.Extensions.Caching.Redis

配置redis-server

builder.Services.AddDistributedRedisCache(options =>
{
    options.InstanceName = "book_";  // 用来区别其他应用
    options.Configuration = "172.30.171.59:6379";   // redis-server
});

使用IDistributedCache

        private IDistributedCache MemoryCache { get; init; }
        private ILogger<CacheTestController> Logger { get; set; }

        public CacheTestController(IDistributedCache memoryCache, ILogger<CacheTestController> logger)
        {
            MemoryCache = memoryCache;
            Logger = logger;
        }

        [HttpGet("book")]
        public async Task<ActionResult<Book?>> GetBookById(int id)
        {
            Logger.LogInformation($"enter GetBookById, id={id}");

            string key = $"book_{id}";
            Book? book = null;

            if (await MemoryCache.GetAsync(key) == null)
            {
                Logger.LogInformation($"not found in cache, search in BookDbContext.");
                book = await new BookDbContext().GetBookByIdAsync(id);

                string val = JsonConvert.SerializeObject(book);
                DistributedCacheEntryOptions options = new DistributedCacheEntryOptions()
                {
                    // set cache entry expiration timeout
                    SlidingExpiration = TimeSpan.FromSeconds(20),
                    AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(Random.Shared.Next(50, 100)),
                };

                await MemoryCache.SetStringAsync(key, val, options);
            }
            else
            {
                Logger.LogInformation($"found book in cache.");
                string val = await MemoryCache.GetStringAsync(key);

                book = JsonConvert.DeserializeObject<Book>(val);
            }

            Logger.LogInformation($"GetAsync returns {book}");

            if (book == null)
                return NotFound($"cannot find bood with id:{id}");

            return book;
        }

注意点

虽然使用是SetStringAsync,但是在redis中保存的是Hash类型,不是string类型

试了一下SetAsync,保存的也是Hash类型。

await MemoryCache.SetAsync($"bk_{id}", Encoding.ASCII.GetBytes("hello"));