spring+redis整合

yingxian_Fei發表於2017-05-01

本文實現spring+redis快取伺服器的整合。


1、windows下redis安裝

(1)、下載

由於本文出於測試目的,因此使用windows的redis版本。從https://github.com/ServiceStack/redis-windows下載redis,下載後解壓,找到解壓資料夾中的downloads中的redis-latest.zip壓縮包,該壓縮包就是當前支援的最新的windiws版本(這裡需要注意了,好似只是支援64位的系統,而且需要使用Administrator的管理員使用者名稱登陸才能執行),解壓該壓縮包得到redis的資原始檔。

(2)、建立啟動指令碼

建立一個bat指令碼,本文中衛startup.bat指令碼,然後在其中輸入如下啟動redis伺服器的命令:

redis-server.exe  redis.windows.conf

(3)、啟動redis伺服器

雙擊啟動指令碼即可啟動伺服器。啟動後如下:

關閉該命令列視窗即可關閉redis伺服器。

(4)、測試

雙擊執行解壓目錄下的redis-cli.exe程式,正常執行後會彈出客戶端測試框,輸入如下命令進行簡單測試

set hello 123
get hello
如圖

(5)、配置redis密碼

先關閉redis伺服器,然後編輯redis.windows.conf檔案,搜尋requirepass配置,去掉前面的註釋符號(#)。儲存並關閉,此時redis的預設密碼就是requirepass後面的值,本文為foobared。

(6)、使用密碼登陸測試

首先執行指令碼啟動redis伺服器,然後在redis-cli.exe所在目錄下安裝shift鍵,點選滑鼠郵件選擇"在此處開啟命令視窗"。輸入如下命令登陸redis伺服器進行測試:

redis-cli.exe -h 127.0.0.1 -p 6379 -a foobared
登陸成功後按照之前的測試步驟進行redis測試即可。

2、linux下的redis安裝和配置

linux下的redis安裝和配置可以參考如下部落格:http://blog.csdn.net/smilefyx/article/details/73822851

3、spring+redis整合測試

(1)、依賴匯入

建立一個maven工程,匯入必要的spring和其他相關依賴jar包,然後匯入如下redis相關的jar包:

		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.6.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.7.3</version>
		</dependency>

(2)、建立java配置類

本文使用的是基於java的配置類,配置類中主要是配置redis的連線工廠,redis的模板操作類、cacheManager和一個簡單的測試bean。程式碼如下:

package cn.hi_fei.redis.configuration;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
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;

import cn.hi_fei.redis.impl.CacheServiceImpl;

@Configuration
@EnableCaching 
public class RedisCacheConfig extends CachingConfigurerSupport{
    @Bean  
    public RedisConnectionFactory redisConnectionFactory() {  
        JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();    
        // Defaults  
        redisConnectionFactory.setHostName("127.0.0.1");  
        redisConnectionFactory.setPort(6379);  
        return redisConnectionFactory;  
    }  
  
    @Bean  
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {  
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();  
        redisTemplate.setConnectionFactory(cf);  
        return redisTemplate;  
    }  
  
    @Bean  
    public CacheManager cacheManager(RedisTemplate<String, String> redisTemplate) {  
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);   
        // Number of seconds before expiration. Defaults to unlimited (0)  
        cacheManager.setDefaultExpiration(3000); // Sets the default expire time (in seconds)  
        return cacheManager;  
    }  
    
    @Bean("CacheServiceImpl")
    public CacheServiceImpl getCacheServiceImpl() {
    	return new CacheServiceImpl();
    }
}

(3)、測試程式碼

首先建立一個用於載入配置的基類,該類用於載入配置。原始碼如下

package cn.hi_fei.redis;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.hi_fei.redis.configuration.RedisCacheConfig;

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(classes = {RedisCacheConfig.class})   
public class BaseTest {

}

第二步建立一個使用spring快取相關注解的測試服務類,用於在測試用例中自動注入用來測試spring的註解。程式碼如下:

package cn.hi_fei.redis.impl;

import org.apache.log4j.Logger;
import org.springframework.cache.annotation.Cacheable;

public class CacheServiceImpl {
	Logger logger = Logger.getLogger(CacheServiceImpl.class);

	@Cacheable(value="test",key="#key")
	public String hello(String key) {
		logger.info("Get without cache.");
		return "Hello!";
	}
}

第三部建立繼承於第一步的基類的實體測試類,用於測試redis和spring的配合使用。本例中使用兩種方式用於測試redis。第一種是基於spring註解的實現,第二種是基於spring都redis操作的模板類實現。原始碼如下:

package cn.hi_fei.redis.impl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;

import cn.hi_fei.redis.BaseTest;

public class CacheTest extends BaseTest{
	
	Logger logger = Logger.getLogger(CacheTest.class);
	
	@Autowired
	private RedisTemplate<String, String> redis;
	
	@Autowired
	@Qualifier("CacheServiceImpl")
	private CacheServiceImpl mService;
	
	@Test
	public void test() {
		//1
		logger.info("1="+this.mService.hello("hello3"));				
        logger.info("2="+this.mService.hello("hello3"));
        try {
    		logger.info("Wait input to exit.");
            InputStreamReader is_reader = new InputStreamReader(System.in);          	
			new BufferedReader(is_reader).readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
        //2
		logger.info("1="+this.hello("hello4"));				
        logger.info("2="+this.hello("hello4"));
        try {
    		logger.info("Wait input to exit.");
            InputStreamReader is_reader = new InputStreamReader(System.in);          	
			new BufferedReader(is_reader).readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	        
	}
	
	public String hello(String key) {
		String v = redis.opsForValue().get(key);
		if(null != v) {
			logger.info("Get from cache.");
			return v;
		}
		logger.info("Get without cache.");
		redis.opsForValue().set(key, "Hello!");
		return "Hello!";
	}	

}

執行後的測試結果如下:

(4)、程式碼下載

本例的原始碼工程可以從如下地址進行下載

http://download.csdn.net/detail/yxtouch/9830337

相關文章