1. 程式人生 > >Spring-Data-Redis叢集配置和RedisTemplate用法

Spring-Data-Redis叢集配置和RedisTemplate用法

使用SpringData更加方便我們對關係型資料庫和非關係型資料庫更好的操作,封裝了通用的程式碼,使得操作更加快捷簡單。
一、使用Spring-data-redis Jar包準備
spring-data-redis 需要在1.7 版本以上,他會依賴一些包,比如說 spring-data-commons ,在spring-data-x 系列裡,都要依賴這個包。如果你之前專案裡使用到了spring-data-x 系列的包,可能需要升級,因為都共同依賴了spring-data-commons ,但是在當前叢集要使用的spring-data-redis 中 spring-data-commons 必須要1.12.x 版本以上,這個問題要注意一下。

二、開始配置

1.在spring-application.xml中加入如下程式碼

<import resource="spring-redis.xml"/>

2.建立redis配置檔案spring-redis.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"
>
<!-- 載入配置屬性檔案 按需載入 --> <!-- <context:property-placeholder ignore-unresolvable="true" location="classpath:redis.cluster.properties" /> --> <!-- 配置Cluster --> <bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration"> <property name="maxRedirects" value="3"></property> <!-- 節點配置 --> <property name="clusterNodes"> <set> <bean class="org.springframework.data.redis.connection.RedisClusterNode"> <constructor-arg name="host" value="120.99.158.113 "></constructor-arg> <constructor-arg name="port" value="7000"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisClusterNode"> <constructor-arg name="host" value="120.99.158.113 "></constructor-arg> <constructor-arg name="port" value="7001"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisClusterNode"> <constructor-arg name="host" value="120.99.158.113 "></constructor-arg> <constructor-arg name="port" value="7002"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisClusterNode"> <constructor-arg name="host" value="112.42.136.189"></constructor-arg> <constructor-arg name="port" value="7003"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisClusterNode"> <constructor-arg name="host" value="112.42.136.189"></constructor-arg> <constructor-arg name="port" value="7004"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisClusterNode"> <constructor-arg name="host" value="112.42.136.189"></constructor-arg> <constructor-arg name="port" value="7005"></constructor-arg> </bean> </set> </property> </bean> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="100" /> <property name="maxTotal" value="600" /> </bean> <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" /> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <constructor-arg ref="redisClusterConfiguration" /> <constructor-arg ref="jedisPoolConfig" /> </bean> <!-- redis 訪問的模版 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory" /> <!-- 新增如下序列化配置解決key亂碼問題以及令keys()方法生效 --> <property name="keySerializer" ref="stringRedisSerializer"/> <property name="hashKeySerializer" ref="stringRedisSerializer"/> </bean> </beans>

叢集已經整合完成

三、redis操作工具類

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

@Service
public class RedisUtil<T> {

    @Autowired @Qualifier("redisTemplate")
    public RedisTemplate redisTemplate;

    /**
     * 快取基本的物件,Integer、String、實體類等
     * @param key 快取的鍵值
     * @param value 快取的值
     * @return  快取的物件
     */
    public <T> ValueOperations<String,T> setCacheObject(String key,T value)
    {
        System.out.println(key+"*****"+value.toString());
        ValueOperations<String,T> operation = redisTemplate.opsForValue(); 
        operation.set(key,value);
        return operation;
    }

    /**
     * 獲得快取的基本物件。
     * @param key  快取鍵值
     * @param operation
     * @return   快取鍵值對應的資料
     */
    public <T> T getCacheObject(String key/*,ValueOperations<String,T> operation*/)
    {
        ValueOperations<String,T> operation = redisTemplate.opsForValue(); 
        return operation.get(key);
    }

    /**
     * 快取List資料
     * @param key  快取的鍵值
     * @param dataList 待快取的List資料
     * @return   快取的物件
     */
    public <T> ListOperations<String, T> setCacheList(String key,List<T> dataList)
    {
        ListOperations listOperation = redisTemplate.opsForList();
        if(null != dataList)
        {
            int size = dataList.size();
            for(int i = 0; i < size ; i ++)
            {

                listOperation.rightPush(key,dataList.get(i));
            }
        }

        return listOperation;
    }

