我如何缓存 Spring api rest 中的数据
How can i cache the data in Spring api rest
我正在使用 spring boot 做一个 back 应用程序,我创建了一个 api rest formed通过控制器、服务和存储库。对于 ddbb 连接,我正在使用 spiring 数据 jdbc.
在某些情况下,我有需要 分页 的查询,例如查询有 100 个结果,但我只发送 10 到前面 ,在下一个请求中,我发送 11-20 的结果。现在我在查询中使用 limit 和 offset 但速度很慢,我的想法是在第一个查询中获得 100 个结果,然后在以下请求中发送 10 in 10 但不调用 ddbb 的结果。
我想知道是否可以通过某些方式使用 cache 来 store 这个结果,并在请求中从cache 不是来自 ddbb。
但是我不知道控制器、服务和存储库是如何成为单例的。
是否可以在 spring api 中使用缓存?
谢谢,对不起,我的英语不是我的母语。
示例
我有 2 个用户 user1 和 user2,两个用户都是 1000 本书,但是 user1 的书与 user2 的书不同。
在前面y显示一个table所有用户1或用户2的书,首先我从ddbb得到100本书但只发送10(0-9)到前面,我把这100本书放在缓存中,在第二个请求中,我没有从 ddbb 中获取书籍,否则我从缓存中获取书籍并发送其他 10 本书(10-19)在第三个请求中我也从缓存中获取书籍并发送另外 10 本书(20-29) ) 等等。
但是在 10 个请求中我需要发送书籍 (100-199) 然后我需要查看缓存并且知道这些书籍没有存储在缓存中我需要做一个查询来获取书籍 (100-199) 等于在第一个查询中,将这些最后一本书(100-199)放入缓存并删除另一本书(0-99),我需要一个包含 的内存哈希映射
是的,可以做到。您可以使用 ehcache or Redis[可以作为分布在各种实例中使用] 与简单的配置。
@Pagination
无需任何特定代码即可处理。
编辑
深吸一口气,意识到缓存只是一张地图
注释只是自动完成如下所示的地图填充工作
Key -> 方法名称的哈希值 + 参数的哈希值
值 -> 从方法本身返回的值。
现在,我编写了这个简单的服务,必须执行 2 个操作,第一个是使用缓存获取对象(如果缓存中存在此类对象),另一个是从缓存中删除此类对象。
对于这 2 个操作,我们有 2 个实现,1 个使用 Map,另一个使用 Cacheable,但这 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();
}
}
我正在使用 spring boot 做一个 back 应用程序,我创建了一个 api rest formed通过控制器、服务和存储库。对于 ddbb 连接,我正在使用 spiring 数据 jdbc.
在某些情况下,我有需要 分页 的查询,例如查询有 100 个结果,但我只发送 10 到前面 ,在下一个请求中,我发送 11-20 的结果。现在我在查询中使用 limit 和 offset 但速度很慢,我的想法是在第一个查询中获得 100 个结果,然后在以下请求中发送 10 in 10 但不调用 ddbb 的结果。
我想知道是否可以通过某些方式使用 cache 来 store 这个结果,并在请求中从cache 不是来自 ddbb。 但是我不知道控制器、服务和存储库是如何成为单例的。
是否可以在 spring api 中使用缓存?
谢谢,对不起,我的英语不是我的母语。
示例 我有 2 个用户 user1 和 user2,两个用户都是 1000 本书,但是 user1 的书与 user2 的书不同。
在前面y显示一个table所有用户1或用户2的书,首先我从ddbb得到100本书但只发送10(0-9)到前面,我把这100本书放在缓存中,在第二个请求中,我没有从 ddbb 中获取书籍,否则我从缓存中获取书籍并发送其他 10 本书(10-19)在第三个请求中我也从缓存中获取书籍并发送另外 10 本书(20-29) ) 等等。
但是在 10 个请求中我需要发送书籍 (100-199) 然后我需要查看缓存并且知道这些书籍没有存储在缓存中我需要做一个查询来获取书籍 (100-199) 等于在第一个查询中,将这些最后一本书(100-199)放入缓存并删除另一本书(0-99),我需要一个包含
是的,可以做到。您可以使用 ehcache or Redis[可以作为分布在各种实例中使用] 与简单的配置。
@Pagination
无需任何特定代码即可处理。
编辑
深吸一口气,意识到缓存只是一张地图 注释只是自动完成如下所示的地图填充工作
Key -> 方法名称的哈希值 + 参数的哈希值
值 -> 从方法本身返回的值。
现在,我编写了这个简单的服务,必须执行 2 个操作,第一个是使用缓存获取对象(如果缓存中存在此类对象),另一个是从缓存中删除此类对象。
对于这 2 个操作,我们有 2 个实现,1 个使用 Map,另一个使用 Cacheable,但这 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();
}
}