亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

windows環境下Redis+Spring緩存實例講解

2020-03-17 12:41:02
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了windows環境下Redis+Spring緩存實例教程,感興趣的小伙伴們可以參考一下
 

一、Redis了解

1.1、Redis介紹:

redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。

Redis數據庫完全在內存中,使用磁盤僅用于持久性。相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。Redis可以將數據復制到任意數量的從服務器。

1.2、Redis優點:

(1)異常快速:Redis的速度非??欤棵肽軋绦屑s11萬集合,每秒約81000+條記錄。

(2)支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。

(3)操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新后的值。

(4)多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發布/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。

1.3、Redis缺點:

(1)單線程

(2)耗內存

二、64位windows下Redis安裝

Redis官方是不支持windows的,但是Microsoft Open Tech group 在 GitHub上開發了一個Win64的版本,下載地址:https://github.com/MSOpenTech/redis/releases。注意只支持64位哈。

小寶鴿是下載了Redis-x64-3.0.500.msi進行安裝。安裝過程中全部采取默認即可。

安裝完成之后可能已經幫你開啟了Redis對應的服務,博主的就是如此。查看資源管理如下,說明已經開啟:

windows,Redis,Spring

已經開啟了對應服務的,我們讓它保持,下面例子需要用到。如果沒有開啟的,我們命令開啟,進入Redis的安裝目錄(博主的是C:/Program Files/Redis),然后如下命令開啟:

redis-server  redis.windows.conf

windows,Redis,Spring

OK,下面我們進行實例。

三、詳細實例

本工程采用的環境:Eclipse + maven + spring + junit

3.1、添加相關依賴(spring+junit+redis依賴),pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.luo</groupId> <artifactId>redis_project</artifactId> <version>0.0.1-SNAPSHOT</version>  <properties>  <!-- spring版本號 -->  <spring.version>3.2.8.RELEASE</spring.version>  <!-- junit版本號 -->  <junit.version>4.10</junit.version> </properties>  <dependencies>  <!-- 添加Spring依賴 -->  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-core</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-webmvc</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-context</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-context-support</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-aop</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-aspects</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-tx</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-jdbc</artifactId>   <version>${spring.version}</version>  </dependency>  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-web</artifactId>   <version>${spring.version}</version>  </dependency>   <!--單元測試依賴 -->  <dependency>   <groupId>junit</groupId>   <artifactId>junit</artifactId>   <version>${junit.version}</version>   <scope>test</scope>  </dependency>   <!--spring單元測試依賴 -->  <dependency>   <groupId>org.springframework</groupId>   <artifactId>spring-test</artifactId>   <version>${spring.version}</version>   <scope>test</scope>  </dependency>   <!-- Redis 相關依賴 -->  <dependency>   <groupId>org.springframework.data</groupId>   <artifactId>spring-data-redis</artifactId>   <version>1.6.1.RELEASE</version>  </dependency>  <dependency>   <groupId>redis.clients</groupId>   <artifactId>jedis</artifactId>   <version>2.7.3</version>  </dependency>  </dependencies></project>

3.2、spring配置文件application.xml:

