nginx+redis(記憶體型資料庫)實現session的共用

来源:https://www.cnblogs.com/xishaohui/archive/2018/03/29/8662676.html
-Advertisement-
Play Games

註意:借鑒原文章:http://www.cnblogs.com/roy-blog/p/7196054.html 感興趣的可以加一下481845043 java交流群,共同進步。 1 session的概念 在網路應用中我們會稱為“會話控制”,在開發中我們常稱其為session對象,用來存儲特定用戶會話 ...


註意:借鑒原文章:http://www.cnblogs.com/roy-blog/p/7196054.html

   感興趣的可以加一下481845043 java交流群,共同進步。

1 session的概念

  在網路應用中我們會稱為“會話控制”,在開發中我們常稱其為session對象,用來存儲特定用戶會話所需的屬性及配置信息。當用戶在應用程式的 Web 頁之間跳轉時,存儲在 Session 對象中的變數將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該用戶還沒有會話,則 Web 伺服器將自動創建一個 Session 對象。當會話過期或被放棄後,伺服器將終止該會話。Session 對象最常見的一個用法就是存儲用戶的首選項。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲在 Session 對象中。註意 :會話狀態僅在支持 cookie 的瀏覽器中保留。

2 為什麼實現session共用

  在利用nginx實現了負載均衡和動靜分離之後,會面臨一個記憶體數據同步的問題,我們通常將一些例如:用戶信息,重要標識等具有唯一標識的數據,存在記憶體中,典型的一種就是在數據存在session中。例如:我有A,B兩台伺服器做了負載均衡,當我在A伺服器上執行了登錄並且將登錄數據存入session的時候,這些session數據只存在於A伺服器上,而沒有在B伺服器上,假如在處理下一個請求的時候,我需要用到session的數據,而不巧的是,這個請求剛好被交由B伺服器來處理,這時候就會出現B伺服器拿不到session數據的情況,從而造成錯誤。如何讓session數據在集群的各個分支中共用session呢,

肯定方法不只一種,但是本質肯定是實現session數據在各個伺服器的同步,可能大家第一次想到的是使用資料庫進行數據的存儲,但其實質上是存儲在改伺服器的磁碟中,但是我們都知道session之所以出現是因為它是在記憶體中的,程式讀取記憶體的數據要遠遠比讀取磁碟的數據快,所以我們把一些經常用到的東西都放在session裡面。

  有沒有一種資料庫,是存放在記憶體中的呢?這就是redis。通俗的講,它就是一個資料庫,但是這個資料庫是存儲在記憶體裡面的,所以讀寫數據速度要比磁碟的快得多。又因為它是一個資料庫,所以可以實現數據的同步。我們把session數據存放在redis中,然後所有的集群分支都可以去訪問這個資料庫裡面的東西,這就是全局緩存的原理。

3 安裝與運行

  本人是在Windows本地系統下下載測試的,下載地址:https://github.com/MSOpenTech/redis/releasesRedis 支持 32 位和 64 位。這個需要根據你系統平臺的實際情況選擇,這裡我下載 Redis-x64-xxx.zip壓縮包到 E 盤,解壓後可以直接使用,將文件夾重新命名為 redis。目錄結構如下。

 

  可以通過目錄下的redis.windows.conf 文件Ctrl+F 查找 # requirepass,將其前面的#刪除 後面加入你的新密碼,例如123,來設置你的密碼,因為一開始redis是預設沒有密碼的。但是為了安全起見,在開發中使用要設置密碼。

  解壓後打開一個 cmd 視窗 使用cd命令切換目錄到 E:\redis 運行 redis-server.exe redis.windows.conf 。如果想方便的話,可以把 redis 的路徑加到系統的環境變數里,這樣就省得再輸路徑了,後面的那個 redis.windows.conf 可以省略,如果省略,會啟用預設的。輸入之後,會顯示如下界面:

 

 

只要你出現上圖樣式,即為開啟成功。註意的是,當你關閉這個dos視窗,redis服務會馬上關閉,所以為了以後使用方便,可以使用redis命令:

 redis-server --service-install redis.windows.conf 將其安裝成Windows服務,設置自啟或手動,安裝成功後可以在服務中找到Redis。

還有需要註意的一點就是當你在redis.windows.conf 文件中修改密碼後,不能馬上起作用。需要使用redis命令,redis-server --service-stop進行redis服務的關閉。

 4 項目中使用,做一些配置工作,來實現session數據的全局緩存。

  1)首先是添加jar包,如果你是maven項目,需要在pom.xml加入下麵代碼

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
            <version>1.3.1.RELEASE</version>
            <type>pom</type>
     </dependency>

 

     如果不是maven項目,你需要加入下麵這些jar包。

 

   2) 編寫redis.properties,代碼如下:

