當前位置:首頁 » 硬碟大全 » 怎樣加緩存對象
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

怎樣加緩存對象

發布時間: 2022-11-04 22:07:19

1. 如何設置資料庫緩存

內存資料庫有現成的redis,高效存取鍵值對,鍵設為你的查詢條件,值設為你的查詢結果轉為字元串
查詢時先從redis取,沒有再查資料庫,並且設置redis的過期時間,這種方式需要項目對實時性要求不高,這樣你才能用緩存,而且如果你的項目沒有明顯的熱點,即沒有某些內容確定會多次被查到,那你緩存就不會命中,添加緩存反而影響你得速度
redis是一種nosql的內存資料庫,感興趣你可以了解一下,優點就是性能強勁
數據查詢請求多就把結果緩存下來,你查資料庫再快也沒有直接把結果從內存讀出來快
同樣的sql請求只有第一次查資料庫,之後通通讀內存
或者你乾脆藉助這種思想,創建一個全局的map對象,然後查詢條件作key
,結果作value,就省去了了解redis的過程,把整個資料庫裝內存不太科學,你有多少條數據啊

2. 如何對django的model對象緩存

直接利用python提供的json包,在django model的定義中增加一個方法toJSON,利用django model 能訪問 _meta.fields 得到相關屬性而得到,例子如下: class Category(models.Model): autoid = models.AutoField(primary_key=True) email=models.Ch

3. 舉例說明,如何為Cache對象中的緩存項設置緩存策略

沒分?
你的意思是用.NET的緩存機制?
緩存一般情況下用於資料庫操作的比較多.
如果此數據修改過多,不建議用緩存.一般是原始數據.其實寫在程序的某固定地方作為靜態變數出現我覺得也可以...
sqlServer系列有大量的索引等等操作.優化後不一定比緩存差.

同類比還有session和application.
我舉個例子查詢資料庫的例子看和你說的是不是一回事...

string cacheKey="yourKey"; //緩存ID
object myObj= HttpContext.Current.Cache[CacheKey]; //緩存對象
if(myObj==null)
{
//證明為空,再從資料庫中查詢
Datatable yourTable=yourSelect();
if(yourTable==null)
return null;
else
{
HttpContext.Current.Cache.Insert(cacheKey,yourTable); //插入緩存
return yourTable;
}
}
return myObj;

4. ios怎樣給tableview添加緩存

方法一:一般將伺服器第一次返回的數據保存在沙盒裡面。這樣在手機斷網的情況下可以從本地讀取數據了。

1.保存到沙盒的代碼:

[plain] view
plain

+ (void)saveCache:(int)type andID:(int)_id andString:(NSString *)str;
{
NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];
NSString * key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
[setting setObject:str forKey:key];
[setting synchronize];
}

2.讀取本地沙盒的代碼

讀取之前首先根據type和Id判斷本地是否有

[plain] view
plain

+ (NSString *)getCache:(int)type andID:(int)_id
{
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
NSString *key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];

NSString *value = [settings objectForKey:key];
return value;
}

如果沙盒裡面有數據

[plain] view
plain

NSString *value = [Tool getCache:5 andID:self.QiuTime];
if (value) {
NSDictionary *backdict = [value JSONValue];
if ([backdict objectForKey:@"items"]) {
NSArray *array=[NSArray arrayWithArray:[backdict objectForKey:@"items"]];
for (NSDictionary *qiushi in array) {
QiuShi *qs=[[[QiuShi alloc]initWithDictionary:qiushi] autorelease];
[self.list addObject:qs];
}
}
[self.tableView reloadData];

}

[self.tableView :@"數據全部載入完了.."];
self.tableView.reachedTheEnd = YES;

方法二:使用ASIHTTPRequest和ASIDownloadCache實現本地緩存

1、設置全局的Cache

在AppDelegate.h中添加一個全局變數

[plain] view plain

@interface AppDelegate : UIResponder
{
ASIDownloadCache *myCache;
}
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,retain) ASIDownloadCache *myCache;

在AppDelegate.m中的- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代碼

[plain] view plain

//自定義緩存
ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
self.myCache = cache;
[cache release];