    /**
     * 獲得快取的list物件
     * @param key 快取的鍵值
     * @return  快取鍵值對應的資料
     */
    public <T> List<T> getCacheList(String key)
    {
        List<T> dataList = new ArrayList<T>();
        ListOperations<String,T> listOperation = redisTemplate.opsForList();
        Long size = listOperation.size(key);
        for(int i = 0 ; i < size ; i ++)
        {
            dataList.add((T) listOperation.leftPop(key));
        }

        return dataList;
    }

    /**
     * 獲得快取的list物件範圍
     * @param key 快取的鍵值 arg1到arg2
     * @return  快取鍵值對應的資料
     */
    public <T> List<T> getCacheListIndex(String key, long arg1, long arg2)
    {
        List<T> dataList = new ArrayList<T>();
        ListOperations<String,T> listOperation = redisTemplate.opsForList();
        dataList = listOperation.range(key, arg1, arg2);
        return dataList;
    }

    /**
     * 快取Set
     * @param key  快取鍵值
     * @param dataSet 快取的資料
     * @return   快取資料的物件
     */
    public <T> BoundSetOperations<String,T> setCacheSet(String key,Set<T> dataSet)
    {
        BoundSetOperations<String,T> setOperation = redisTemplate.boundSetOps(key); 
        /*T[] t = (T[]) dataSet.toArray();
        setOperation.add(t);*/

        Iterator<T> it = dataSet.iterator();
        while(it.hasNext())
        {
            setOperation.add(it.next());
        }

        return setOperation;
    }

    /**
     * 獲得快取的set
     * @param key
     * @param operation
     * @return
     */
    public Set<T> getCacheSet(String key/*,BoundSetOperations<String,T> operation*/)
    {
        Set<T> dataSet = new HashSet<T>();
        BoundSetOperations<String,T> operation = redisTemplate.boundSetOps(key);
        Long size = operation.size();
        for(int i = 0 ; i < size ; i++)
        {
            dataSet.add(operation.pop());
        }
        return dataSet;
    }

    /**
     * 快取Map
     * @param key
     * @param dataMap
     * @return
     */
    public <T> HashOperations<String,String,T> setCacheMap(String key,Map<String,T> dataMap)
    {

        HashOperations hashOperations = redisTemplate.opsForHash();
        if(null != dataMap)
        {

            for (Map.Entry<String, T> entry : dataMap.entrySet()) { 

                /*System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); */
                hashOperations.put(key,entry.getKey(),entry.getValue());
            } 

        }

        return hashOperations;
    }

    /**
     * 獲得快取的Map
     * @param key
     * @param hashOperation
     * @return
     */
    public <T> Map<String,T> getCacheMap(String key/*,HashOperations<String,String,T> hashOperation*/)
    {
        Map<String, T> map = redisTemplate.opsForHash().entries(key);
        /*Map<String, T> map = hashOperation.entries(key);*/
        return map;
    }

    /**
     * 快取Map
     * @param key
     * @param dataMap
     * @return
     */
    public <T> HashOperations<String,Integer,T> setCacheIntegerMap(String key,Map<Integer,T> dataMap)
    {
        HashOperations hashOperations = redisTemplate.opsForHash();
        if(null != dataMap)
        {

            for (Map.Entry<Integer, T> entry : dataMap.entrySet()) { 

                /*System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); */
                hashOperations.put(key,entry.getKey(),entry.getValue());
            } 

        }

        return hashOperations;
    }

    /**
     * 獲得快取的Map
     * @param key
     * @param hashOperation
     * @return
     */
    public <T> Map<Integer,T> getCacheIntegerMap(String key/*,HashOperations<String,String,T> hashOperation*/)
    {
        Map<Integer, T> map = redisTemplate.opsForHash().entries(key);
        /*Map<String, T> map = hashOperation.entries(key);*/
        return map;
    }

到這裡基本已經配置成功了.最後可以寫一個方法測試一下

@Autowired @Qualifier("redisTemplate")
    public RedisTemplate redisTemplate;

@RequestMapping(value="/test",produces = "text/html;charset=UTF-8")
    public void test(){
        try {
            redisCache.setCacheObject("key123", "456");
            String value= redisCache.getCacheObject("key123");
            System.out.println(value);
        }
    }