為啥用redis解決會話呢?

什么是會話?

??會話可簡單理解為:用戶開一個瀏覽器,點擊多個超鏈接,訪問服務器多個web資源,然后關閉瀏覽器,整個過程稱之為一個會話。

?會話過程中要解決的一些問題?

–每個用戶不可避免各自會產生一些數據,程序要想辦法為每個用戶保存這些數據。

–例如:用戶點擊超鏈接通過一個servlet購買了一個商品,程序應該想辦法保存用戶購買的商品,以便于用戶點結帳servlet時,結帳servlet可以得到用戶購買的商品為用戶結帳。

?Cookie

–Cookie是客戶端技術,程序把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶著各自的數據去。這樣,web資源處理的就是用戶各自的數據了。

?HttpSession

–Session是服務器端技術,利用這個技術,服務器在運行時可以為每一個用戶的瀏覽器創建一個其獨享的HttpSession對象,由于session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據為用戶服務。

總結:cookie存在客戶端,session存在服務器端

?通常結合使用。

我們先用sprintboot演示一下cookie和session操作

    @RequestMapping(path = "/cookie/set",method = RequestMethod.GET)@ResponseBodypublic String setCookie(HttpServletResponse httpServletResponse){Cookie cookie=new Cookie("code", CommunityUtil.generateUUID());cookie.setPath("/community/alpha");cookie.setMaxAge(60*10);httpServletResponse.addCookie(cookie);return "set cookie";}@RequestMapping(path = "/cookie/get",method = RequestMethod.GET)@ResponseBodypublic String getCookie(@CookieValue("code") String code){System.out.println(code);return "get cookie";}@RequestMapping(path = "/session/set", method = RequestMethod.GET)@ResponseBodypublic String setSession(HttpSession session){session.setAttribute("id",1);session.setAttribute("name","Test");return "set session";}@RequestMapping(path = "/session/get", method = RequestMethod.GET)@ResponseBodypublic String getSession(HttpSession session) {System.out.println(session.getAttribute("id"));System.out.println(session.getAttribute("name"));return "get session";}

隨著服務器要處理的請求越來越多,我們不得不分布式部署,減小服務器壓力。

為了負載均衡,我們一般采用nginx來分發請求給各個服務器處理

但是這樣session是無法共享的。

(粘性session)

你可以設置nginx的分配策略,下次同一個還讓同一個服務器來處理

但是很顯然,這就和分布式和nginx初衷違背了:負載很難保證均衡。

(同步session)

一臺服務器的session給所有服務器復制一份

第一,性能不好。第二,產生了一定的耦合

(專門session)

專門一臺服務器來解決,存session,其它服務器來這個服務器取session再用。

但是也有問題:你這個服務器掛了怎么辦?別的服務器都是依賴這個服務器工作的。我們分布式部署本來就是為了解決性能的瓶頸啊。

很容易想到,我們把那個處理session的服務器搞個集群:

更不行,想想就知道,本來就是為了解決分布式部署的問題,你把單獨解決session的服務器又搞集群,和之前有什么區別呢?還不如一個服務器存一份簡單呢。

(存數據庫)

可以,但是傳統的關系數據庫是存到硬盤里,速度太慢。

(nosql)

最終,我們的主流辦法使用nosql數據庫,比如redis,來解決這個問題的。

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

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

相關文章

推薦系統(5)-深度推薦模型-AutoRec、DeepCrossing、NeuralCF、PNN、WideDeep、FNN、DeepFM、NFM

GBDTLR1. AutoRec-20152. Deep Crossing-20163. NeuralCF-20164. PNN-20165. Wide&Deep-20166. Deep&Cross-20177.FM深度學習7.1 FNN-20167.2 DeepFM-20177.3 NFM-2017《深度學習/推薦系統》讀書筆記2016年開始,推薦系統和計算廣告全面進入深度學習時代。 &…

關于在安裝caffe2環境中遇到的坑整理(歡迎入坑討論)

1.ImportError: cannot import name caffe2_pb2 測試caffe2的pytorch環境是否正常的時候使用 root@lxsj-ThinkStation:~/pytorch# python Python 2.7.12 (default, Dec 4 2017, 14:50:18) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", &…

leetcode172. 階乘后的零 最快算法

給定一個整數 n,返回 n! 結果尾數中零的數量。 示例 1: 輸入: 3 輸出: 0 解釋: 3! 6, 尾數中沒有零。 示例 2: 輸入: 5 輸出: 1 解釋: 5! 120, 尾數中有 1 個零. 說明: 你算法的時間復雜度應為 O(log n) 。 思路:102*5,而因數中2一定比…

Win10 連接 Ubuntu16.04.3(通過Xdrp連接xfce4界面)

