redis與spring的完全整合

來源:互聯網
上載者:User

轉自:http://www.cfanz.cn/?c=article&a=read&id=32677

參考  http://www.open-open.com/lib/view/open1351324403395.html  

http://www.open-open.com/lib/list/354   Spring
Data Redis實現一個訂閱/發布系統

http://www.blogjava.net/stevenjohn/archive/2012/11/14/391344.html spring
redis整合(一)

下載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緩衝的使用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.