我正在创建一个REST服务,它有两个方法,一个是 GetAll ,另一个是 GetById 。在我的方案中,数据库请求非常昂贵所以我想存储输出 GetAll 某处(缓存)并将其用于后续请求 GetById 。
REST的一个特点是应该是无状态。请求不能依赖于过去的请求,服务会独立处理每个请求。 我想了解处理此类场景的理想方法或如何在REST中设计此需求?
答案 0 :(得分:1)
实现目标的正确方法是使用缓存,例如MemoryCache
。
您创建一个单独的私有函数,它可以获取所有数据并将其缓存在内存中。然后,您可以让GetAll
和GetById
同时使用该功能。
您的服务将保持无状态。
MemoryCache
用法示例
MemoryCache cache = MemoryCache.Default;
string cacheName = "MyCache";
if (!cache.Contains(cacheName) || cache[cacheName] == null)
{
// get data
var data = ...
// cache data
cache.Set(cacheName, data, new CacheItemPolicy() { SlidingExpiration = DateTime.Now.AddDays(1).TimeOfDay });
}
return cache[cacheName];
答案 1 :(得分:0)
有很多解决方案。我推荐你的一个解决方案如下:
配置infinispan以将其用作缓存机制。在里面存储一个并发的hashmap,其中包含查询键,值为数据库的结果集,
第二次想要getAll,检查查询是否作为缓存的密钥存在,如果是,则从缓存中检索值,否则联系数据库,然后将结果插入缓存中。
答案 2 :(得分:0)
REST中无状态的要求是服务出现是无状态的。服务是否在内部维护某个状态并不重要。这只是一个实现细节。