1. 程式人生 > >redis與spring的完全整合

redis與spring的完全整合

下載spring-data-redis,gav如下:

                  <dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.0.1.RELEASE</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-log4j12</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>jcl-over-slf4j</artifactId>
				</exclusion>
			</exclusions>

		</dependency>


其中exclusion了兩個包,原因是與專案裡其它包衝突。

bean配置如下,可在web.xml裡配置載入bean檔案:

	<bean id="redisCacheManager" class="com.cr.common.cache.base.RedisCacheManger">
		<property name="pool" ref="shardedJedisPool"/>
	</bean>
	<!-- jedis 連線池配置-->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  
		<property name="maxActive"     value="${redis.pool.maxActive}" />  
		<property name="maxIdle"       value="${redis.pool.maxIdle}" />  
		<property name="maxWait"       value="${redis.pool.maxWait}" />  
		<property name="testOnBorrow"  value="${redis.pool.testOnBorrow}" />  
	</bean>  
	<!-- jedis 多個伺服器配置-->
	<bean id="jedisShardInfo1" class="redis.clients.jedis.JedisShardInfo">  
		<constructor-arg index="0" value="${redis2.ip}" />  
		<constructor-arg index="1" value="${redis.port}" type="int" />  
	</bean>	
	
	<bean id="jedisShardInfo2" class="redis.clients.jedis.JedisShardInfo">  
		<constructor-arg index="0" value="${redis.ip}" />  
		<constructor-arg index="1" value="${redis.port}" type="int" />  
	</bean>	
	
	<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">  
		<constructor-arg index="0" ref="jedisPoolConfig" />  
		<constructor-arg index="1">
			<list>
				<ref bean="jedisShardInfo1" />
				<ref bean="jedisShardInfo2"/>
			</list>
		</constructor-arg>  
	</bean>
	
	<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
		>
		<property name="hostName"   value="${redis.ip}" />  
		<property name="port"       value="${redis.port}" />  
		<property name="poolConfig" ref="jedisPoolConfig" /> 
	
		<!--<property name="shardInfo"  ref="shardedJedisPool"></property>-->
	</bean> 
     
	<context:property-placeholder  location="/WEB-INF/spring/SystemContext.properties"/> 
	<context:component-scan base-package="org.springframework.data.redis.samples"/>
        

屬性檔案內容如下:

redis.ip=192.168.1.110
redis2.ip=192.168.1.112
#Port   
redis.port=6379

#最大分配的物件數 
redis.pool.maxActive=1024
#最大能夠保持idel狀態的物件數
redis.pool.maxIdle=200
#當池內沒有返回物件時,最大等待時間
redis.pool.maxWait=1000
#當呼叫borrow Object方法時,是否進行有效性檢查 
redis.pool.testOnBorrow=true
#當呼叫return Object方法時,是否進行有效性檢查   
redis.pool.testOnReturn=true


快取管理介面:

public interface RedisCache {
	
	public <T> T getRedisCacheInfo(String key);

	public <T> boolean setRedisCacheInfo(String key, T value);
	
}


快取管理實現:

public class RedisCacheManger implements RedisCache {
	
	private ShardedJedisPool pool ;
	
	private Logger log = Logger.getLogger(RedisCacheManger.class); 
	public ShardedJedisPool getPool() {
		return pool;
	}

	public void setPool(ShardedJedisPool pool) {
		this.pool = pool;
	}

