gpt4 book ai didi

java - Java 中的缓存函数?

转载 作者:行者123 更新时间:2023-11-30 06:12:47 25 4
gpt4 key购买 nike

我有一个 Spring/Java 项目,我正在考虑缓存一些访问数据库和其他休息服务的函数。我不确定在哪一点应该缓存某个流。例如,如果我有以下功能:

public List<String> getSchools()
{
//call db to get names
}

public List<String> getCourses(String school)
{
//rest call to get courses for a school
}

public List<String> getTeachers(String course)
{
//call db to get teacher names for a course
}

/*Uses above three functions together*/
public List<String> getAllTeachers()
{
List<String> schools = getSchools();
List<String> courses = new ArrayList<String>();
List<String> teachers = new ArrayList<String>();

for(String s : schools)
courses.addAll( getCourses( s ) );
for(String c : courses)
teachers.addAll( getTeachers( s ) );

return teachers;
}

这里,我应该缓存哪些方法?我应该缓存调用其他 3 个资源密集型函数的函数还是应该单独缓存这三个函数?什么通常被认为是良好实践?

最佳答案

缓存通常用于不经常更改的数据。
因此,决定是否缓存各个方法的结果与 getAllTeachers() 取决于与教师/类(class)/学校相关的数据更改的频率。

我建议缓存单个函数的结果(而不是调用 3 个方法的另一个函数),并有一个时间间隔,之后当调用该单个函数时,它将丢弃旧数据并重新初始化自身来自数据库的最新数据。
例如,如果时间间隔为 10 分钟,则每 10 分钟后调用这些函数将返回最新数据。

    private Map<String,Integer> funcCalls;
private Map<String,List<String>> funcResultCache;
long timeGap= 600000;//10 mins
public List<String> getSchools()
{
if(funcCalls.get("getSchools")-currentTimeInMills >=timeGap) {
//call db to get names
} else {
funcResultCache.get("getSchools");
}
}


这种方法的一个缺点是,如果数据在 2nd 分钟发生更改,用户可能会获得过时的数据,但只有 10 分钟后才会反射(reflect)。
可以缩短时间间隔以减少这种副作用。

还有一种方法,可能有点麻烦。
假设对数据库的调用将检索大量数据
1)在表上为 DML 类型的语句(创建/更新/删除)设置触发器,这些触发器会将时间以毫秒为单位写入另一个表(例如 trans_tbl)。
2) 初始存储trans_tbl的数据。
3)在每次调用DB获取实际数据之前,检查trans_tbl并检查之前检索到的时间是否大于您的时间。如果"is"存储最新时间,然后触发查询以从数据库获取数据。缓存结果并返回相同的结果。

您可以探索的另一方面是查看您使用的数据库本身是否可以缓存“选择”查询。如果"is",那么这将是一种更简单的方法,因为不需要更改代码,只需调整数据库来缓存选择的查询即可。

关于java - Java 中的缓存函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49868279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com