<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="  http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-3.0.xsd">  <!-- 自動掃描注解的bean --> <context:component-scan base-package="com.luo.service" />  <!-- 引入properties配置文件 -->  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  <property name="locations">   <list>    <value>classpath:properties/*.properties</value>    <!--要是有多個配置文件,只需在這里繼續添加即可 -->   </list>  </property> </bean>  <!-- jedis 配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >   <property name="maxIdle" value="${redis.maxIdle}" />   <property name="maxWaitMillis" value="${redis.maxWait}" />   <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean >  <!-- redis服務器中心 --> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >   <property name="poolConfig" ref="poolConfig" />   <property name="port" value="${redis.port}" />   <property name="hostName" value="${redis.host}" />   <!-- <property name="password" value="${redis.password}" /> -->   <property name="timeout" value="${redis.timeout}" ></property> </bean > <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >   <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 >  <!-- cache配置 --> <bean id="methodCacheInterceptor" class="com.luo.redis.cache.MethodCacheInterceptor" >   <property name="redisTemplate" ref="redisTemplate" /> </bean >  <!-- aop配置切點跟通知 --> <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  <property name="advice" ref="methodCacheInterceptor"/>  <property name="pattern" value=".*ServiceImpl.*getTimestamp"/> </bean> <bean id="redisTestService" class="com.luo.service.impl.RedisTestServiceImpl"> </bean> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> </beans>

3.3、Redis配置參數,redis.properties:

#redis中心#綁定的主機地址redis.host=127.0.0.1#指定Redis監聽端口,默認端口為6379redis.port=6379#授權密碼(本例子沒有使用)redis.password=123456 #最大空閑數:空閑鏈接數大于maxIdle時,將進行回收redis.maxIdle=100 #最大連接數:能夠同時建立的“最大鏈接個數”redis.maxActive=300 #最大等待時間:單位msredis.maxWait=1000 #使用連接時,檢測連接是否成功 redis.testOnBorrow=true#當客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能redis.timeout=10000

3.4、添加接口及對應實現RedisTestService.Java和RedisTestServiceImpl.java:

package com.luo.service; public interface RedisTestService { public String getTimestamp(String param);}
package com.luo.service.impl; import org.springframework.stereotype.Service;import com.luo.service.RedisTestService; @Servicepublic class RedisTestServiceImpl implements RedisTestService {  public String getTimestamp(String param) {  Long timestamp = System.currentTimeMillis();  return timestamp.toString(); } }


3.5、本例采用spring aop切面方式進行緩存,配置已在上面spring配置文件中,對應實現為MethodCacheInterceptor.java:

package com.luo.redis.cache; import java.io.Serializable;import java.util.concurrent.TimeUnit;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations; public class MethodCacheInterceptor implements MethodInterceptor {  private RedisTemplate<Serializable, Object> redisTemplate; private Long defaultCacheExpireTime = 10l; // 緩存默認的過期時間,這里設置了10秒  public Object invoke(MethodInvocation invocation) throws Throwable {  Object value = null;   String targetName = invocation.getThis().getClass().getName();  String methodName = invocation.getMethod().getName();   Object[] arguments = invocation.getArguments();  String key = getCacheKey(targetName, methodName, arguments);   try {   // 判斷是否有緩存   if (exists(key)) {    return getCache(key);   }   // 寫入緩存   value = invocation.proceed();   if (value != null) {    final String tkey = key;    final Object tvalue = value;    new Thread(new Runnable() {     public void run() {      setCache(tkey, tvalue, defaultCacheExpireTime);     }    }).start();   }  } catch (Exception e) {   e.printStackTrace();   if (value == null) {    return invocation.proceed();   }  }  return value; }  /**  * 創建緩存key  *  * @param targetName  * @param methodName  * @param arguments  */ private String getCacheKey(String targetName, String methodName,   Object[] arguments) {  StringBuffer sbu = new StringBuffer();  sbu.append(targetName).append("_").append(methodName);  if ((arguments != null) && (arguments.length != 0)) {   for (int i = 0; i < arguments.length; i++) {    sbu.append("_").append(arguments[i]);   }  }  return sbu.toString(); }  /**  * 判斷緩存中是否有對應的value  *   * @param key  * @return  */ public boolean exists(final String key) {  return redisTemplate.hasKey(key); }  /**  * 讀取緩存  *   * @param key  * @return  */ public Object getCache(final String key) {  Object result = null;  ValueOperations<Serializable, Object> operations = redisTemplate    .opsForValue();  result = operations.get(key);  return result; }  /**  * 寫入緩存  *   * @param key  * @param value  * @return  */ public boolean setCache(final String key, Object value, Long expireTime) {  boolean result = false;  try {   ValueOperations<Serializable, Object> operations = redisTemplate     .opsForValue();   operations.set(key, value);   redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);   result = true;  } catch (Exception e) {   e.printStackTrace();  }  return result; }  public void setRedisTemplate(   RedisTemplate<Serializable, Object> redisTemplate) {  this.redisTemplate = redisTemplate; }}


3.6、單元測試相關類:

package com.luo.baseTest; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  //指定bean注入的配置文件 @ContextConfiguration(locations = { "classpath:application.xml" }) //使用標準的JUnit @RunWith注釋來告訴JUnit使用Spring TestRunner @RunWith(SpringJUnit4ClassRunner.class) public class SpringTestCase extends AbstractJUnit4SpringContextTests { }
package com.luo.service; import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired; import com.luo.baseTest.SpringTestCase; public class RedisTestServiceTest extends SpringTestCase {  @Autowired  private RedisTestService redisTestService;  @Test  public void getTimestampTest() throws InterruptedException{   System.out.println("第一次調用:" + redisTestService.getTimestamp("param"));  Thread.sleep(2000);  System.out.println("2秒之后調用:" + redisTestService.getTimestamp("param"));  Thread.sleep(11000);  System.out.println("再過11秒之后調用:" + redisTestService.getTimestamp("param")); } }

3.7、運行結果:

windows,Redis,Spring

四、源碼下載

