session和cache的區別

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

以前實現數據的緩存有很多種方法,有客戶端的Cookie,有服務器端的Session和Application

其中Cookie是保存在客戶端的一組數據,主要用來保存用戶名等個人信息。

Session則保存對話信息。Application則是保存在整個應用程序范圍內的信息,相當于全局變量。

Session

Session用來保存每一個用戶的專有信息

Session的生存期是用戶持續請求時間加上一段時間(一般是20分鐘左右)

Session信息是保存在Web服務器內存中的,保存數據量可大可小
由于用戶停止使用應用程序之后它仍在內存中存留一段時間,因此這種方法效率較低

代碼:

Session[“UserID”]=”test”;
String UserName=Session[“UserID”].ToString();


Cookie

Cookie用來保存客戶瀏覽器請求服務器頁面的請求信息

我們可以存放非敏感的用戶信息,保存時間可以根據需要設置

如果沒有設置Cookie失效日期,它的生命周期保存到關閉瀏覽器為止

Cookie對象的Expires屬性設置為MinValue表示永不過期

Cookie存儲的數據量受限制,大多數的瀏覽器為4K因此不要存放大數據

由于并非所有的瀏覽器都支持Cookie,數據將以明文的形式保存在客戶端

代碼:

Resopnse.Cookies[“UserID”]=”test”;
String UserName= Resopnse.Cookies [“UserID”].ToString();


Cache

Cache用于在Http請求期間保存頁面或者數據

Cache的使用可以大大的提高整個應用程序的效率

它允許將頻繁訪問的服務器資源存儲在內存中,當用戶發出相同的請求后,服務器不是再次處理而是將Cache中保存的數據直接返回給用戶

可以看出Cache節省的是時間—服務器處理時間

Cache實例是每一個應用程序專有的,其生命周期==該應用程序周期

應用程序重啟將重新創建其實例

注意:如果要使用緩存的清理、到期管理、依賴項等功能必須使用Insert 或者Add方法方法添加信息

代碼:

Cache[”ID”]=”cc”;或者Cache.Insert(“ID”,”test”);
String ID =Cache[“ID”].ToString();


通常使用最頻繁的是Session,那么Session和Cache又有什么區別呢?

Session緩存和Cache緩存的區別。

(1)最大的區別是Cache提供緩存依賴來更新數據,而Session只能依靠定義的緩存時間來判斷緩存數據是否有效。

(2)即使應用程序終止,只要Cache.Add方法中定義的緩存時間未過期,下次開啟應用程序時,緩存的數據依然存在。而Session緩存只是存在于一次會話中,會話結束后,數據也就失效了。

(3)Session容易丟失,導致數據的不確定性,而Cache不會出現這種情況。

(4)由于Session是每次會話就被加載,所以不適宜存放大量信息,否則會導致服務器的性能降低。而Cache則主要用來保存大容量信息,如數據庫中的多個表。

(5)Session目前只能保存在內存中,對其性能有影響。

?

?

Session:為當前用戶會話提供信息。還提供對可用于存儲信息的會話范圍的緩存的訪問,以及控制如何管理會話的方法。它存儲在服務器的內存中,因此與在數據庫中存儲和檢索信息相比,它的執行速度更快。與不特定于單個用戶會話的應用程 序狀態不同,會話狀態應用于單個的用戶和會話。因此,應用程序狀態非常適合存儲那些數量少、隨用戶的變化而變化的常用數據。而且由于其不發生服務器-客戶 端數據傳輸,Session還適合存儲關于用戶的安全數據,如購物車信息。

?

Session的關鍵特性有:存儲于服務器內存中,與會話相關,在會話的整個生存期中存在即不會被主動丟棄,不被序列化,不發生服務器-客戶端數據傳輸。
??????Cache:它存儲于 服務器的內存中,允許您自定義如何緩存項以及將它們緩存多長時間。例如,當缺乏系統內存時,緩存會自動移除很少使用的或優先級較低的項以釋放內存。該技術 也稱為清理,這是緩存確保過期數據不使用寶貴的服務器資源的方式之一。它不與會話相關,所以它是多會話共享的,因此使用它可以提高網站性能,但是可能泄露 用戶的安全信息,還由于在服務器缺乏內存時可能會自動移除Cache因此需要在每次獲取數據時檢測該Cache項是否還存在。
Cache的關鍵特性有:存儲于服務器內存中,與會話無關,根據服務器內存資源的狀況隨時可能被丟棄,不被序列化,不發生服務器-客戶端數據傳輸。

Cookie:Cookie 提供了一種在 Web 應用程序中存儲用戶特定信息的方法。例如,當用戶訪問您的站點時,您可以使用 Cookie 存儲用戶首選項或其他信息。當該用戶再次訪問您的網站時,應用程序便可以檢索以前存儲的信息。在開發人員以編程方式設置Cookie時,需要將自己希望保 存的數據序列化為字符串(并且要注意,很多瀏覽器對Cookie有4096字節的限制)然后進行設置。