Win10 連接 Ubuntu16.04.3(通過Xdrp連接xfce4界面) sudo apt-get install xrdp sudo apt-get install vnc4server sudo apt-get install xubuntu-desktop echo "xfce4-session" >~/.xsession sudo apt-get install dconf editor sudo dconf editor(或者在搜索…

Linux(17)-

Make編譯機制,Configure

聽說你還在糾結自己沒訪問量?成不了“博客專家”?

一、提高瀏覽量的技巧 相信很多人都這么想過:“我文章寫的這么好,怎么就沒人看呢?”; 或者這樣想過:“這文章寫得明明比我爛很多,憑什么這么多瀏覽量?”; 雖然在我看來這是極其嚴…

推薦系統(6)-注意力機制+深度推薦模型、強化學習推薦系統

注意力機制深度推薦模型、強化學習推薦系統1.AFM -20172.DIN-20173.DIEN-20194. DRN-20181.AFM -2017 Attention factorization machines–浙江大學–基于模型結構的改進 引入注意力機制FM, 可視為NFM模型的改進。給特征交叉池化后的特征向量施加不同的注意力權重。…

Caffe安裝的坑整理

怎么說了,入了深度學習的坑,就要踩一踩才算你入門,這里我整理了我在安裝學習caffe自己遇到的坑: 1.Caffe-GPU編譯問題:nvcc fatal : Unsupported gpu architecture compute_20 仔細查看了一下 Makefile.config 中 CUDA_ARCH 設置未按規定設置: # CUDA architecture se…

leetcode74. 搜索二維矩陣 ,你見過嗎

編寫一個高效的算法來判斷 m x n 矩陣中,是否存在一個目標值。該矩陣具有如下特性: 每行中的整數從左到右按升序排列。 每行的第一個整數大于前一行的最后一個整數。 示例 1: 輸入: matrix [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34,…

pytorch學習 入門篇(一)

PyTorch 是什么? 它是一個基于 Python 的科學計算包, 其主要是為了解決兩類場景: NumPy 的替代品, 以使用 GPU 的強大加速功能一個深度學習研究平臺, 提供最大的靈活性和速度Tensors(張量) Tensors 與 NumPy 的 ndarrays 非常相似, 除此之外還可以在 GPU 上使用張量來加速…

關系數據庫——范式/反范式的利弊權衡和建議

范式(避免數據冗余和操作異常) 函數依賴 A->B A和B是兩個屬性集,來自同一關系模式,對于同樣的A屬性值,B屬性值也相同 平凡的函數依賴 X->Y,如果Y是X的子集 非平凡的函數依賴 X->Y&#xff…

pytorch學習入門 (二) Variable(變量)

Variable(變量) autograd.Variable 是包的核心類. 它包裝了張量, 并且支持幾乎所有的操作. 一旦你完成了你的計算, 你就可以調用 .backward() 方法, 然后所有的梯度計算會自動進行. 你還可以通過 .data 屬性來訪問原始的張量, 而關于該 variable&#…

Linux(x)-

Ubuntu裝機后的基礎應用

pytorch入門學習(三) 神經網絡

神經網絡可以使用 torch.nn 包構建. autograd 實現了反向傳播功能, 但是直接用來寫深度學習的代碼在很多情況下還是稍顯復雜,torch.nn 是專門為神經網絡設計的模塊化接口. nn 構建于 Autograd 之上, 可用來定義和運行神經網絡. nn.Module 是 nn 中最重要的類, 可把它看成是一個…

leetcode1033. 移動石子直到連續

三枚石子放置在數軸上&#xff0c;位置分別為 a&#xff0c;b&#xff0c;c。 每一回合&#xff0c;我們假設這三枚石子當前分別位于位置 x, y, z 且 x < y < z。從位置 x 或者是位置 z 拿起一枚石子&#xff0c;并將該石子移動到某一整數位置 k 處&#xff0c;其中 x &…

pytorch學習 訓練一個分類器(五)

訓練一個分類器 就是這個, 你已經看到了如何定義神經網絡, 計算損失并更新網絡的權重. 現在你可能會想, 數據呢? 一般來說, 當你不得不處理圖像, 文本, 音頻或者視頻數據時, 你可以使用標準的 Python 包將數據加載到一個 numpy 數組中. 然后你可以將這個數組轉換成一個 to…

Git(6)-Git配置文件、底層操作命令

Git基本命令1. 常用(迷糊)命令-冷知識2. git 配置2.1 設置 配置文件2.2 查看 配置文件--git config -l2.3 移除 配置文件設置--unset2.3 命令別名 --alias3.git 對象 &#xff08;git底層操作命令&#xff09;3.1 初始化一個版本庫3.2 新建一個簡單的blob 對象3.3 基于散列值查…

【軟考中級】網絡工程師:8.網絡安全

本章考察內容比較廣泛&#xff0c;考題對知識點都會有所涉及。 8.1 網絡安全的基本概念 8.1.1 網絡安全威脅的類型 竊聽 這種情況發生在廣播式網絡系統中&#xff0c;每個節點都可以讀取數據&#xff0c;實現搭線竊聽、安裝通信監視器和讀取網上的信息等。 假冒 當一個實體…

leetcode9 回文數

判斷一個整數是否是回文數。回文數是指正序&#xff08;從左向右&#xff09;和倒序&#xff08;從右向左&#xff09;讀都是一樣的整數。 示例 1: 輸入: 121 輸出: true 示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個…

caffe各層參數詳解

在prototxt文件中,層都是用layer{}的結構表示,而里面包含的層的參數可以在caffe.proto文件中找到,比如說Data類型的結構由message DataParameter所定義,Convolution類型的結構由message ConvolutionParameter所定義。 具體說明下: name表示該層的名稱type表示該層的類型,…