Guava緩存工具
Guava通過接口LoadingCache提供了一個非常強大的基於內存的LoadingCache<K,V>。在緩存中自動加載值,它提供了許多實用的方法,在有緩存需求時非常有用。
接口聲明
以下是forcom.google.common.cache.LoadingCache<K,V>接口的聲明:
@Beta @GwtCompatible public interface LoadingCache<K,V> extends Cache<K,V>, Function<K,V>
接口方法
S.N.
方法及說明
1
V apply(K key)
不推薦使用。提供滿足功能接口;使用get(K)或getUnchecked(K)代替。
2
ConcurrentMap<K,V> asMap()
返回存儲在該緩存作爲一個線程安全的映射條目的視圖。
3
V get(K key)
返回一個鍵在這個高速緩存中,首先裝載如果需要該值相關聯的值。
4
ImmutableMap<K,V> getAll(Iterable<? extends K> keys)
返回一個鍵相關聯的值的映射,創建或必要時檢索這些值。
5
V getUnchecked(K key)
返回一個鍵在這個高速緩存中,首先裝載如果需要該值相關聯的值。
6
void refresh(K key)
加載鍵key,可能是異步的一個新值。
LoadingCache 示例
使用所選擇的編輯器創建下面的java程序 C:/> Guava
GuavaTester.java
import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import com.google.common.base.MoreObjects; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class GuavaTester { public static void main(String args[]){ //create a cache for employees based on their employee id LoadingCache
employeeCache
=
CacheBuilder
.
newBuilder
()
.
maximumSize
(
100
)
// maximum 100 records can be cached
.
expireAfterAccess
(
30
,
TimeUnit
.
MINUTES
)
// cache will expire after 30 minutes of access
.
build
(
new
CacheLoader
(){
// build the cacheloader
@Override
public
Employee
load
(
String
empId
)
throws
Exception
{
//make the expensive call
return
getFromDatabase
(
empId
);
}
});
try
{
//on first invocation, cache will be populated with corresponding
//employee record
System
.
out
.
println
(
"Invocation #1"
);
System
.
out
.
println
(
employeeCache
.
get
(
"100"
));
System
.
out
.
println
(
employeeCache
.
get
(
"103"
));
System
.
out
.
println
(
employeeCache
.
get
(
"110"
));
//second invocation, data will be returned from cache
System
.
out
.
println
(
"Invocation #2"
);
System
.
out
.
println
(
employeeCache
.
get
(
"100"
));
System
.
out
.
println
(
employeeCache
.
get
(
"103"
));
System
.
out
.
println
(
employeeCache
.
get
(
"110"
));
}
catch
(
ExecutionException
e
)
{
e
.
printStackTrace
();
}
}
private
static
Employee
getFromDatabase
(
String
empId
){
Employee
e1
=
new
Employee
(
"Mahesh"
,
"Finance"
,
"100"
);
Employee
e2
=
new
Employee
(
"Rohan"
,
"IT"
,
"103"
);
Employee
e3
=
new
Employee
(
"Sohan"
,
"Admin"
,
"110"
);
Map
database
\=
new
HashMap
();
database
.
put
(
"100"
,
e1
);
database
.
put
(
"103"
,
e2
);
database
.
put
(
"110"
,
e3
);
System
.
out
.
println
(
"Database hit for"
+
empId
);
return
database
.
get
(
empId
);
}
}
class
Employee
{
String
name
;
String
dept
;
String
emplD
;
public
Employee
(
String
name
,
String
dept
,
String
empID
){
this
.
name
\=
name
;
this
.
dept
\=
dept
;
this
.
emplD
\=
empID
;
}
public
String
getName
()
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
\=
name
;
}
public
String
getDept
()
{
return
dept
;
}
public
void
setDept
(
String
dept
)
{
this
.
dept
\=
dept
;
}
public
String
getEmplD
()
{
return
emplD
;
}
public
void
setEmplD
(
String
emplD
)
{
this
.
emplD
\=
emplD
;
}
@Override
public
String
toString
()
{
return
MoreObjects
.
toStringHelper
(
Employee
.
class
)
.
add
(
"Name"
,
name
)
.
add
(
"Department"
,
dept
)
.
add
(
"Emp Id"
,
emplD
).
toString
();
}
}
驗證結果
使用javac編譯器如下編譯類
C:\Guava>javac GuavaTester.java
現在運行GuavaTester看到的結果
C:\Guava>java GuavaTester
看看結果:
Invocation #1
Database hit for100
Employee{Name=Mahesh, Department=Finance, Emp Id=100}
Database hit for103
Employee{Name=Rohan, Department=IT, Emp Id=103}
Database hit for110
Employee{Name=Sohan, Department=Admin, Emp Id=110}
Invocation #2
Employee{Name=Mahesh, Department=Finance, Emp Id=100}
Employee{Name=Rohan, Department=IT, Emp Id=103}
Employee{Name=Sohan, Department=Admin, Emp Id=110}