//設置緩存路徑
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
[self.myCache setStoragePath:[documentDirectory :@"resource"]];
[self.myCache setDefaultCachePolicy:];

在AppDelegate.m中的dealloc方法中添加如下語句

[plain] view plain

[myCache release];

到這里為止,就完成了全局變數的聲明。

2、設置緩存策略

在實現ASIHTTPRequest請求的地方設置request的存儲方式,代碼如下

[plain] view plain

NSString *str = @"http://....../getPictureNews.aspx";
NSURL *url = [NSURL URLWithString:str];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
//獲取全局變數
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
//設置緩存方式
[request setDownloadCache:appDelegate.myCache];
//設置緩存數據存儲策略,這里採取的是如果無更新或無法聯網就讀取緩存數據
[request setCacheStoragePolicy:];
request.delegate = self;
[request startAsynchronous];

此回答請感謝:27773,是技術領域眾包平台,能一對一撮合技術牛人,如果有項目合作,可以 v zhongbao27773、清理緩存數據

我在這里採用的是手動清理數據的方式,在適當的地方添加如下代碼,我將清理緩存放在了應用的設置模塊:

[plain] view plain

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.myCache :];

這里清理的是這種存儲策略的緩存數據,如果更換其他的參數的話,即可清理對應存儲策略的緩存數據。

5. 如何使用 Windows Azure Caching

Windows Azure Caching 入門
Windows Azure Caching 提供了一種使用承載角色實例的虛擬機上的內存來進行緩存的方法。承載緩存的角色實例稱為緩存群集。專用角色緩存 - 這些角色實例專用於緩存。
若要在角色實例中使用緩存,您需要配置緩存群集,然後配置緩存客戶端以便它們可以訪問緩存群集。
配置緩存群集
配置緩存客戶端
配置緩存群集
若要配置專用角色緩存群集,請向項目中添加緩存輔助角色。

在向項目中添加緩存輔助角色後,默認配置是專用角色緩存。

在啟用緩存後,可以配置緩存群集存儲帳戶。Windows Azure Caching 需要 Windows Azure 存儲帳戶。此存儲帳戶用於保存從組成緩存群集的所有虛擬機訪問的緩存群集的相關配置數據。此存儲帳戶在緩存群集角色屬性頁的「緩存」選項卡上的「命名緩存設置」上方指定。

如果沒有配置此存儲帳戶,則角色將無法啟動。
緩存的大小由角色的 VM 大小、角色的實例計數共同決定。
本節提供了有關配置緩存大小的簡單概述。有關緩存大小及其他容量規劃注意事項的更多信息,請參見 Windows Azure Caching 容量規劃注意事項。
若要配置虛擬機大小和角色實例數,請在「解決方案資源管理器」中右鍵單擊角色屬性,然後選擇「屬性」。

切換到「配置」選項卡。默認的「實例計數」為 1,默認的「VM 大小」為「小型」。

VM 大小的總內存如下:
小型:1.75 GB
中型:3.5 GB
大型:7 GB
超大型:14 GB
這些內存大小表示可用於跨 OS、緩存進程、緩存數據和應用程序共享的 VM 的內存總量。有關配置虛擬機大小的更多信息,請參見如何配置虛擬機大小。請注意,特小型 VM 大小不支持緩存。
在指定專用角色緩存後,虛擬機的所有可用內存均用於緩存。如果配置了兩個角色實例,將使用虛擬機的組合內存。這構成了緩存群集,其中的可用緩存內存分布在多個角色實例上,但對緩存的客戶端顯示為單個資源。配置其他角色實例會以相同方式增加緩存大小。若要確定設置所需大小的緩存所需的設置,您可以使用 Windows Azure Caching 容量規劃注意事項中的容量規劃電子表格。
在配置緩存群集後,可以配置緩存客戶端以允許訪問緩存。
配置緩存客戶端
若要訪問 Windows Azure Caching 緩存,客戶端必須位於同一部署中。如果緩存群集是專用角色緩存群集,則客戶端是部署中的其他角色。提供了 NuGet 包,它可用於配置訪問緩存的每個客戶端角色。若要使用 Caching NuGet 包配置角色以訪問緩存群集,請在「解決方案資源管理器」中右鍵單擊角色項目,然後選擇「管理 NuGet 包」。

