基於註解的方式整合Srpingmvc+Redis

来源:https://www.cnblogs.com/mouxuezhang/archive/2018/03/17/8593094.html
-Advertisement-
Play Games

項目中原本使用的是手動獲取redis鏈接池的方式進行的與Spring的整合,現在需要修改為註解的形式。初次接觸redis,做個記錄。 1. 首先添加 jackson的jar包, 需要添加的 jar包共有三個,分別為:jackson-annoations-2.4.4.jar,jackson-core- ...


  項目中原本使用的是手動獲取redis鏈接池的方式進行的與Spring的整合,現在需要修改為註解的形式。初次接觸redis,做個記錄。

  1. 首先添加 jackson的jar包, 需要添加的 jar包共有三個,分別為:jackson-annoations-2.4.4.jar,jackson-core-2.4.4.jar,jackson-databind-2.4.4.jar,此項目中使用的是同一版本的jar。

  2. 更新redis的配置文件,添加redis緩存管理器配置RedisCacheManager,添加redis緩存配置RedisCacheConfig,更新RedisTemplate,添加對key和value的序列化支持:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/aop 
						http://www.springframework.org/schema/aop/spring-aop.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
	">

    <!-- 配置RedisTemplate --> 
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">  
        <property name="connectionFactory"   ref="jedisConnectionFactory" />  
     <!-- 設置key和value的序列化 -->  <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" /> </property> </bean> <!-- 配置JedisConnectionFactory --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig" /> <!-- 配置JedisPoolConfig實例 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <!-- 配置RedisCacheConfig --> <bean id="redisCacheConfig" class="com.fh.dao.redis.RedisCacheConfig"> <constructor-arg ref="jedisConnectionFactory" /> <constructor-arg ref="redisTemplate" /> <constructor-arg ref="redisCacheManager" /> </bean> <!-- 配置RedisCacheManager --> <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg name="redisOperations" ref="redisTemplate" /> <property name="defaultExpiration" value="${redis.expiration}"/> <!-- 此處可以設置項目中用到的緩存名稱,即@Cache* 標簽中的value --> <constructor-arg name="cacheNames"> <set> <value>caiya_a</value> <value>caiya_test</value> <value>sampleCache1</value> <value>memoryCache</value> <value>scanCache</value> <value>padIndexCache</value> <value>sampleCache1</value> <value>sampleCache1</value> </set> </constructor-arg> <!--預設緩存名字--> <property name="defaultCacheName" value="caiya_a"/> <!--是否在容器啟動時初始化--> <property name="loadRemoteCachesOnStartup" value="true"/> <!--是否使用首碼--> <property name="usePrefix" value="true"/> <!--首碼命名,僅當usePrefix為true時才生效--> <property name="cachePrefix"> <bean class="org.springframework.data.redis.cache.DefaultRedisCachePrefix"> <constructor-arg name="delimiter" value=":"/> </bean> </property> <!--緩存名字和有效期的分隔符--> <property name="separator" value="#"/> <!--預設有效期1h--> <!-- 多個緩存有效期,一般的單個工程可以省略此項 --> <!-- <property name="expires"> <map> <entry key="caiya_a" value="1800"/> </map> </property> --> </bean> </beans>

  3. 創建RedisCacheConfig緩存配置類:

package com.at.dao.redis;

import java.lang.reflect.Method;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * 以Spring與配置文件來管理的redis緩存配置類
 *
 * 必須添加EnableCaching註解,才能正常啟用緩存功能
 *
 * @author at
 * 2018-3-15
 */
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {

    private volatile JedisConnectionFactory mJedisConnectionFactory;
    private volatile RedisTemplate<String, String> mRedisTemplate;
    private volatile RedisCacheManager mRedisCacheManager;

    public RedisCacheConfig() {
        super();
    }

    public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory,
            RedisTemplate<String, String> mRedisTemplate, RedisCacheManager mRedisCacheManager) {
        super();
        this.mJedisConnectionFactory = mJedisConnectionFactory;
        this.mRedisTemplate = mRedisTemplate;
        this.mRedisCacheManager = mRedisCacheManager;
    }

    public JedisConnectionFactory redisConnectionFactory() {
        return mJedisConnectionFactory;
    }

    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
        return mRedisTemplate;
    }

    public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
        return mRedisCacheManager;
    }

    @Bean
    public KeyGenerator customKeyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }

}

  

  4. 更新實體類使其實現序列化,其中:@JsonNaming是jackson 2.1+版本的註解,作用於類或方法,註意這個註解是在jackson-databind包中而不是在jackson-annotations包里,它可以讓你定製屬性命名策略。@JsonSerialize 用來實現實體類的序列化。

  5. 添加對應的dao介面,因此項目使用的是SqlSessionTemplate操作的dao層,此處不再展示代碼。

  6. 添加 service和serviceimpl。在介面方法的實現上和dao層都可以添加@Cache*註解,此項目中主要添加在service的方法實現上。

// 此註解是將該方法的返回值放入value的緩存下的key的值中,首次請求該方法時會處理緩存。再次請求該方法時,將先查找緩存中是否有對應的key,如果有則跳過方法執行。
@Cacheable(value="value",key="'key'")
public List<PageData> getModel(PageData pd) throws Exception {
	System.out.println("調用了方法");
	return (List<PageData>) dao.getModel(pd);
}
// 此註解跟上面的註解功能相同,但不同的是,該註解將不會使方法跳過執行,而是每次執行後都將新的返回結果更新到value下的key中
@CachePut(value="value", key="'key'")
public String updateEndTime(String arg1) {
    return arg1;
}

// 此註解將會使緩存中的key清除.
@CacheEvict(value="figure", key="'figureList'",beforeInvocation=true)
public int updateFigure(PageData pd) throws Exception{
    System.out.println("調用了方法");
    return (int) dao.update("CarouseFigureMapper.updateFigure", pd);
}

  註意:這些註解中都有的相同的參數為:value,key, condition。value表示使用哪個緩存,是必須指定的參數。key屬性是用來指定Spring緩存方法的返回結果時對應的key的。該屬性支持SpringEL表達式。當我們沒有指定該屬性時,Spring將使用預設策略生成key。condition屬性可以設置是否使用緩存:condition屬性預設為空,表示將緩存所有的調用情形。其值是通過SpringEL表達式來指定的,當為true時表示進行緩存處理;當為false時表示不進行緩存處理,即每次調用該方法時該方法都會執行一次。在@CacheEvict註解中,有兩個新的參數,allEntries和beforeInvocation。其中allEntries是boolean類型,表示是否需要清除緩存中的所有元素。預設為false,表示不需要。當指定了allEntries為true時,Spring Cache將忽略指定的key。beforeInvocation可以設置緩存清除的觸發時機,清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為拋出異常而未能成功返回時也不會觸發清除操作。當我們指定該屬性值為true時,Spring會在調用該方法之前清除緩存中的指定元素。

  7. 註意事項:註解需要使用在public方法上。帶有@Cache* 註解的方法不能被定義在調用該方法的類里,例如controller調用方法A,方法A使用註解,則A不能定義在該controller中。

  8. 此處不再記錄詳細的介面實現等。關於redis更多的學習及使用方法,將在以後持續記錄。

 


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

-Advertisement-
Play Games
更多相關文章
  • webService入門 Web service是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程式,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發佈、發現、協調和配置這些應用程式,用於開發分散式的互操作的應用程式。[1] Webservice跨平臺跨語言; Java... ...
  • WebService介紹 首先我們來談一下為什麼需要學習webService這樣的一個技術吧.... 問題一 如果我們的網站需要提供一個 天氣預報 這樣一個需求的話,那我們該怎麼做????? 天氣預報這麼一個功能並不是簡單的JS組件就能夠實現的,它的數據是依賴資料庫分析出來的,甚至需要衛星探測..我 ...
  • c/s是客戶機/伺服器,b/s是瀏覽器/伺服器。 ipv4 192.168.....(內網ip) 通過路由器的NAT(維護了一張表,用來轉換ip對應外網)。 當ipv6推廣開,就不用使用路由器了。 通信原理: 寫ip地址訪問太麻煩,於是有了功能變數名稱,它會先訪問本地的hosts,沒有則去網路訪問DNS服務 ...
  • 一 、 前言 Django 提供了admin 組件 為項目提供基本的管理後臺功能(對數據表的增刪改查)。 本篇文章通過 admin源碼 簡單分析admin 內部原理 ,擴展使用方式,為以後進行定製和自己開發組件做鋪墊。 二、 簡單使用 1.在app 目錄下的admin.py 中通過註冊表 2. 創建 ...
  • 相信和小編一樣的程式猿們在日常工作或面試當中經常會遇到JVM的垃圾回收問題,有沒有在夜深人靜的時候詳細捋一捋JVM垃圾回收機制中的知識點呢?沒時間捋也沒關係,因為小編接下來會給你捋一捋。 ...
  • Digital RootsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 74529 Accepted Submission(s): 23232 ...
  • 本文簡單介紹了WebService服務技術,提供了在Apache CXF 框架JAX-RS模塊下WebService開發的簡單示例。 ...
  • 迭代 基本含義 迭代是重覆反饋過程的活動,其目的通常是為了接近併到達所需的目標或結果。每一次對過程的重覆被稱為一次“迭代”,而每一次迭代得到的結果會被用來作為下一次迭代的初始值。 在計算科學中,迭代是程式中對一組指令(或一定步驟)的重覆。它既可以被用作通用的術語(與“重覆”同義),也可以用來描述一種 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...