redis_isopen:yes
#主機地址
redis_hostName=xxx.xxx.xxx.xxx
#埠
redis_port=6379
#密碼
redis_password=xxxxxxxx
#連接超時時間
redis_timeout=200000
redis_maxIdle=300
redis_maxActive=600
redis_maxWait=100000
redis_testOnBorrow=true

 

  3)編寫spring-redis.xml配置文件,這個文件配置關於redis的一些基本信息。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd  ">
    <!-- session設置 maxInactiveIntervalInSeconds為session的失效時間,單位為秒-->
    <bean
        class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="3600"></property>
    </bean>
    <!-- redis連接池 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis_maxIdle}" />
        <property name="testOnBorrow" value="${redis_testOnBorrow}" />
    </bean>
    <!-- redis連接工廠 -->
    <bean id="connectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis_hostName}" />
        <property name="port" value="${redis_port}" />
        <property name="password" value="${redis_password}" />
        <property name="timeout" value="${redis_timeout}" />
        <property name="poolConfig" ref="poolConfig"></property>
    </bean>
</beans>

  4)在application.xml(spring的主配置文件)需要加入redis.properties配置文件的掃描,如下。

<!-- 讀取redis參數配置 -->
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>/WEB-INF/classes/redis.properties</value>
            </list>
        </property>
    </bean>

  5)在主配置文件中引入spring-redis.xml,如下。

<import resource="spring-redis.xml" />

  6)在web.xml中,加入關於session的過濾器,只有這樣session才會被redis所操縱。

<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

這樣以後,我們就實現了redis對session的管理。 PS.再退出的時候,需要這樣寫才不會出錯。(ssh項目)

public String yipinExit(){
        Iterator<String>keys=session.keySet().iterator();
        while(keys.hasNext()){
            String key=keys.next();
            session.remove(key);
        }
        return "yipinExit";
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近應項目需求,為了獲取到更多用戶想要搜索的信息,需要把用戶點擊複製的內容獲取到,然後傳送給後臺以更好的瞭解客戶需求,自己在這個方法上栽了個大跟頭,只考慮其一卻不知道結合使用,腦袋卡頓,隨筆記下,望自己能夠慢慢成長、進步。 其中window.getSelection()是為了獲取選中的內容,詳解見h ...
  • 左右氣泡信息,這種展示效果用代碼寫並不難,但是我覺得這種佈局很有意思,所以就記錄下來了~~ 效果圖: ...
  • 1、jsp頁面通過EL表達式獲取list大小,中間件用tomcat7時,下麵這個寫法是可以的 2、但是如果用低版本的中間件,比如tomcat6,就會報錯,這種寫法有相容性問題,那麼需要改成下麵這種就相容低版本了 ...
  • 我新建了一個web前端的新手交流群,包括基礎知識和剛入職的技術分享,人還不多,期待著每一個人的加入,希望可以得到你的認同哦~你的加入是我組織交流群的一大動力哦!~ 歡迎大佬進駐,有很多萌新等待大佬的幫助哦! web前端交流QQ群:314439765 ...
  • 線程在它的生命周期中會處於各種不同的狀態:新建、等待、就緒、運行、阻塞、死亡。1、新建用new語句創建的線程對象處於新建狀態,此時它和其他java對象一樣,僅被分配了記憶體。2、等待當線程在new之後,並且在調用start方法前,線程處於等待狀態。 3、就緒當一個線程對象創建後,其他線程調用它的sta ...
  • 還是看代碼能讓我靜下心來。我現在語言表達能力嚴重下降,又不自信。fuck,不想了,我還是我,世上獨一無二的我。走自己的路,讓別人看吧。馬上4月了,天也變熱了! 閑話少扯,今天說單例模式,就算22種模式都不知道,也應該知道單例模式,這個在實際項目中用的比較多。 一個應用是一個進程,在記憶體中分配一定的空 ...
  • 橋接模式屬於先天模式,這裡的先天模式就是說一開始就要把結構搭建好,方便後來的擴展,而不是對已經出現的模塊和介面進行改進擴展的。橋接的核心在於實體類和操作類之間的聚合關係,這個聚合關係就是我們所說的"橋",不同於裝飾、代理和適配器模式的中的聚合關係,橋接不存在兩者之間的繼承關係,操作類是完全解耦的,而 ...
  • Spring Cloud 是一個基於 Spring Boot 實現的雲應用開發工具,它為基於 JVM 的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制匯流排、全局鎖、決策競選、分散式會話和集群狀態管理等操作提供了一種簡單的開發方式。通過 Spring Boot 風格進行再封裝屏蔽 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...