Spring集成Redis的兩種方式Jedis和RedisTemplate


Redis一種非關系型(K-V)數據庫,也習慣稱為Redis緩存,類似memcached,但相對與memcached又有着以下優點
1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
2 Redis支持數據的備份,即master-slave模式的數據備份。
3 Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。

Spring框架基本上不用過多介紹,我相信點開本文的朋友基本上都很熟悉或者用過Spring框架了,在  java web開發方向,spring家族的地位應該一直處於最高的,本文要分享的是,通過Spring集成操作Redis數據庫,大家會說這樣的內容網上一大堆了,別着急,我們今天先分享兩種方式,回頭我們再進行對比一下。

第一種方式:Jedis
集成步驟:
1. 添加jar包或者引入依賴
 
            
<dependency>  
            <groupid>org.springframework.data</groupid>  
            <artifactid>spring-data-redis</artifactid>  
            <version>1.7.2.RELEASE</version>  
        </dependency>  
        <dependency>  
            <groupid>redis.clients</groupid>  
            <artifactid>jedis</artifactid>  
            <version>2.8.1</version>  
        </dependency> 
2. 添加redis配置文件(非必須,可以在spring配置文件中直接配置)
#訪問地址 

redis.host=127.0.0.1 

#訪問端口 

redis.port=6379 

#注意,如果沒有password,此處不設置值,但這一項要保留 

redis.password= 

 

#最大空閑數,數據庫連接的最大空閑時間。超過空閑時間,數據庫連接將被標記為不可用,然后被釋放。設為0表示無限制。 

redis.maxIdle=300 

#連接池的最大數據庫連接數。設為0表示無限制 

redis.maxActive=600 

#最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示無限制。 

redis.maxWait=1000 

#在borrow一個jedis實例時,是否提前進行alidate操作;如果為true,則得到的jedis實例均是可用的; 

redis.testOnBorrow=true  



3. 在applicationContext.xml添加redis的bean

  <!-- scanner redis properties  -->  

    <context:property-placeholder ignore-unresolvable="true" location="classpath:redis.properties">  
  
    <!--(1)如果你有多個數據源需要通過<context:property-placeholder管理,且不願意放在一個配置文件里,那么一定要加上ignore-unresolvable=“true"-->  
    <!--(2)注意新版的(具體從哪個版本開始不清楚,有興趣可以查一下)JedisPoolConfig的property name,不是maxActive而是maxTotal,而且沒有maxWait屬性,建議看一下Jedis源碼。-->  
    <!-- redis連接池 -->  
    <bean class="redis.clients.jedis.JedisPoolConfig" id="jedisConfig">  
        <property name="maxTotal" value="${redis.maxActive}"></property>  
        <property name="maxIdle" value="${redis.maxIdle}"></property>  
        <property name="maxWaitMillis" value="${redis.maxWait}"></property>  
        <property name="testOnBorrow" value="${redis.testOnBorrow}"></property>  
    </bean>  
    <!-- redis連接工廠 -->  
    <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" id="connectionFactory">  
        <property name="hostName" value="${redis.host}"></property>  
        <property name="port" value="${redis.port}"></property>  
        <property name="password" value="${redis.password}"></property>  
        <property name="poolConfig" ref="jedisConfig"></property>  
    </bean>  
    <!-- redis操作模板,這里采用盡量面向對象的模板 -->  
    <bean class="org.springframework.data.redis.core.StringRedisTemplate" id="redisTemplate">  
        <property name="connectionFactory" ref="connectionFactory">  
        <!--     如果不配置Serializer,那么存儲的時候只能使用String,如果用對象類型存儲,那么會提示錯誤 can't cast to String!!!-->  
        <property name="keySerializer">  
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer">  
        </bean></property>  
        <property name="valueSerializer">  
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer">  
        </bean></property>  
        <!--開啟事務-->  
        <property name="enableTransactionSupport" value="true">  
    </property></property></bean>  
</context:property-placeholder>
4. 測試
   @Autowired

    private ShardedJedisPool shardedJedisPool;//注入ShardedJedisPool

    @RequestMapping(value = “/demo_set”,method = RequestMethod.GET)

    @ResponseBody

    public String demo_set(){

        //獲取ShardedJedis對象

        ShardedJedis shardJedis = shardedJedisPool.getResource();

        //存入鍵值對

        shardJedis.set(“key1”,“hello jedis”);

        //回收ShardedJedis實例

        shardJedis.close();

        return “set”;

    }

    @RequestMapping(value = “/demo_get”,method = RequestMethod.GET)

    @ResponseBody

    public String demo_get(){

        ShardedJedis shardedJedis = shardedJedisPool.getResource();

        //根據鍵值獲得數據

        String result = shardedJedis.get(“key1”);

        shardedJedis.close();

        return result;

    }



第二種方式:

  1. 配置方式同Jedis,只是使用RedisTemplate進行數據操作
  2. 示例代碼
    //配置類

@Configuration

@PropertySource("classpath:redis.properties")

public class RedisConfig extends JCacheConfigurerSupport {

    @Autowired

    private Environment environment;



    @Bean

    public RedisConnectionFactory redisConnectionFactory() {

        JedisConnectionFactory fac = new JedisConnectionFactory();

        fac.setHostName(environment.getProperty("redis.hostName"));

        fac.setPort(Integer.parseInt(environment.getProperty("redis.port")));

        fac.setPassword(environment.getProperty("redis.password"));

        fac.setTimeout(Integer.parseInt(environment.getProperty("redis.timeout")));

        fac.getPoolConfig().setMaxIdle(Integer.parseInt(environment.getProperty("redis.maxIdle")));

        fac.getPoolConfig().setMaxTotal(Integer.parseInt(environment.getProperty("redis.maxTotal")));

        fac.getPoolConfig().setMaxWaitMillis(Integer.parseInt(environment.getProperty("redis.maxWaitMillis")));

        fac.getPoolConfig().setMinEvictableIdleTimeMillis(

                Integer.parseInt(environment.getProperty("redis.minEvictableIdleTimeMillis")));

        fac.getPoolConfig()

                .setNumTestsPerEvictionRun(Integer.parseInt(environment.getProperty("redis.numTestsPerEvictionRun")));

        fac.getPoolConfig().setTimeBetweenEvictionRunsMillis(

                Integer.parseInt(environment.getProperty("redis.timeBetweenEvictionRunsMillis")));

        fac.getPoolConfig().setTestOnBorrow(Boolean.parseBoolean(environment.getProperty("redis.testOnBorrow")));

        fac.getPoolConfig().setTestWhileIdle(Boolean.parseBoolean(environment.getProperty("redis.testWhileIdle")));

        return fac;

    }



    @Bean

    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, String> redis = new RedisTemplate<>();

        redis.setConnectionFactory(redisConnectionFactory);

        redis.afterPropertiesSet();

        return redis;

    }

}

//測試

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes = {RedisConfig.class})

public class RedisTest {



    @Autowired

    private RedisTemplate<String, String> redisTemplate;

   

    @Test

    public void testRedisObj() {

        Map<String, Object> properties = new HashMap<>();

        properties.put("123", "hello");

        properties.put("abc", 456);

   

        redisTemplate.opsForHash().putAll("hash", properties);

   

        Map<Object, Object> ans = redisTemplate.opsForHash().entries("hash");

        System.out.println("ans: " + ans);

    }

}

//執行結果

ans: {123=hello, abc=456}

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM