使用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"));