这里说说在spring boot 下redis的配置和简单使用,这里前提时你的redis已经安装好


通过maven添加对redis的支持:

<!-- 添加redis -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version><!--$NO-MVN-MAN-VER$ -->
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.4</version>
		</dependency>


在application.properties添加redis配置信息

#redis配置
#节点,多个节点用,分隔:127.0.0.1:6379,127.0.0.1:6378,127.0.0.1:6377
#spring.redis.cluster.nodes=172.30.12.14:6379
spring.redis.cluster.ip=172.30.12.14
spring.redis.cluster.port=6379
spring.redis.cluster.password=inhand@redis2017
#最大连接数, 默认8个,一些低版本的包是maxActive,如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
spring.redis.cluster.maxTotal=100
#控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
spring.redis.cluster.maxIdle=20
#控制一个pool最少有多少个状态为idle(空闲的)的jedis实例。
spring.redis.cluster.minIdle=2
#等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
spring.redis.cluster.maxWait=10000
#在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
spring.redis.cluster.testOnBorrow=true
#jedis调用returnObject方法时,是否进行有效检查
spring.redis.cluster.testOnReturn=false
#读取超时
spring.redis.cluster.timeout=5000
#连接超时
spring.redis.cluster.connectionTimeout=5000
#最大尝试次数
spring.redis.cluster.maxAttempts=3



然后通过sping boot强大的注解功能,帮我们把配置信息注入到实体类:


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


