列表數據部分欄位緩存
action本身肯定不能緩存數據的。http請求是短鏈接,不能保證每次被同一個實例訪問到。所以要傳輸數據有兩種方法。一個是通過畫面的隱藏欄位,再次將參數傳過來,不過你這里是數組,會麻煩一點。還有一種方式是通過session,這是最常用的。
2. 在頁面上進行緩存後又要保證局部的數據不緩存,如何實現
頁面部分緩存是指輸出緩存頁面的某些部分,而不是緩存整個頁面內容。實現頁面部分緩存有兩種機制:一種是將頁面中需要緩存的部分置於用戶控制項(.ascx文件)中,並且為用戶控制項設置緩存功能(包含用戶控制項的ASP.NET頁面可設置也可不設置緩存)。這就是通常所說的「控制項緩存」。設置控制項緩存的實質是對用戶控制項進行緩存配置。主要包括以下3種方法:一是使用@ OutputCache指令以聲明方式為用戶控制項設置緩存功能,二是在代碼隱藏文件中使用PartialCachingAttribute類設置用戶控制項緩存;三是使用ControlCachePolicy類以編程方式指定用戶控制項緩存設置。另外,還有一種稱為「緩存後替換」的方法。該方法與控制項緩存正好相反,將頁面中的某一部分設置為不緩存,因此,盡管緩存了整個頁面,但是當再次請求該頁時,將重新處理那些沒有設置為緩存的內容。
使用@ OutputCache指令
控制項緩存與頁面輸出緩存的@ OutputCache指令既有相似之處,又有不同的方面。二者的共同點在於它們的設置方法基本相同,都是文件頂部設置包含屬性的@ OutputCache指令字元串。不同點包括以下兩個方面:一是控制項緩存的@ OutputCache指令設置在用戶控制項文件中,而頁面輸出緩存的@ OutputCache設置在普通ASP.NET文件中。二是控制項緩存的@ OutputCache指令只能設置6個屬性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。而在頁面輸出緩存的@ OutputCache指令字元串中設置的屬性多達10個。以上是設置控制項緩存時需要注意的問題。下面列舉了一些利用@ OutputCache指令設置控制項緩存的示例,其中重點說明了VaryByParam和VaryByControl等屬性應用。
用戶控制項中的@ OutputCache指令設置源代碼
<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>
以上代碼設置用戶控制項緩存有效期時間是120秒,並且允許使用CategoryID和SelectedID參數來改變緩存。通過VaryByParam屬性設置,在伺服器緩存中可能存儲多個用戶控制項的實例。例如,對於一個包含用戶控制項的頁面,可能存在如下的URL鏈接。
包含用戶控制項的頁面的URL鏈接
http://localhost/mypage.aspx?categoryid=foo&selectedid=0
http://localhost/mypage.aspx?categoryid=foo&selectedid=1
當請求如上URL地址的頁面時,由於控制項中@ OutputCache指令的設置,尤其是屬性VaryByParam的設置,那麼在伺服器緩存中就會存儲兩個版本的用戶控制項緩存實例。
控制項緩存設置除了支持以上所述VaryByParam屬性外,還支持VaryByControl屬性。VaryByParam屬性基於使用POST或者GET方式發送的名稱/值對來改變緩存,而VaryByControl屬性通過用戶控制項文件中包含的伺服器控制項來改變緩存。下面是VaryByControl屬性的應用示例代碼。
用戶控制項中的@ OutputCache指令設置源代碼
<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %>
以上代碼設置緩存有效期是120秒,並且頁面不隨任何GET或POST參數改變(即使不使用VaryByParam屬性,但是仍然需要在@ OutputControl指令中顯式聲明該屬性)。如果用戶控制項中包含ID屬性為「Category」的伺服器控制項(例如下拉框控制項),那麼緩存將根據該控制項的變化來存儲用戶控制項數據。
如果讀者已經掌握了頁面輸出緩存的@ OutputCache指令設置方法,那麼控制項緩存的@ OutputCache指令也會迎刃而解,無非僅使用其中的6個屬性而已。然而,可能會產生疑問:如果ASP.NET頁面和其中包含的用戶控制項都通過@ OutputCache指令設置了緩存,那麼緩存該如何運行呢?
遇到這個問題時,應掌握以下個基本原則:一是ASP.NET允許在頁面和頁面的用戶控制項中同時使用@ OutputCache指令設置緩存,並且允許設置不同的緩存過期時間值。二是如果頁面輸出緩存過期時間長於用戶控制項輸出緩存過期時間,則頁面的輸出緩存持續時間優先。例如,如果頁面輸出緩存設置為100秒,而用戶控制項的輸出緩存設置為50秒,則包括用戶控制項在內的整個頁將在輸出緩存中存儲100秒,而與用戶控制項較短的時間設置無關。三是如果頁面輸出緩存過期時間比用戶控制項的輸出緩存過期時間短,則即使已為某個請求重新生成該頁面的其餘部分,也將一直緩存用戶控制項直到其過期時間到期為止。例如,如果頁面輸出緩存設置為50秒,而用戶控制項輸出緩存設置為100秒,則頁面其餘部分每到期兩次,用戶控制項才到期一次。
3. java memcached怎麼緩存部分數據
其實就相當於在應用程序和資料庫之間開了一塊內存區域,將一些高頻訪問的數據放在其中,避免每次都請求資料庫。至於之所以用memcached和redis,而不是自己在程序里開個hashmap,是因為這塊區域可以共享且容易管理,在集群環境下更方便使用。
4. 查詢數據放入了redis中緩存,怎麼查看緩存的數據
普通分頁
一般分頁做緩存都是直接查找出來,按頁放到緩存里,但是這種緩存方式有很多缺點。
如緩存不能及時更新,一旦數據有變化,所有的之前的分頁緩存都失效了。
比如像微博這樣的場景,微博下面現在有一個頂次數的排序。這個用傳統的分頁方式很難應對。
一種思路
最近想到了另一種思路。
數據以ID為key緩存到Redis里;
把數據ID和排序打分存到Redis的skip list,即zset里;
當查找數據時,先從Redis里的skip list取出對應的分頁數據,得到ID列表。
用multi get從redis上一次性把ID列表裡的所有數據都取出來。如果有缺少某些ID的數據,再從資料庫里查找,再一塊返回給用戶,並把查出來的數據按ID緩存到Redis里。
在最後一步,可以有一些小技巧:
比如在缺少一些ID數據的情況下,先直接返回給用戶,然後前端再用ajax請求缺少的ID的數據,再動態刷新。
5. 啟用資料庫欄位緩存有什麼好處
thinkphp 3.2關閉/開啟欄位緩存實例
通常每個模型類是操作某個數據表,在大多數情況下,系統會自動獲取當前數據表的欄位信息。
系統會在模型首次實例化的時候自動獲取數據表的欄位信息(而且只需要一次,以後會永久緩存欄位信息,除非設置不緩存或者刪除),如果是調試模式則不會生成欄位緩存文件,則表示每次都會重新獲取數據表欄位信息。
欄位緩存保存在Runtime/Data/_fields/ 目錄下面,緩存機制是每個模型對應一個欄位緩存文件(注意:並非每個數據表對應一個欄位緩存文件),命名格式是:
資料庫名.模型名(小寫).php
例如:
demo.user.php // User模型生成的欄位緩存文件
demo.article.php // Article模型生成的欄位緩存文件
欄位緩存包括數據表的欄位信息、主鍵欄位和是否自動增長,如果開啟欄位類型驗證的話還包括欄位類型信息等等,無論是用M方法還是D方法,或者用原生的實例化模型類一般情況下只要是不開啟調試模式都會生成欄位緩存(欄位緩存可以單獨設置關閉)。
可以通過設置DB_FIELDS_CACHE 參數來關閉欄位自動緩存,如果在開發的時候經常變動資料庫的結構,而不希望進行數據表的欄位緩存,可以在項目配置文件中增加如下配置:
// 關閉欄位緩存
'DB_FIELDS_CACHE'=>false
注意:調試模式下面由於考慮到數據結構可能會經常變動,所以默認是關閉欄位緩存的。
如果需要顯式獲取當前數據表的欄位信息,可以使用模型類的getDbFields方法來獲取當前數據對象的全部欄位信息,例如:
$User = M('User');
$fields = $User->getDbFields();
如果你在部署模式下面修改了數據表的欄位信息,可能需要清空Data/_fields目錄下面的緩存文件,讓系統重新獲取更新的數據表欄位信息,否則會發生新增的欄位無法寫入資料庫的問題。
如果不希望依賴欄位緩存或者想提高性能,也可以在模型類裡面手動定義數據表欄位的名稱,可以避免IO載入的效率開銷,例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age');
protected $pk = 'id';
}
pk屬性定義當前數據表的主鍵名,默認值就是id,因此如果是id的話可以無需定義。
除了可以設置數據表的欄位之外,我們還可以定義欄位的類型,用於某些驗證環節。例如:
namespace Home\Model;
use Think\Model;
class UserModel extends Model {
protected $fields = array('id', 'username', 'email', 'age',
'_type'=>array('id'=>'bigint','username'=>'varchar','email'=>'varchar','age'=>'int')
);
}
6. java如何將1個list存入緩存中並在緩存在修改數據
publicclassTest2{
publicstaticvoidmain(String[]args){
try{
List<String>list=newArrayList<>();
//模擬傳過來的值
inti=0;
while(true){
Longtime=newDate().getTime();
//將當前時間與值拼接成字元串保存到list
list.add("value"+i+","+time);
//調用處理方法
processing(list);
i++;
//模擬每次傳入的時間長度
Thread.sleep(3000);
}
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidprocessing(List<String>list){
//第一個存入的值
Stringsrc1=list.get(0);
//最後一個存入的值
Stringsrc2=list.get(list.size()-1);
//通過轉換成數組
String[]c1=src1.split(",");
String[]c2=src2.split(",");
//拿到第一個存入的時間字元串轉換成Long
Longl1=Long.parseLong(c1[1]);
//拿到最新的時間字元串轉換成Long
Longl2=Long.parseLong(c2[1]);
//如果大於等於30000毫秒就說明了過了30秒清空
if((l2-l1)>=30000){
list.clear();
}
System.out.println("每次的值"+src2);
System.out.println("是否30秒清空"+(list.size()==0));
}
}
/*******************************第二種方式*************************************/
publicclassTest2{
//定義一個全局變數用於接收時間
privatestaticLongtime=0L;
publicstaticvoidmain(String[]args){
try{
List<String>list=newArrayList<>();
//模擬傳過來的值
inti=0;
while(true){
//如果list是在清空狀態那麼就創建個時間為第一次時間
if(list.size()==0){
time=newDate().getTime();
}
//將字元串保存到list
list.add("value"+i);
//調用處理方法,沒次傳入一個當前存入對象的時間
processing(list,newDate().getTime());
i++;
//模擬每次傳入的時間長度
Thread.sleep(3000);
}
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidprocessing(List<String>list,Longtimes){
//當前時間-第一次存入的時間大於等於30000毫秒
//就是過了30秒執行清空操作
if((times-time)>=30000){
list.clear();
}
for(Stringls:list){
System.out.println("每次的值"+ls);
}
System.out.println("是否30秒清空"+(list.size()==0));
}
}
我沒有redis 只能模擬一個 你看下 其實 你就多了一步 從緩存中取值 判斷不能 等於 30000毫秒 因為 時間會有所偏差 可能大於 所以 大於等於,你要是覺得 毫秒太長你可以 轉換成秒存入 在計算
第二種 的話 你的程序 可能不需要太大改掉
7. java怎麼將資料庫的數據做緩存,方便查找。
你的數據非常大,那你寫入內存會不會比較占資源,為什麼不用非同步刷新,讓它顯示不部分再慢慢載入
8. asp.net如何將經常訪問的資料庫表放入緩存中
如果單是為減小資料庫壓力建議採用頁片斷緩存,即緩存頁面中部分內容(與數據相關的)。
可以採用Cache類、Session對象和Application對象(後兩者很常見,就不多說了)。
而Cache類是提供數據緩存的類,三者類似。
例如要經常讀取資料庫中一個的內容(銷售記錄等等)可將其存放一個dataset
首先從資料庫讀取並填充到一個名為DS的Dateset里(....這個不是樓主的問題就不討論了)
直接Cache("ds")=DS,則實現了將DataSet「存」到Cache("ds")里。
調用則是
首先定義一個新的Dateset 如 DS1
DS1=Cache("ds")即可
9. 怎麼寫一個緩存把從資料庫中的數據放入緩存中,在頁面直接讀取緩存中的數據
先定義成結構,把表裡的欄位存進結構,然後把結構定義成vector,把結構存入vector,也就是緩存了,要的時候取就是了
10. 什麼是緩存數據緩存是什麼意思
手機緩存數據是手機上的應用程序在使用過程中下載的臨時文件,方便下次使用時快速調用,但是如果手機的應用程序的緩存數據過多會佔用手機的存儲空間。
以iPhone 7手機為例,清除手機的緩存數據操作步驟如下:
1、打開手機上需要清除緩存數據的應用。