以上就是本文的全部內容,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到Redis頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
96sao精品视频在线观看| 亚洲人成电影网站色www| 国产极品jizzhd欧美| 国模精品视频一区二区| 国产亚洲欧洲高清| 国内成人精品一区| 欧美成人免费在线观看| 国产精品成久久久久三级| 国产精品99蜜臀久久不卡二区| 国产欧美一区二区| 一区二区三区日韩在线| 91在线观看免费高清完整版在线观看| 国产精品美女视频网站| 国产精品爱啪在线线免费观看| 亚洲欧美999| 亚洲美女黄色片| 久久久久久久影院| 97涩涩爰在线观看亚洲| 色综合视频网站| 91精品久久久久久久久久另类| 欧美精品免费在线| 视频在线观看一区二区| 91九色精品视频| 欧美视频在线观看 亚洲欧| 亚洲精品av在线| 日韩欧美精品网址| 久久久伊人日本| 久久夜色精品国产欧美乱| 一本色道久久综合狠狠躁篇怎么玩| 成人福利视频在线观看| 亚洲国产欧美一区二区三区久久| 91系列在线观看| 国产亚洲激情视频在线| 欧美激情图片区| 欧美极品少妇全裸体| 亚洲欧美日韩国产中文专区| 日本成人在线视频网址| 国产成人精品最新| 欧亚精品中文字幕| 欧美日韩亚洲精品一区二区三区| 精品亚洲一区二区三区在线播放| 精品爽片免费看久久| 亚洲高清色综合| 国产精品久久久久久搜索| 狠狠躁夜夜躁人人躁婷婷91| 国产精品视频色| 国产精品成人观看视频国产奇米| 91久久国产综合久久91精品网站| 精品久久久久久中文字幕一区奶水| 日韩一二三在线视频播| 日韩欧美精品网址| 96sao精品视频在线观看| 精品久久国产精品| 亚洲综合最新在线| 在线观看91久久久久久| 国产91精品久久久久久| 精品国产欧美成人夜夜嗨| 日韩专区中文字幕| 国产在线观看91精品一区| 国产91精品高潮白浆喷水| 亚洲成人黄色在线观看| 亚洲激情视频网| 亚洲国产欧美一区二区丝袜黑人| 亚洲欧洲在线观看| 国产日韩欧美在线看| 国产精品草莓在线免费观看| 国产精品久久久亚洲| 亚洲欧美日韩在线一区| 精品久久久久人成| 欧美日韩激情视频8区| 亚洲va欧美va国产综合久久| 国模精品视频一区二区| 日韩成人在线视频观看| 久久国产精品99国产精| 国产精品久久av| 国产精品欧美风情| 欧美成人高清视频| 亚洲成人久久久久| 国产精品久久久久久久天堂| 国产精品福利网站| 成人精品一区二区三区电影免费| 色老头一区二区三区在线观看| 色综合导航网站| 久久影视电视剧免费网站清宫辞电视| 综合网中文字幕| 国产精品久久久久久av福利| 国产成一区二区| 国产成人jvid在线播放| 日韩在线视频网| 国产精品美女久久久久久免费| 日韩电影在线观看永久视频免费网站| 日韩va亚洲va欧洲va国产| 亚洲精品成人免费| 亚洲性视频网站| 国产极品jizzhd欧美| 国产精品爽爽爽爽爽爽在线观看| 亚洲大胆美女视频| 91伊人影院在线播放| 亚洲欧洲日本专区| 97久久精品人搡人人玩| 在线观看国产精品淫| 俺去亚洲欧洲欧美日韩| 久久亚洲精品小早川怜子66| 日本精品一区二区三区在线| 欧美大片va欧美在线播放| 久久久久久中文| 成人午夜在线视频一区| 亚洲福利小视频| 国产精品成人一区二区| 亚洲热线99精品视频| 亚洲wwwav| 久久久久久久久久久成人| 亚洲性xxxx| 欧美亚洲国产精品| 久久久亚洲成人| 久久久av一区| 国产精品第2页| 激情亚洲一区二区三区四区| 久久久精品一区二区| 最新91在线视频| 在线视频免费一区二区| 国产成人精品视| 精品国产福利视频| 97色在线观看免费视频| 成人羞羞国产免费| 精品一区二区三区四区| 亚洲一区二区三区在线免费观看| 欧美高跟鞋交xxxxhd| 欧美亚洲国产成人精品| 欧美性猛交xxxx黑人猛交| 色偷偷噜噜噜亚洲男人的天堂| 亚洲国产精品免费| 在线观看日韩视频| 久久久久国产精品免费| 亚洲欧美综合另类中字| 日韩av手机在线| 成人激情免费在线| 亚洲成人av中文字幕| 综合欧美国产视频二区| 国产精品第10页| 亚洲高清在线观看| 日韩av成人在线| 欧美大片在线看| 91免费精品视频| 亚洲国产精品中文| 热久久免费国产视频| 欧美成人性色生活仑片| 在线播放日韩精品| 97高清免费视频| 国产精品专区h在线观看| 亚洲少妇中文在线| 久久久午夜视频| 91干在线观看| 日本成人免费在线| 欧美激情视频网站| 国产精品久久久久久中文字| 欧美电影免费观看高清| 精品日韩视频在线观看| 大伊人狠狠躁夜夜躁av一区| 国产综合福利在线| 欧美小视频在线观看| 欧美日韩成人在线播放| 91精品国产91久久久久久不卡| 欧美精品成人91久久久久久久|