// 特别注意:@ConfigurationProperties(prefix = "spring.redis.cluster")
// 中spring.redis.cluster要和application.properties中的前缀对应。
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class RedisProperties
{

    // 自动注入redis配置
    private String nodes;

    private String ip;

    private int port;

    private String password;

    private int maxTotal;

    private int maxIdle;

    private int minIdle;

    private int maxWait;

    private boolean testOnBorrow;

    private boolean testOnReturn;

    private int timeout;

    private int connectionTimeout;

    private int maxAttempts;

    public String getNodes()
    {
        return nodes;
    }

    public void setNodes(String nodes)
    {
        this.nodes = nodes;
    }

    public String getIp()
    {

        return ip;
    }

    public void setIp(String ip)
    {

        this.ip = ip;
    }

    public int getPort()
    {

        return port;
    }

    public void setPort(int port)
    {

        this.port = port;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    public int getMaxTotal()
    {
        return maxTotal;
    }

    public void setMaxTotal(int maxTotal)
    {
        this.maxTotal = maxTotal;
    }

    public int getMaxIdle()
    {
        return maxIdle;
    }

    public void setMaxIdle(int maxIdle)
    {
        this.maxIdle = maxIdle;
    }

    public int getMinIdle()
    {
        return minIdle;
    }

    public void setMinIdle(int minIdle)
    {
        this.minIdle = minIdle;
    }

    public int getMaxWait()
    {
        return maxWait;
    }

    public void setMaxWait(int maxWait)
    {
        this.maxWait = maxWait;
    }

    public boolean isTestOnBorrow()
    {
        return testOnBorrow;
    }

    public void setTestOnBorrow(boolean testOnBorrow)
    {
        this.testOnBorrow = testOnBorrow;
    }

    public boolean isTestOnReturn()
    {
        return testOnReturn;
    }

    public void setTestOnReturn(boolean testOnReturn)
    {
        this.testOnReturn = testOnReturn;
    }

    public int getTimeout()
    {
        return timeout;
    }

    public void setTimeout(int timeout)
    {
        this.timeout = timeout;
    }

    public int getConnectionTimeout()
    {
        return connectionTimeout;
    }

    public void setConnectionTimeout(int connectionTimeout)
    {
        this.connectionTimeout = connectionTimeout;
    }

    public int getMaxAttempts()
    {
        return maxAttempts;
    }

    public void setMaxAttempts(int maxAttempts)
    {
        this.maxAttempts = maxAttempts;
    }

}


然后在初始化连接:



import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import redis.clients.jedis.JedisPool;



@Configuration
public class ApplicationConfig extends WebMvcConfigurerAdapter
{


    // ---------------配置redis-----------------------

    /**
     * 1、JedisCluster管理集群与ShardedJedisPool分片连接池实现分布式的区别
     * ShardedJedisPool是redis没有集群功能之前客户端实现的一个数据分布式方案
     * ,redis3.0提供集群之后,客户端则采用JedisCluster实现连接redis集群环境。
     * ShardedJedisPool使用的是JedisShardInfo的instance的顺序或者name来做的一致性哈希 ,JedisCluster使用的是CRC16算法来做的哈希槽。
     * redis cluster配置集群与使用Jedis的ShardedJedis做Redis集群的区别 2、集群环境,各个服务之间的数据是隔离的
     * 无论是ShardedJedisPool的一致性哈希算法还是JedisCluster的CRC16哈希槽算法,都是把所有的服务叠加然后进行均匀的分割,
     * 分割出来的每一个段或槽都是不重复的,所以导致存储的数据彼此之间也是处于隔离状态的。
     * 3、jedis客户端操作redis主要三种模式:单台模式、分片模式(ShardedJedis)、集群模式(BinaryJedisCluster), 分片模式是一种轻量级集群
     **/

	 //注入配置属性的类
    @Autowired
    private RedisProperties redisProperties;

    /**
     * 注意: 这里返回的JedisCluster是单例的,并且可以直接注入到其他类中去使用 使用:
     * 
     * @Autowired private JedisCluster jc;
     */
	 
	 /**
     * redis集群模式
     * 
     * @return
     */
    // @Bean
    // public JedisCluster getJedisCluster() {
    //
    // String[] serverArray = redisProperties.getNodes().split(",");//
    // 获取服务器数组(这里要相信自己的输入,所以没有考虑空指针问题)
    // Set<HostAndPort> nodes = new HashSet<>();
    //
    // for (String ipPort : serverArray) {
    // String[] ipPortPair = ipPort.split(":");
    // nodes.add(new HostAndPort(ipPortPair[0].trim(), Integer
    // .valueOf(ipPortPair[1].trim())));
    // }
    //
    // //集群配置
    // JedisCluster jc = new JedisCluster(nodes,
    // redisProperties.getConnectionTimeout(),
    // redisProperties.getTimeout(), redisProperties.getMaxAttempts(),
    // redisProperties.getPassword(), genericObjectPoolConfig());
    //
    // return jc;
    //
    // }

    /**
     * redis单机模式
     * 
     * @return
     */
    @Bean
    public JedisPool getJedisPool()
    {

        JedisPool jedisPool = new JedisPool(genericObjectPoolConfig(), redisProperties.getIp(),
            redisProperties.getPort(), redisProperties.getTimeout(), redisProperties.getPassword());

        return jedisPool;
    }

    /**
     * 初始化连接池
     * 
     * @return
     */
    private GenericObjectPoolConfig genericObjectPoolConfig()
    {

        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();

        poolConfig.setMaxTotal(redisProperties.getMaxTotal());
        poolConfig.setMaxIdle(redisProperties.getMaxIdle());
        poolConfig.setMinIdle(redisProperties.getMinIdle());
        poolConfig.setMaxWaitMillis(redisProperties.getMaxWait());
        poolConfig.setTestOnBorrow(redisProperties.isTestOnBorrow());
        poolConfig.setTestOnReturn(redisProperties.isTestOnReturn());

        return poolConfig;
    }

}



到这基本可以使用了。


示例:

@Autowired
    private JedisPool jedisPool;

 public String get(String key)
    {
        Jedis jedis = null;
        String ret = null;
        try
        {
            jedis = jedisPool.getResource();
            ret = jedis.get(key);
        }
        catch (Exception e)
        {
            log.error(this, e);
        }
        finally
        {
            jedis.close();
        }
        return ret;
    }