選擇「Windows Azure Caching」,單擊「安裝」,然後單擊「我接受」。
如果「Windows Azure Caching」沒有顯示在列表中,請在「聯機搜索」文本框中鍵入 WindowsAzure.Caching,然後從結果中選擇它。

NuGet 包可執行多項操作:它將所需配置添加到角色的配置文件中,將緩存客戶端診斷級別設置添加到 Windows Azure 應用程序的 ServiceConfiguration.cscfg 文件中,並添加所需的程序集引用。
對於 ASP.NET Web 角色,Caching NuGet 包還將兩個注釋掉的節添加到 web.config 中。第一個節允許會話狀態存儲在緩存中,第二個節啟用 ASP.NET 頁面輸出緩存。有關更多信息,請參見如何:在緩存中存儲 ASP.NET 會話狀態和如何:在緩存中存儲 ASP.NET 頁面輸出緩存。
NuGet 包將以下配置元素添加到角色的 web.config 或 app.config 中。將 dataCacheClients 節和 cacheDiagnostics 節添加到configSections 元素之下。如果 configSections 元素不存在,則會創建一個作為 configuration 元素的子級。
<configSections>
<!-- Existing sections omitted for clarity. -->

<section name="dataCacheClients"
type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core"
allowLocation="true"
allowDefinition="Everywhere" />

<section name="cacheDiagnostics"
type="Microsoft.ApplicationServer.Caching.AzureCommon., Microsoft.ApplicationServer.Caching.AzureCommon"
allowLocation="true"
allowDefinition="Everywhere" />
</configSections>

這些新節包括對 dataCacheClients 元素和 cacheDiagnostics 元素的引用。這些元素還添加到 configuration 元素中。
<dataCacheClients>
<dataCacheClient name="default">
<autoDiscover isEnabled="true" identifier="[cache cluster role name]" />
<!--<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />-->
</dataCacheClient>
</dataCacheClients>
<cacheDiagnostics>
<crashDump mpLevel="Off" mpStorageQuotaInMB="100" />
</cacheDiagnostics>

在添加配置後,將 [cache cluster role name] 替換為承載緩存群集的角色的名稱。
如果沒有將 [cache cluster role name] 替換為承載緩存群集的角色的名稱,則在訪問緩存時會引發TargetInvocationException,其內部 DatacacheException 將顯示消息「No such role exists」。
NuGet 包還將 ClientDiagnosticLevel 設置添加到 ServiceConfiguration.cscfg 中的緩存客戶端角色的 ConfigurationSettings中。下面的示例是 ServiceConfiguration.cscfg 文件中的 WebRole1 節,其 ClientDiagnosticLevel 為 1,這是默認的ClientDiagnosticLevel。
<Role name="WebRole1">
<Instances count="1" />
<ConfigurationSettings>
<!-- Existing settings omitted for clarity. -->
<Setting name="Microsoft.WindowsAzure.Plugins.Caching.ClientDiagnosticLevel"
value="1" />
</ConfigurationSettings>
</Role>

Windows Azure Caching 同時提供了緩存伺服器和緩存客戶端診斷級別。診斷級別是配置為緩存收集的診斷信息級別的單個設置。有關更多信息,請參見解決和診斷 Windows Azure Caching 問題
NuGet 包還添加對以下程序集的引用:
Microsoft.ApplicationServer.Caching.Client.dll
Microsoft.ApplicationServer.Caching.Core.dll
Microsoft.WindowsFabric.Common.dll
Microsoft.WindowsFabric.Data.Common.dll
Microsoft.ApplicationServer.Caching.AzureCommon.dll
Microsoft.ApplicationServer.Caching.AzureClientHelper.dll
如果您的角色是 ASP.NET Web 角色,則還添加以下程序集引用:
Microsoft.Web.DistributedCache.dll。
這些程序集位於 C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\2012-10\ref\Caching\ 文件夾中。
在配置了您的客戶端項目的緩存後,您可以使用以下各節中介紹的方法來使用您的緩存。
使用緩存
本節中的步驟介紹如何使用緩存執行常見任務。
如何:創建 DataCache 對象
如何:在緩存中添加和檢索對象
如何:在緩存中指定對象的有效期
如何:在緩存中存儲 ASP.NET 會話狀態
如何:在緩存中存儲 ASP.NET 頁面輸出緩存
如何:創建 DataCache 對象
若要以編程方式使用緩存,您需要引用該緩存。將以下代碼添加到要從中使用 Windows Azure Caching 的任何文件的頂部:
using Microsoft.ApplicationServer.Caching;

如果在安裝了添加必要引用的 Caching NuGet 包後,Visual Studio 仍不能識別 using 語句中的類型,請確保項目的目標配置文件是 .NET Framework 2.0 或更高版本,並確保選擇沒有指定客戶端配置文件的配置文件之一。有關配置緩存客戶端的說明,請參見配置緩存客戶端。
創建 DataCache 對象有兩種方法。第一種方法是僅創建 DataCache,並傳入所需緩存的名稱。
DataCache cache = new DataCache("default");

在實例化 DataCache 後,您可以使用它來與緩存交互,如以下各節中所述。
若要使用第二種方法,請在您的應用程序中使用默認的構造函數創建新的 DataCacheFactory 對象。這會導致緩存客戶端使用配置文件中的設置。調用新的 DataCacheFactory 實例的 GetDefaultCache 方法,該方法返回 DataCache 對象,或調用 GetCache 方法並傳入您的緩存的名稱。這些方法返回以後可用於以編程方式訪問緩存的 DataCache 對象。
// Cache client configured by settings in application configuration file.
DataCacheFactory cacheFactory = new DataCacheFactory();
DataCache cache = cacheFactory.GetDefaultCache();
// Or DataCache cache = cacheFactory.GetCache("MyCache");
// cache can now be used to add and retrieve items.

如何:在緩存中添加和檢索對象
若要向緩存中添加項,可以使用 Add 或 Put 方法。Add 方法將指定的對象添加到緩存中,並按鍵參數的值進行鍵控。
// Add the string "value" to the cache, keyed by "item"
cache.Add("item", "value");

如果緩存中已存在具有相同鍵的對象,將引發 DataCacheException 並顯示以下消息:
ErrorCode:SubStatus:An attempt is being made to create an object with a Key that already exists in the cache.Caching will only accept unique Key values for objects.
若要檢索具有特定鍵的對象,可以使用 Get 方法。如果對象存在,則返回它,如果對象不存在,則返回 null。
// Add the string "value" to the cache, keyed by "key"
object result = cache.Get("Item");
if (result == null)
{
// "Item" not in cache. Obtain it from specified data source
// and add it.
string value = GetItemValue(...);
cache.Add("item", value);
}
else
{
// "Item" is in cache, cast result to correct type.
}

如果具有指定鍵的對象不存在,則 Put 方法將該對象添加到緩存中,如果該對象存在,則替換它。
// Add the string "value" to the cache, keyed by "item". If it exists,
// replace it.
cache.Put("item", "value");

如何:在緩存中指定對象的有效期
默認情況下,緩存中的項在放入緩存中 10 分鍾後到期。這可在承載緩存群集的角色的角色屬性中的「生存時間(分鍾)」設置中進行配置。

有三種類型的「過期類型」:「無」、「絕對」和「可調窗口」。這些類型配置如何使用「生存時間(分鍾)」來確定有效期。默認的「過期類型」為「絕對」,這意味著在將項放入緩存中時,記錄該項有效期的倒計時器即會啟動。在項經過指定的時間後,該項過期。如果指定了「可調窗口」,則在每次訪問緩存中的項時,會重置該項的有效期倒計時,並且僅在自上次訪問該項後經過指定的一段時間後,該項才會過期。如果指定了「無」,則「生存時間(分鍾)」必須設置為「0」,並且項不會過期,只要它們在緩存中就會保持有效。
如果需要比在角色屬性中配置的時間更長或更短的超時時間間隔,則可以在緩存中添加或更新項時,使用採用 TimeSpan 參數的 Add和 Put 的重載來指定特定持續時間。在下面的示例中,將字元串 value 添加到緩存中,按 item 進行鍵控,且超時為 30 分鍾。
// Add the string "value" to the cache, keyed by "item"
cache.Add("item", "value", TimeSpan.FromMinutes(30));

