dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(五)Spring中spring-data-redis的使用

請叫我東子發表於2017-01-07

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u010046908/article/details/54170891

前面已經寫了四篇關於dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合的文章:

  1. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(一)Dubbo的使用
  2. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(二)之 JDBC連線池、監控元件 Druid
  3. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(三)使用Spring AOP實現mysql的讀寫分離
  4. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(四)Spring AOP中使用log4j實現http請求日誌入mongodb

今天繼續寫一篇關於Spring中spring-data-redis的使用。

Redis是一種特殊的型別的資料庫,它被稱為一種key-value儲存。key-value儲存儲存的是鍵值對。實際上,key-value儲存於雜湊Map有很大的相似。
spring data是一種面向模板的資料訪問,能夠在使用Redis的時候,為我們提供了幫助。於是就有了spring-data-redis。

1. spring-data-redis的簡介

spring-data-redis包含了多個模板實現,用來完成Redis資料庫的存取功能。建立spring-data-redis模板之前,我們首先需要一個Redis連線工廠,spring-data-redis提供了四個連線工廠供我們選擇。

2.spring-data-redis所需要依賴

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

3. spring-data-redis的使用

3.1 連線到Redis

Redis連線工廠會生成到Redis資料庫伺服器的連線。spring-data-redis為四種Redis客戶端實現了連線工廠:

  • JedisConnectionFactory
  • JredisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

    具體選擇哪一種取決於自己。

(1)建立redis.properties:

maxTotal=8
#最大空閒時間
maxIdle=8
#最短空閒時間
minIdle=0
#最大的等待時間
maxWaitMillis=6000
#Redis的連線地址
hostR=127.0.0.1
#埠
portR=6379

(2)建立spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd">

    <!-- 引入redis.properties配置檔案-->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
        <property name="location" value="classpath:redis.properties" /> </bean> 

    <!-- redis連線池的配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${maxTotal}" />
        <property name="maxIdle" value="${maxIdle}" />
        <property name="minIdle" value="${minIdle}" />
        <property name="maxWaitMillis" value="10000" />
        <property name="minEvictableIdleTimeMillis" value="300000"></property> 
        <property name="numTestsPerEvictionRun" value="3"></property> 
        <property name="timeBetweenEvictionRunsMillis" value="60000"></property> 
   </bean>
    <!-- 工廠類配置 -->
    <bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${hostR}" />
        <property name="port" value="${portR}" />
        <property name="poolConfig" ref="jedisPoolConfig" />
         <property name="timeout" value="15000"></property> 
        <property name="usePool" value="true"></property> 
    </bean>

    <!-- redisTemplate配置 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
        <property name="keySerializer">
            <bean
                class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean
                class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
        </property>
        <property name="enableTransactionSupport" value="true" />
    </bean>

</beans>

以上是我配置的jedisPoolConfig,jedisConnectionFactory,redisTemplate。

3.2 使用RedisTemplate

Redis連線工廠會生成到Redis key-value儲存的連線(以RedisConnection的形式。)藉助RedisConnection,可以儲存和讀取資料。

spring-redis-data以模板的形式提供了較好等級的資料訪問方案。實際上,spring-data-redis提供了兩個模板:

  • RedisTemplate
  • StringRedisTemplate

其中RedisTemplate使用兩個型別進行了引數。第一個引數是key的型別,第二個引數是value的型別,而StringRedisTemplate是RedisTemplate的擴充套件,只關注String型別,也就是key和vlaue都是String型別。

3.2.1 RedisTemplate使用簡單值

假設我們想通過RedisTemplate

  public class UserRedisDaoImp extends AbstractBaseRedisTemplete<User> 
              implements IUserRedisDao {

    @Override
    public User findById(String key) {
        return (User) redisTemplate.opsForValue().get(key);
    }

    @Override
    public void saveUser(String key,User user) {
         redisTemplate.opsForValue().set(key, user);
    }

}
3.2.2 RedisTemplate使用List值

使用List型別的value與之類似,只需要使用opForList()方法,

package com.lidong.core.user.dao;

import java.util.List;

import com.lidong.model.user.User;
import com.lidong.util.AbstractBaseRedisTemplete;

public class UserRedisDaoImp extends AbstractBaseRedisTemplete<User> 
              implements IUserRedisDao {

    @Override
    public List<User> getUserList(String key,long start,long end) {
         return  redisTemplate.opsForList().range(key, 0, end);
    }

    @Override
    public Long addUserToUserList(String key, User user) {
        return redisTemplate.opsForList().leftPush(key, user);

    }

}
3.2.3 RedisTemplate使用Set值

除了使用List型別和value型別,我們還可以使用opForSet()的方法操作Set,最為常用的的就是向Set中新增一個元素:

@Override
    public void saveUser(String key,User user) {
         redisTemplate.opsForSet().add(key, user);
    }

在我們有多個Set,並對這些Set集合進行差、交、並的操作。

 Set<User> difference = redisTemplate.opsForSet().difference("users1", "users2");
          Set<User> union = redisTemplate.opsForSet().union("users1", "users2");
          Set<User> intersect = redisTemplate.opsForSet().intersect("users1", "users2");
          //我還可以移除Set中的元素
          Long remove = redisTemplate.opsForSet().remove("user1", user);
3.2.4 RedisTemplete繫結到某個key上

我們可以將Value、List、Set等可以繫結到指定的key上。這些用個的不太多,但是也簡單。這裡就不具體寫了。

3.2.5 構造AbstractBaseRedisTemplete
package com.lidong.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.data.redis.core.RedisTemplate;
/**
 * 基礎的RedisTemplete
 * @author lidong
 * @param <T>
 * @date 2017-1-5
 */
public abstract class AbstractBaseRedisTemplete<T> implements
        ApplicationContextAware {


    protected RedisTemplate<String,T>  redisTemplate;

     /** 
     * @Description RedisTemplate 
     * @param redisTemplate 
     */  
    public void setRedisTemplate(RedisTemplate<String,T> redisTemplate) {  
        this.redisTemplate = redisTemplate;  
    }  

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        @SuppressWarnings("unchecked")
        RedisTemplate<String,T> redisTemplate = applicationContext.getBean(  
                "redisTemplate", RedisTemplate.class);  
        setRedisTemplate(redisTemplate); 
    }

}

Spring-Data-Redis的使用基本最常用 的就是這三種型別value型別、List型別、Set型別。

程式碼地址


相關文章