install-package Microsoft.Extensions.Caching.Redis
builder.Services.AddDistributedRedisCache(options => { options.InstanceName = "book_"; // 用来区别其他应用 options.Configuration = "172.30.171.59:6379"; // redis-server });
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"));