若要查看緩存中的項的剩餘超時時間間隔,可以使用 GetCacheItem 方法來檢索 DataCacheItem 對象,該對象包含有關緩存中項的信息,其中包括剩餘超時時間間隔。
// Get a DataCacheItem object that contains information about
// "item" in the cache. If there is no object keyed by "item" null
// is returned.
DataCacheItem item = cache.GetCacheItem("item");
TimeSpan timeRemaining = item.Timeout;

6. 如何使用OSCache實現對象的緩存

分頁自己做吧,根據使用資料庫的不同,分頁方式也不同,也就是取某個區間的數據。ibatis自帶的分頁方法在最新版本里已經廢除了。

7. C4D的對象緩存是什麼來的

你好,很高興回答你的問題,使用對象緩存可以把你想單獨處理的模型提取出來在合成軟體中做進一步的處理,就相當於其他3維軟體中的分層渲染,希望能對你有幫助!

8. 如何使用OSCache實現對象的緩存

一、緩存對象常用API
核心Cache管理類 GeneralCacheAdministrator的常用方法
1.void putInCache(String key,Object content);//put on Object in a cache
2.Object getFromCache(String key);// get on Object from the Cache
3.void removeEntry(String key);// remove an Object in a cache
4.void flushEntry(String key);// flushes a single cache entry
5.void flushAll();// flush the entire cache immediately
6.void cancelUpdate(String key);// cacels a pending cache update

9. Spring如何配置資料庫查詢緩存/對象緩存EHCache

  1. 在ehcache.xml文件中配置查詢緩存參數,ehcache.xml文件配置如下:

<ehcache>

<!--diskStore元素,配置一個目錄,這個目錄用來存放數據,
也就是說,如果EhCache需要把數據寫入磁碟,將會寫到這個目錄下-->
<diskStorepath="java.io.tmpdir"/>

<defaultCache
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskPersistent="false"
="120"/>

<cachename="ehcacheName"
maxElementsInMemory="3000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="36000"
overflowToDisk="true"
/>
</ehcache>

2. spring的配置

第一步:給指定方法配置緩存/src/main/resources/applicationContext-resources.xml

<ehcache:proxyid="userGroupServiceProxy"refId="userGroupService">
<ehcache:cachingcacheName="cash15Min"methodName=""/>
<ehcache:cachingcacheName="cash15Min"methodName=""/>
<ehcache:cachingcacheName="cash15Min"methodName="selectuserGroupById"/>
</ehcache:proxy>

配置參數的含義如下:
id:唯一標識符
refId:需要配置緩存的service或者controller
cacheName:緩存名稱
methodName:需要緩存的方法,這個方法必須是shoppingHomeService中的方法
第二步:在控制器中注入依賴的緩存userGroupServiceProxy /src/main/webapp/WEB-INF/dispatcher-servlet.xml

<beanid="PFController"class="com.java.mall.controller.PFController">
<propertyname="userService"ref="userService"></property>
<propertyname="userGroupService"ref="userGroupServiceProxy"></property>
</bean>

同時需要在實體類中注入依賴,提供setter方法,

