首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Spring中缓存数据

如何在Spring中缓存数据
EN

Stack Overflow用户
提问于 2020-07-21 13:23:15
回答 2查看 2.3K关注 0票数 0

我正在使用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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-21 14:43:02

编辑

深吸一口气,并意识到缓存只是一张地图,而注释只是自动填充地图的工作,如下所示

键->方法名称的哈希+参数的哈希

值->从方法本身返回的值。

现在,我编写了这个简单的服务,必须执行2项操作,1如果缓存中存在这样的对象,就使用缓存获取对象,另一项是从缓存中删除这样的obj。

对于这2个操作,我们得到了2个实现,1个使用了Map,另一个使用了可缓存的实现,但这2个实现的行为与完全相同

希望它能让你头脑清醒。

代码语言:javascript
运行
复制
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();
  }

}
票数 0
EN

Stack Overflow用户

发布于 2020-07-21 13:41:09

是的,这是可能的。您可以使用ehcacheRedis,只需简单的配置,就可以作为分布在不同实例之间使用。@Pagination将在没有任何特定代码的情况下处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63015478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档