Cookie的關鍵特性有:存儲于客戶端硬盤上,與用戶相關,在一定時間內持久化存儲,可以跨瀏覽器共享數據,需要被序列化,發生服務器-客戶端數據傳輸。
下面這個問題很有啟發性:
最近小組的同事很喜歡用Session做頁面跳轉,具體就是在查詢頁面把查詢結果放到DataTable中,用Session存儲這個dataTable,讀取到數據之后再子頁面做Session清除,這樣對性能有沒有什么影響?

1、session:session的確是存放在服務器的內存中(但不是4k上限,具體大小限制應該是服務器內存),而且同一個sessionid的多個 http請求會排隊,也就是session對于同一個瀏覽器來說是同步的,用不好會極大影響性能。另外,session依賴于客戶端cookie,因為 sessionid是存放在客戶端瀏覽器進程cookie中的,因此不支持cookie的瀏覽器,session也會丟失(session url重寫可部分解決這個問題,可參考:http://www.sungness.com/archives/48)。因此不建議用。

2、cookie,也不建議存放datatable這樣的“大數據”。因為cookie不僅有4k上限,并且不是“純存放在客戶端”這么簡單,要知道 cookie的值在每次web頁面請求往返的過程中都是要附帶在http頭中的,如果太大會占用服務器和客戶端之間的網絡帶寬(雖然只是4k,但在線人多 了可就是4k?*?n了)。對于b/s結構的應用來說,網絡帶寬是性能最主要的瓶頸之一!另外,對于datatbale轉換成json字符串再存入 cookie,服務器CPU也會消耗。最可怕的是,一但你的cookie忘記刪除了,那么在其有效期和作用域內,用戶訪問你的所有頁面時都將攜帶這個4K 大小的http頭,那就悲劇了。10000在線人數,4千兆網卡也不夠你花的。

3、數據庫連接,每次保存查詢語句然后再查詢的方式不錯,不過看你的查詢復雜度了,如果很費時的查詢,這樣調用也是不可取的。內存和cpu的矛盾你要根據 實際情況作出選擇。對于具有連接池的應用來說,一次連接數據的成本并不高,經過測試差不多=10次調用取當前系統時間函數。但查詢語句的復雜度就沒譜了。 另外,如果并發人數很多的情況下,頻繁占用數據庫連接,會導致連接池沒有可用連接了,那就又悲劇了。此時就不是一次連接的成本,系統整體性能將毀滅性的下 降,反應遲鈍。

4、cache:一個不錯的選擇,不過它可同樣是占用服務器內存哦,只是比session多了一些靈活性。不過我也不建議你用于存放傳遞參數的地方。要知 道session就算內存滿了也不會丟失你的參數值(會拋異常),可cache可不是,它會直接刪掉你的參數值,甚至內存極度不足時都不會讓你進去(也不 會報錯)。換句話說,可能上一行代碼剛存進去,下一行代碼去讀就丟了。很可怕吧~

5、form表單:最為提倡的方式,http協議中原本頁面間傳值的方法就是這樣的,只是有時不太方便,能用之則用之。
6、自定義存儲機制:如果你對性能要求很苛刻,或者非要精益求精的話。那么還是自己寫一個存儲機制吧。例如我自己就是寫了自己的XSession對象,它 的用法與session使用類似,但是存儲機制都是我自己封裝的,既有cache的優點、又有session的優點,還有數據庫的優點、性能看你寫的算法 了、而且具有更大的使用靈活性。缺點就是需要你自己coding

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第四個

。 轉載于:https://www.cnblogs.com/wxy2000/p/9657823.html

26-- 轉換成小寫字母

文章目錄1.問題描述2.代碼詳情1.問題描述 實現函數 ToLowerCase(),該函數接收一個字符串參數 str,并將該字符串中的大寫字母轉換成小寫字母,之后返回新的字符串。 示例 1: 輸入: “Hello” 輸出: “hello” 示例 2:…

java守護線程和用戶線程的區別

Java中的線程可以分為兩類,即用戶線程和守護線程。用戶線程是為了完成任務,而守護線程主要是為其他線程服務。 守護線程的唯一用途是為其他線程提供服務。守護線程會隨時中斷,因此不要在守護線程上使用需要釋放資源的資源,如輸入輸…

初學duboo+zookeeper

看了很多相關資料,其實都沒有自己動手試一次印象更深刻一些。找了很多教程,下工具,花了幾個小時終于讓程序跑起來了,下面說下步驟:1.java環境也就安裝jdk,我使用的是1.7版本,jdk安裝就不在這復述…

Fedora 17 Beta 版發布

Fedora團隊今天發布了Fedora 17 Beta版本,這是正式版本發布前的最后一個重要的里程碑版本。據該團隊介紹,正式版將在今年5月發布,將主要修復Beta版中發現的關鍵性bug。針對普通用戶的桌面改進: 采用GNOME 3.4,提升了用…

27--字符串相加

文章目錄1.問題描述2.代碼詳情1.問題描述 給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和。 注意: num1 和num2 的長度都小于 5100. num1 和num2 都只包含數字 0-9. num1 和num2 都不包含任何前導零。 你不能使用任何內建 BigInteger 庫&…

[轉] 一文弄懂神經網絡中的反向傳播法——BackPropagation

在看CNN和RNN的相關算法TF實現,總感覺有些細枝末節理解不到位,浮在表面。那么就一點點扣細節吧。 這個作者講方向傳播也是沒誰了,666~ 原文地址:https://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度學習…

java線程組

線程組 線程組是Java線程編程所持有的概念。在Java中,線程組是指java.lang.ThreadGroup類的對象,每個線程都隸屬于唯一的一個線程組,這個線程組在線程創建時指定并在線程的整個生命周期內都不能更改。可以通過調用包含ThreadGroup類型參數的T…

FreeBSD 8.3 發布

近日,FreeBSD開發團隊放出了8.x穩定分支的8.3版本。此次發行的版本將支持amd64、i386、pc98和 sparc64等處理器類型。FreeBSD是一種類UNIX操作系統,但不是真正意義上的 UNIX 操作系統,它是由經過 BSD、386BSD 和 4.4BSD 發展而來的 Unix 的一…

Java中四種訪問權限總結

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、Java中有四種訪問權限, 其中三種有訪問權限修飾符,分別為private、public、protected,還有一種不…

28--僅僅反轉字母

文章目錄1.問題描述2.代碼詳情1.問題描述 給定一個字符串 S,返回 “反轉后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置發生反轉。 示例 1: 輸入:“ab-cd” 輸出:“dc-ba” 示例 2&…

Moving Average

移動平均算法Demo #!/usr/bin/python2.7 # Fetch data from BD and analyse.import json import urllib import traceback import numpy as np # import pandas as pd import matplotlib.pyplot as plt #from scipy import statsdef fetch_raw_data(url):try:response urllib.…

【前端工程師手冊】JavaScript作用域拾遺

【前端工程師手冊】JavaScript作用域拾遺 昨天總結了一些作用域的知識【前端工程師手冊】JavaScript之作用域,但是發表完發現忘記了一些東西,今天拾個遺。 昨天說到了JavaScript中沒有塊級作用域,其實在es6中是有的。 es6中的塊級作用域 先舉…

游戲開發中的數據表示

聲明:本文內容源自騰訊游戲學院程序公開課_服務端 一、數據表示的基礎 什么是數據表示? 數據是信息的載體。 數據表示是一組操作,可以描述、顯示、操作信息。 數據表示的要素 IDL - 接口描述語言 IDL是用來描述軟件組件接口的一種計算機語言。…

29--反轉字符串

文章目錄1.問題描述2.代碼詳情1.問題描述 編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。 不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 你可以假設數組中…

什么是臨界區

臨界區[1] 指的是一個訪問共用資源(例如:共用設備或是共用存儲器)的程序片段,而這些共用資源又無法同時被多個 線程 訪問的特性。當有線程進入臨界區段時,其他線程或是 進程 必須等待(例如:bo…

BZOJ 2957 樓房重建 (分塊)

題解:分塊,然后暴力維護每一塊上升序列,注意是不是最長上升序列,二分查找第二塊中大于第一塊的最后一個上升序列中的數。 注意:每一塊的大小不要用√n會T掉的,把塊的大小設為500-600都可以(T了一…

OpenBSD 5.1 正式版發布

OpenBSD 開發團隊于近日發布了 5.1 正式版。 OpenBSD是一個從NetBSD衍生出來的類Unix操作系統。項目領導人Theo de Raadt在1995年發起了OpenBSD項目,希望創造一個注重安全的操作系統,此外OpenBSD也以高品質的文件、堅持開放程式碼以及嚴格的軟件授權著名…

Spring事務傳播行為7種類型 --- 看一遍就能記住!

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、Spring 事務傳播行為一共有7種類型,主要分為3類: 1)支持當前事物、 2)不支持當前事…

PowerShell變量——PowerShell三分鐘(七)

有了前面的PowerShell基礎,今天我們來學習一個可以極大提升PowerShell效率的用法——變量簡答來說呢,變量就是在內存中的一個帶有名字的盒子~~~~~你可以把所有想存放的東西都放到這個“盒子”里。然后通過名字去訪問這個盒子。在訪問過程中,可…