;
publicvoidsetuserGroupService(){
this.userGroupService=userGroupService;

10. 如何使用Guava的緩存管理

首先,看一下使用範例:

Java代碼
LoadingCache<Key,Graph> graphs =CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10,TimeUnit.MINUTES)
.removalListener(MY_LISTENER)
.build(
newCacheLoader<Key,Graph>(){
publicGraph load(Key key)throwsAnyException{
return createExpensiveGraph(key);
}
});
適用性
緩存在很多情況下都是非常有用的。比如,我們需要多次根據給定的輸入獲取值,而且該值計算或者獲取的開銷是非常昂貴的。
緩存和ConcurrentMap是非常相像的,但是它們也不完全一樣。最根本的區別就是,ConcurrentMap會持有所有添加的對象,直到被顯示的移除。而緩存為了限制其內存的使用,通常都會配置成可以自動的將對象移除。在某些情況下即使不自動移除對象也是非常有用的,如LoadingCache它會自動載入緩存對象。
一般,Guava緩存適用於以下幾種情況:
你願意花費一些內存來換取性能提升;
你預測到某些鍵會多次進行查詢;
你的緩存數據不超過內存(Guava緩存是單個應用中的本地緩存。它不會將數據存儲到文件中,或者外部伺服器。如果不適合你,可以考慮一下 Memcached)。
如果你的需要符合上面所說的每一條,那麼選擇Guava緩存絕對沒錯。
使用CacheBuilder的構建模式可以獲取一個Cache,如上面的範例所示。但是如何進行定製才是比較有趣的。
注意:如果你不需要緩存的這些特性,那麼使用ConcurrentHashMap會有更好的內存效率,但是如果想基於舊有的ConcurrentMap復制實現Cache的一些特性,那麼可能是非常困難或者根本不可能。
載入
對於緩存首先需要明確的是:有沒有一個方法可以通過給定的鍵來計算/載入相應的值?如果有,那麼可以使用CacheLoader。如果沒有這樣的方法,或者你想復寫緩存的載入方式,但你仍想保留「get-if-absent-compute」語義,你可以在調用get方法時傳入一個Callable實例,來達到目的。緩存的對象可以通過Cache.put直接插入,但是自動載入是首選,因為自動載入可以更加容易的判斷所有緩存信息的一致性。
From a CacheLoader
LoadingCache 緩存是通過一個CacheLoader來構建緩存。創建一個CacheLoader僅需要實現V load(K key) throws Exception方法即可。下面的範例就是如何創建一個LoadingCache:
Java代碼
LoadingCache<Key,Graph> graphs =CacheBuilder.newBuilder()
.maximumSize(1000)
.build(
newCacheLoader<Key,Graph>(){
publicGraph load(Key key)throwsAnyException{
return createExpensiveGraph(key);
}
});

...
try{
return graphs.get(key);
}catch(ExecutionException e){
thrownewOtherException(e.getCause());
}
通過方法get(K)可以對LoadingCache進行查詢。該方法要不返回已緩存的值,要不通過CacheLoader來自動載入相應的值到緩存中。這里需要注意的是:CacheLoader可能會拋出Exception,LoaderCache.get(K)則可能會拋出ExecutionException。假如你定義的CacheLoader沒有聲明檢查型異常,那麼可以通過調用getUnchecked(K)來獲取緩存值;但是一旦當CacheLoader中聲明了檢查型異常,則不可以調用getUnchecked。
Java代碼
LoadingCache<Key,Graph> graphs =CacheBuilder.newBuilder()
.expireAfterAccess(10,TimeUnit.MINUTES)
.build(
newCacheLoader<Key,Graph>(){
publicGraph load(Key key){// no checked exception
return createExpensiveGraph(key);
}
});

...
return graphs.getUnchecked(key);
批量查詢可以使用getAll(Iterable<? extends K>)方法。預設,getAll方法將循環每一個鍵調用CacheLoader.load方法獲取緩存值。當緩存對象的批量獲取比單獨獲取更有效時,可以通過復寫CacheLoader.loadAll方法實現緩存對象的載入。此時當調用getAll(Iterable)方法時性能也會提升。
需要注意的是CacheLoader.loadAll的實現可以為沒有明確要求的鍵載入緩存值。比如,當為某組中的一些鍵進行計算時,loadAll方法則可能會同時載入組中其餘鍵的值。
From a Callable
所有Guava緩存,不論是否會自動載入,都支持get(K, Callable(V))方法。當給定鍵的緩存值已存在時則直接返回,否則通過指定的Callable方法進行計算並將值存放到緩存中。直到載入完成時,相應的緩存才會被更改。該方法簡單實現了"if cached, return; otherwise create, cache and return"語義。
Java代碼
Cache<Key,Value> cache =CacheBuilder.newBuilder()
.maximumSize(1000)
.build();// look Ma, no CacheLoader
...
try{
// If the key wasn't in the "easy to compute" group, we need to
// do things the hard way.
cache.get(key,newCallable<Value>(){
@Override
publicValue call()throwsAnyException{
return doThingsTheHardWay(key);
}
});
}catch(ExecutionException e){
thrownewOtherException(e.getCause());
}