	public <T> T getRedisCacheInfo(String key) {
		
		try {
			log.info("get from redisCache :"+key);
			System.out.println("get from rediscache");
			ShardedJedis jedis = pool.getResource();
			pool.returnResource(jedis);
			return (T)jedis.get(key);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
 

	public <T> boolean setRedisCacheInfo(String key, T value) {

		try {
			log.info("add to redisCache :"+key);
			System.out.println("add to rediscache");
			ShardedJedis jedis = pool.getResource();
			jedis.set(key, (String)value);
			pool.returnResource(jedis);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	public static void main(String[] args) {
		new RedisCacheManger().setRedisCacheInfo("12345", "asdfg");
	}
}


快取切面註解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedRedisCached {}


快取切面處理類:

@Aspect
public class RedisCacheAspect implements Ordered {
	
	private static Logger log = Logger.getLogger(RedisCacheAspect.class); 
	private RedisCache redisCacheManager;
	private int orderValue = 3;
	public RedisCache getRedisCacheManager() {
		return redisCacheManager;
	}

	public void setRedisCacheManager(RedisCache redisCacheManager) {
		this.redisCacheManager = redisCacheManager;
	}

	@Pointcut("@annotation(com.jd.bi.odp.common.cache.core.NeedRedisCached)")
	public void needRedisCached() {

	}
	
	@Around("needRedisCached() && args(filter,..)")
	public Object aroundInvoke(ProceedingJoinPoint pjp, QueryFilter filter) throws Throwable {
		log.info("enter aroundInvoke!!!");
		if (filter.getValue() == null) {
			return null;
		}

		boolean cacheEnabled = CommonUtil.parseBoolean(HBaseConfig.getProperty("redisCache.enabled"), false);

		if (cacheEnabled) {
			
			String md5key = MD5Util.getMD5(filter.getValue().toString());
			Object value = redisCacheManager.getRedisCacheInfo(md5key);
			boolean flag = false;
			if (null != value) {

				JSONObject json = new JSONObject(value.toString());
				return json;
			} else if ("null".equals(value)) {
				return null;
			} else { //執行hbase查詢
				value = pjp.proceed();
				if(null!=value){//此處根據業務邏輯判斷不快取的條件
					}
					else{
						flag = redisCacheManager.setRedisCacheInfo(md5key, value.toString());
						
						if(flag)
							log.info("add a cache success by key: "+md5key);
						else
							log.warn("add a cache failure by key: "+md5key);
					}
				}
				return value;
			}
		} else {// 執行hbase查詢
			return pjp.proceed();
		}
	}
	@Override
	public int getOrder() {
		return orderValue;
	}
	public int getOrderValue() {
		return orderValue;
	}

	public void setOrderValue(int orderValue) {
		this.orderValue = orderValue;
	}
}


快取存在直接返回,不存在的話執行資料來源查詢,此處是hbase查詢,並設定快取。

切面配置:

	<!-- redis快取執行切面 -->
	<bean id="RedisCacheAspect"
		class="com.cr.common.cache.core.RedisCacheAspect">
		<property name="orderValue" value="3" />
		<property name="redisCacheManager" ref="redisCacheManager"/>
	</bean>
	<!-- 切面申明配置-->
	<aop:aspectj-autoproxy>
		<aop:include name="RedisCacheAspect" />
	</aop:aspectj-autoproxy>
	


此時,前端web頁面使用者的訪問觸發的action如果滿足條件,則會進入切面方法處理,完成redis快取的使用。

相關推薦

redisspring完全整合

下載spring-data-redis,gav如下: <dependency> <groupId>org.springframework.data</groupId> <artifa

redisspring整合·

odi pro classpath sch isp stack exception tst 阻塞 配置spring配置文件applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <bea

四:redis主從讀寫分離,哨兵模式spring整合

本篇主要介紹redis實現主從讀寫分離,採用哨兵模式後如何與spring整合在專案中進行開發 主要依賴的jar包,其他專案中實際依賴的jar包很多這裡就不一一列舉了: jar包依賴 <dependency> <grou

Redis叢集spring整合

上一篇詳細的贅述了Redis的curd操作及叢集的搭建。下面我們開始將他整合到我們實際的專案中去。我的專案採用的是標準的ssm框架,ssm框架這裡不說,直接開始整合。 首先在maven管理中將我們的jar包引入 <!--1.7.2 開始支援Re

redis spring整合 hash 增刪改操作 list增刪改操作

對於以前redis的學習是非常痛苦的!近期將以前的東西撿起來。以部落格的形式儲存,以便於以後快速撿起來,並和廣大同胞一起分享! 1):簡單介紹 redis 是基於C語言開發。 redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相

Redis的叢集搭建Redisspring整合

叢集: 高可用,滿足高併發, 把資料分佈在不同的節點上,提高單個節點的效能 1.redis叢集 架構細節: (1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸

redisspring整合--不使用spring-data-redis

個人感覺如果使用spring-data-redis只作為快取的話有點累贅,所以有了以下方式 之前在網上搜索了一些資料,但是其中的配置總是報錯,原因是JedisShardInfo類缺少相應的構造方法...... 1.redis.xml配置 spring的配置檔案 <?

MyBatisSpring整合

mybatis 目錄 user 準備工作 事務管理 項目 pac 映射文件 pla 1.Spring整合MyBatis的準備工作 在項目中加入Spring、MyBatis及整合相關的JAR文件 建立開發目錄結構,創建實體類 創建數據訪問接口(UserMapper) 配置S

WebService--CXFSpring整合(jaxws:endpoint形式配置)

tid archetype 全路徑 systems hide onf -o hot conf 一、CXF與Spring整合(jaxws:endpoint形式配置) 工具要點:idea、maven 1.新建一個maven項目 <?xml version="1.0"

Elastic-Job原始碼解析(一)之Spring完美整合

看過小編寫SpringFramework原始碼解析的同學應該對Spring支援自定義標籤還有點印象吧,沒有的話我們回顧下,然後看看Elastic-Job是如何巧妙的利用自定義標籤生成Job任務的吧。請注意這裡用了一個巧妙關鍵字。我們看它如何巧妙的吧。 Spring自定義

Spring data redisspring 系統整合

第一步: 新增依賴(以maven為例) <!--     redis相關jar包依賴    -->          <dependency> &

FastDFSspring boot整合

在專案Pom當中加入依賴 Maven依賴為 com.github.tobato fastdfs-client 1.26.3 將Fdfs配置引入專案 將FastDFS-Client客戶端引入本地化專案的方式非常簡單,在SpringBoot專案/src/[com.xxx.

activemq 學習系列(五) activemq spring boot 整合

-a pool autowire mapping pri control ESS fin tid activemq 與 spring boot 整合 1、添加依賴 <dependency> <groupId>

JavaEE MyBatisSpring整合——基於mapper介面方式開發(教材學習筆記)

在MyBatis與Spring的整合開發中雖然可以通過傳統的DAO開發方式,但是採用DAO方式會產生大量的重複程式碼,因此學習另外一種程式設計方式就很重要了,即Mapper介面程式設計(本章程式碼是基於上一篇部落格的點這裡) 一、基於MapperFactoryBean的整合 Mapper

Spring Boot開發系列(Redis)(三)--Spring boot 整合redis完成簡單的get,set操作

Spring Boot開發系列(Redis)(三)–Spring boot 整合redis完成簡單的get,set操作 【1】匯入reids相關依賴 <dependency> <groupId>redis.clients</g

javaEE Freemarker模板引擎,FreemarkerSpring整合,生成靜態頁面

applicationContext.xml(Spring配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sche

springBoot redis -- spring-boot-starter-data-redisspring-boot-starter-redis兩個包的區別

1、下面是Spring Boot的版本為1.5.9的時候的spring-boot-starter-data-redis的jar包的情況: 2、下面是Spring Boot的版本為1.4.0的時候的spring-boot-starter-data-redis的jar包的情

Thymeleaf Or Freemarker Spring boot 整合

整體步驟:(1)            在pom.xml中引入thymeleaf;(2)            如何關閉thymeleaf快取(3)            編寫模板檔案.htmlSpring Boot預設就是使用thymeleaf模板引擎的,所以只需要在pom.xml加入依賴即可:<de

ActiveMQSpring進行整合

                                ActiveMQ與Spring進行整合   Activ

morphiaspring整合

簡單的來說Morphia與MongoDB的關係就如Hibernate與關係資料庫的關係, 是一個實現Java物件到MongoDB雙向對映的類庫。 首先我們需要一個生成和配置mongodb的工廠類: [java] view plain copy print? p