我正在使用spring引导做一个back应用程序,我已经创建了一个由控制器、服务和存储库组成的api。对于ddbb,我使用的是螺旋数据jdbc。
在某些情况下,我有需要分页的查询,例如,查询有100结果,但我只将10发送到前面,在下一个请求时,我向发送11-20结果。现在我在查询中使用限制和偏移,但是速度非常慢,我的想法是在第一个查询中获得100个结果,然后在下面的请求中发送10 / 10 的结果,而不是调用ddbb。
我想知道在某些方面是否可以使用缓存来存储,这将在请求中从缓存获得数据,而不是从ddbb获取数据。但我不知道控制员、服务和代表是怎样一个人的。
可以在spring?中使用缓存。
谢谢和抱歉,我的英语,不是我的母语。
示例我有两个用户-- user1和user2,两个用户都是1000本书,但用户1的书籍与用户2的书籍不同。
在前面显示一张桌子,上面有所有的user2 1或user2 2的书,首先我从ddbb得到100本书,但只把10(0-9)本送到前面,我把这100本书放在缓存中,第二个请求是我没有从ddbb那里得到书,我从缓存中得到书,在第三次请求时发送另外10本书(10-19),也可以从缓存中得到书,然后再发送10本书(20-29本)等等。
但是在10个请求中,我需要发送书籍(100-199),然后我需要查看缓存,并知道这些未在缓存中使用的书籍,并且我需要执行一个查询,得到的图书(100-199)等于第一个查询中的图书(100-199),并将最后的书籍(100-199)放入缓存中,并删除另一本书(0-99),例如,我需要一个包含的内存hashmap。
发布于 2020-07-21 14:43:02
编辑
深吸一口气,并意识到缓存只是一张地图,而注释只是自动填充地图的工作,如下所示
键->方法名称的哈希+参数的哈希
值->从方法本身返回的值。
现在,我编写了这个简单的服务,必须执行2项操作,1如果缓存中存在这样的对象,就使用缓存获取对象,另一项是从缓存中删除这样的obj。
对于这2个操作,我们得到了2个实现,1个使用了Map,另一个使用了可缓存的实现,但这2个实现的行为与完全相同
希望它能让你头脑清醒。
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class CacheService {
  Map<String,Object> cacheMap = new ConcurrentHashMap<>();
  //Simple implementation using ConcurrentHashMap as cache
  public Object getObjectUsingMapcache(String key){
    if (this.cacheMap.containsKey(key))
      return this.cacheMap.get(key);
    Object o = getObjectFromExpensiveFunction(key);
    this.cacheMap.put(key,o);
    return o;
  }
  //Call this if the object with key key is updated somehow
  //And the object for it is no more valid
  public void removeObjectFromMapCache(String key){
    this.cacheMap.remove(key);
  }
  @Cacheable(value = "cacheName")
  public Object getObjectUsingCacheable(String key){
    return getObjectFromExpensiveFunction(key);
  }
  @CacheEvict(value = "cacheName", key = "#key")
  public void removeObjectFromCacheable(String key) {}
  //This function is expensive and so we want to cache this function result
  public Object getObjectFromExpensiveFunction(String key){
    //INCREDIBILY TIME CONSUMING OPERATION HERE...
    return new Object();
  }
}https://stackoverflow.com/questions/63015478
复制相似问题