直接插入
使用cache.put(key, value)方法可以將值直接插入到緩存中,但這將會覆蓋緩存中已存在的值。通過使用Cache.asMap()所導出的ConcurrentMap對象中的方法也可以對緩存進行修改。但是,請注意asMap中的任何方法都不能自動的將數據載入到緩存中。也就是說,asMap中的各方法是在緩存自動載入范圍之外來運作。所以,當你使用CacheLoader或Callable來載入緩存時,應該優先使用Cache.get(K, Callable<V>),而不是Cache.asMap().putIfAbsent。
緩存回收
殘酷的現實是我們可以肯定的說我們沒有足夠的內存來緩存一切。你必須來決定:什麼時候緩存值不再值得保留?Guava提供了三種基本的緩存回收策略:基於容量回收策略,基於時間回收策略,基於引用回收策略。
基於容量回收策略
使用CacheBuilder.maximumSize(long)可以設置緩存的最大容量。緩存將會嘗試回收最近沒有使用,或者沒有經常使用的緩存項。警告:緩存可能會在容量達到限制之前執行回收,通常是在緩存大小逼近限制大小時。
另外,如果不同的緩存項有不同的「權重」, 如,緩存項有不同的內存佔用,此時你需要使用CacheBuilder.weigher(Weigher)指定一個權重計算函數,並使用CacheBuilder.maxmumWeight(long)設定總權重。和maximumSize同樣需要注意的是緩存也是在逼近總權重的時候進行回收處理。此外,緩存項的權重是在創建時進行計算,此後不再改變。
Java代碼
LoadingCache<Key,Graph> graphs =CacheBuilder.newBuilder()
.maximumWeight(100000)
.weigher(
newWeigher<Key,Graph>(){
publicint weigh(Key k,Graph g){
return g.vertices().size();
}
})
.build(
newCacheLoader<Key,Graph>(){
publicGraph load(Key key){// no checked exception
return createExpensiveGraph(key);
}
});

基於時間回收策略
CacheBuilder為基於時間的回收提供了兩種方式:
expireAfterAccess(long, TimeUnit) 當緩存項在指定的時間段內沒有被讀或寫就會被回收。這種回收策略類似於基於容量回收策略;
expireAfterWrite(long, TimeUnit) 當緩存項在指定的時間段內沒有更新就會被回收。如果我們認為緩存數據在一段時間後數據不再可用,那麼可以使用該種策略。
就如下面的討論,定時過期回收會在寫的過程中周期執行,偶爾也會讀的過程中執行。
測試定時回收
測試定時回收其實不需要那麼痛苦的,我們不必非得花費2秒來測試一個2秒的過期。在構建緩存時使用Ticker介面,並通過CacheBuilder.ticker(Ticker)方法指定時間源,這樣我們就不用傻乎乎等系統時鍾慢慢的走了。
基於引用回收策略
通過鍵或緩存值的弱引用(weak references),或者緩存值的軟引用(soft references),Guava可以將緩存設置為允許垃圾回收。
CacheBuilder.weakKeys() 使用弱引用存儲鍵。當沒有(強或軟)引用到該鍵時,相應的緩存項將可以被垃圾回收。由於垃圾回收是依賴==進行判斷,因此這樣會導致整個緩存也會使用==來比較鍵的相等性,而不是使用equals();
CacheBuilder.weakValues() 使用弱引用存儲緩存值。當沒有(強或軟)引用到該緩存項時,將可以被垃圾回收。由於垃圾回收是依賴==進行判斷,因此這樣會導致整個緩存也會使用==來比較緩存值的相等性,而不是使用equals();
CacheBuilder.softValues() 使用軟引用存儲緩存值。當響應需要時,軟引用才會被垃圾回收通過最少使用原則回收掉。由於使用軟引用造成性能上的影響,我們強烈建議使用可被預言的maximum cache size的策略來代替。同樣使用softValues()緩存值的比較也是使用==,而不是equals()。
顯示移除
在任何時候,你都可以可以通過下面的方法顯式將無效的緩存移除,而不是被動等待被回收:
使用Cache.invalidate(key)單個移除;
使用Cache.invalidteAll(keys)批量移除;
使用Cache.invalidateAll()移除全部。