【原】spring redis 緩存註解使用

来源:http://www.cnblogs.com/zdd-java/archive/2017/09/19/7553271.html
-Advertisement-
Play Games

由於最近新上的項目很多模塊沒有做數據緩存,大量的請求都會到資料庫去查詢,為了減輕資料庫的壓力以及提高網站響應速度,所以在這裡採用了spring 提供的註解+redis實現對數據的緩存,主要針對非熱點數據,例如 省市,銀行卡列表等做緩存,在這裡主要是查詢做一個緩存實例。 pom.xml (加入spri ...


  由於最近新上的項目很多模塊沒有做數據緩存,大量的請求都會到資料庫去查詢,為了減輕資料庫的壓力以及提高網站響應速度,所以在這裡採用了spring 提供的註解+redis實現對數據的緩存,主要針對非熱點數據,例如 省市,銀行卡列表等做緩存,在這裡主要是查詢做一個緩存實例。

 

  •  pom.xml  (加入spring和reids jar包)
 <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
        </dependency>

 

  • spring-redis.xml配置(通過配置線程池方式連接redis, 提供操作redis的api)
<!-- jedis 配置 -->

    <!-- redis連接池的配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="100" />
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="minIdle" value="${redis.minIdle}"/>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        <property name="testOnReturn" value="${redis.testOnReturn}"/>
    </bean>

    <!-- redis的連接池pool,不是必選項:timeout/password  -->
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
        <property name="usePool" value="true"></property>
        <property name="hostName" value="${redis.host}" />
        <property name="port" value="${redis.port}" />
        <property name="password" value="${redis.password}" />
        <property name="timeout" value="100000" />
        <property name="database" value="0"></property>
        <constructor-arg index="0" ref="jedisPoolConfig" />
    </bean>

<!-- 配置redis模板,需要註入到 RedisCacheManager by dada --> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> </property> </bean> <!-- 配置緩存 by dada --> <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg ref="redisTemplate" /> <!--<property name="defaultExpiration" value="300"></property>--> <property name="usePrefix" value="true"></property> <property name="expires"> <util:map>
<!-- 指定key的時間為1500秒 -->
<entry key="get_bank_province_list" value="1500"></entry> <entry key="get_areas_bypid_list" value="1500"></entry> </util:map> </property> </bean>

 

  • 由於使用的是spring提供的註解方式實現redis緩存,所以需要在spring配置文件加上cache標簽,否則註解不會生效。
<!-- 啟用緩存註解功能,這個是必須的,否則註解不會生效,另外,該註解一定要聲明在spring主配置文件中才會生效,這個cacheManager
     必須指向redis配置裡面的 RedisCacheManager-->
    <cache:annotation-driven cache-manager="cacheManager" />

 


 

使用場景:

  1. 在需要用到緩存的service實現類方法加上對應的註解 @Cacheable註意以下這個方法中我並沒有傳入參數,如果不帶參數查詢則要定義一個key(如何自定義key參見第2條)否則運行時候會出現無法找到key的錯誤,至於為什麼報錯下次會詳細分析。
  2. #root.methodName  代表的是預設使用 getBankProvince 作為key的尾碼, 則拼接後的完整key為 get_bank_province_list:getBankProvince
  3. 第一次請求 getBankProvince方法先走redis,redis發現沒有這個key,則會查詢資料庫,查詢完成後會將數據存到redis。
  4. 第二次請求 getBankProvince方法直接取redis數據,不會再查詢資料庫。
    /**
     * @Cacheable 
     * 應用到讀取數據的方法上,先從緩存中讀取,如果沒有再從DB獲取數據,然後把數據添加到緩存中
     * unless 表示條件表達式成立的話不放入緩存
     */
    @Cacheable(value = "get_bank_province_list",key = "#root.methodName")
    public List<SAreasEntity> getBankProvince() {
       
        List<SAreasEntity> list = new ArrayList<SAreasEntity>();
        List<SAreasItem> listItem = sAreasMapper.getBankProvince();
        for(int i=0;i<listItem.size();i++){
            SAreasEntity sareasEntity=new SAreasEntity();
            SAreasItem sareasItem=listItem.get(i);
            sareasEntity.setId(sareasItem.getId());
            sareasEntity.setName(sareasItem.getName());
            sareasEntity.setPid(sareasItem.getPid());
            sareasEntity.setCity_name(sareasItem.getCity_name());
            list.add(sareasEntity);
        }
        return list;
    }

 

 

@Cacheable

應用到讀取數據的方法上,即可緩存的方法,如查找方法:先從緩存中讀取,如果沒有再調用方法獲取數據,然後把數據添加到緩存中。

 

除了上述使用方法參數作為key之外,Spring還為我們提供了一個root對象可以用來生成key。通過該root對象我們可以獲取到以下信息。

屬性名稱

描述

示例

methodName

當前方法名

#root.methodName

method

當前方法

#root.method.name

target

當前被調用的對象

#root.target

targetClass

當前被調用的對象的class

#root.targetClass

args

當前方法參數組成的數組

#root.args[0]

caches

當前被調用的方法使用的Cache

#root.caches[0].name


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

-Advertisement-
Play Games
更多相關文章
  • 將二叉樹拆成鏈表 描述 筆記 數據 評測 將一棵二叉樹按照前序遍歷拆解成為一個假鏈表。所謂的假鏈表是說,用二叉樹的 right 指針,來表示鏈表中的 next 指針。 註意事項 不要忘記將左兒子標記為 null,否則你可能會得到空間溢出或是時間溢出。 您在真實的面試中是否遇到過這個題? Yes 哪家 ...
  • 以下內容不包含maven的配置。。。 好,進入主題。 首先new一個項目,選擇Maven Project,點擊Next 選擇預設即可,繼續點Next 我這裡創建的是web工程,所以選擇webapp後點擊Next 填好 groupid和artifactId後會自動填寫package,填完後點擊fini ...
  • package com.swift; //這裡導入的包是java.sql.Connection而不是com.mysql.jdbc.Connection import java.sql.Connection; import java.sql.DriverManager; import java.sql ...
  • 4.三大範式: ...
  • ptyhon版本 Python 3.5.4 支持中文直接輸入和顯示,ptyhon2.x 中文支持需要轉碼 編輯器:pycharm hello world 註釋 單行註釋:用#作為單行註釋 多行註釋:使用3個單引號(''')或者3個雙引號(""")圍起來的內容將被註釋。如下 變數(var) 變數命名規 ...
  • 題目描述 形如2P-1的素數稱為麥森數,這時P一定也是個素數。但反過來不一定,即如果P是個素數,2P-1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的一個是P=3021377,它有909526位。麥森數有許多重要應用,它與完全數密切相關。 任務:從文件中輸入P(1000<P<310 ...
  • 上次我們講了Java中的一些基本的語法;今天我們就講一點內容,來說說Java中的方法和方法重載以及需要註意的一些地方; 方法: Java的方法類似與其他語言的函數,是一段用來完成特定功能的代碼片段, 聲明格式: [修飾符1 修飾符2 ....] ,返回值類型 方法名 (形式參數列表) { Java語 ...
  • 要理解select.select模塊其實主要就是要理解它的參數, 以及其三個返回值。select()方法接收並監控3個通信列表, 第一個是所有的輸入的data,就是指外部發過來的數據,第2個是監控和接收所有要發出去的data(outgoing data),第3個監控錯誤信息在網上一直在找這個sele ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...