spring 使用redis集羣配置

 

redis的java支持已經作的很是好了,因此咱們來試着使用這些api來進行redis的操做,首先咱們須要操做redis的架包:java

<dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.7.3</version>
    </dependency>

咱們須要作的僅僅是在spring配置文件中注入這些基本類,而後本身實現dao,下面是配置文件:redis

複製代碼

<context:property-placeholder ignore-unresolvable="true" location="classpath:yonyou.properties" />
    
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="1000"/> 
        <property name="maxIdle" value="10"/> 
        <property name="minIdle" value="1"/>
        <property name="maxWaitMillis" value="30000"/> 
        <property name="testOnBorrow" value="true"/> 
        <property name="testOnReturn" value="true"/> 
        <property name="testWhileIdle" value="true"/>
        <!-- <property name="testWhileIdle" value="true"/> -->
    </bean>
    
       <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" destroy-method="destroy">
        <constructor-arg ref="jedisPoolConfig"/> 
        <constructor-arg>
      <!--若是之後須要擴展集羣,只須要複製一份redis,修改端口,而後在這裏配置便可-->
            <list> 
            <bean class="redis.clients.jedis.JedisShardInfo"> 
                <constructor-arg index="0" value="127.0.0.1"/>
                <constructor-arg index="1" value="6379"/>
                <constructor-arg index="2" value="instance:01"/>
            </bean>
            <bean class="redis.clients.jedis.JedisShardInfo">
                <constructor-arg index="0" value="127.0.0.1"/>
                <constructor-arg index="1" value="6380"/>
                <constructor-arg index="2" value="instance:02"/>
            </bean> 
            <bean class="redis.clients.jedis.JedisShardInfo">
                <constructor-arg index="0" value="127.0.0.1"/>
                <constructor-arg index="1" value="6381"/>
                <constructor-arg index="2" value="instance:03"/>
            </bean>
            </list>
        </constructor-arg>
        </bean>
     <!--java幫咱們同步sentinel的信息,將主從信息同步到客戶端來-->
   <bean class="redis.clients.jedis.JedisSentinelPool">
        <constructor-arg index="0" value="mymaster"/>
        <constructor-arg index="1">
            <set>
                <value>127.0.0.1:26379</value>
            </set>
        </constructor-arg>
        <constructor-arg index="2" ref="jedisPoolConfig"/>
    </bean>

複製代碼

上面配置好了之後,咱們就至關於將redis集羣給映射過來了,下來咱們只須要作一些操做,涉及到數據的CRUD.spring

複製代碼

package com.yonyou.hotusm.module.nosql.redis;

import redis.clients.jedis.ShardedJedis;
//這個接口是操做sharedJedis
public interface RedisDataSource {
    
    public abstract ShardedJedis getRedisClient();
    public void returnResource(ShardedJedis shardedJedis);
    public void returnResource(ShardedJedis shardedJedis,boolean broken);
}

複製代碼

實現:sql

複製代碼

package com.yonyou.hotusm.module.nosql.redis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Repository("redisDataSource")
public class RedisDataSourceImpl implements RedisDataSource {

    private static final Logger log = LoggerFactory.getLogger(RedisDataSourceImpl.class);

    @Autowired
    private ShardedJedisPool    shardedJedisPool;

    public ShardedJedis getRedisClient() {
        try {
            ShardedJedis shardJedis = shardedJedisPool.getResource();
            return shardJedis;
        } catch (Exception e) {
            log.error("getRedisClent error", e);
        }
        return null;
    }

    public void returnResource(ShardedJedis shardedJedis) {
        shardedJedisPool.close();
        //shardedJedisPool.returnResource(shardedJedis);
    }

    public void returnResource(ShardedJedis shardedJedis, boolean broken) {
        if (broken) {
            shardedJedisPool.close();
            //shardedJedisPool.returnBrokenResource(shardedJedis);
        } else {
            shardedJedisPool.close();
            //shardedJedisPool.returnResource(shardedJedis);
        }
    }
}

複製代碼

 下面就是操做jedis的具體類了:api

複製代碼

@Repository("jedisTemplate")
public class JedisTemplate {

    private static final Logger log = LoggerFactory.getLogger(JedisTemplate.class);

    @Autowired
    private RedisDataSource     redisDataSource;

    public void disconnect() {
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        shardedJedis.disconnect();
    }

    /**
     * 設置單個值
     * 
     * @param key
     * @param value
     * @return
     */
    public String set(String key, String value) {
        String result = null;

        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.set(key, value);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }

    /**
     * 獲取單個值
     * 
     * @param key
     * @return
     */
    public String get(String key) {
        String result = null;
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }

        boolean broken = false;
        try {
            result = shardedJedis.get(key);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }

複製代碼

相關文章
相關標籤/搜索