zoukankan      html  css  js  c++  java
  • Springboot整合RedisTemplate

    springboot整合redisTemplate

     <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <guava-version>27.0-jre</guava-version>
            <jedis-version>2.9.0</jedis-version>
    
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!--引入模板引擎的相关依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <!-- springboot整合redis -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>${guava-version}</version>
            </dependency>
    
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>${jedis-version}</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.8.1</version>
            </dependency>
        </dependencies>
    

    使用springboot-start里面默认的redis配置就可以了,当然也可以自己模仿他那样子自己配置一个也可以:
    简单使用默认的:
    springboot默认的RedisAutoConfiguration配置类:

    
    /**
     * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Redis support.
     *
     * @author Dave Syer
     * @author Andy Wilkinson
     * @author Christian Dupuis
     * @author Christoph Strobl
     * @author Phillip Webb
     * @author Eddú Meléndez
     * @author Stephane Nicoll
     * @author Marco Aust
     * @author Mark Paluch
     * @since 1.0.0
     */
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(RedisOperations.class)
    @EnableConfigurationProperties(RedisProperties.class)
    @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
    public class RedisAutoConfiguration {
    
    	@Bean
    	@ConditionalOnMissingBean(name = "redisTemplate")
    	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
    			throws UnknownHostException {
    		RedisTemplate<Object, Object> template = new RedisTemplate<>();
    		template.setConnectionFactory(redisConnectionFactory);
    		return template;
    	}
    
    	@Bean
    	@ConditionalOnMissingBean
    	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
    			throws UnknownHostException {
    		StringRedisTemplate template = new StringRedisTemplate();
    		template.setConnectionFactory(redisConnectionFactory);
    		return template;
    	}
    
    }
    
    

    配置文件查看这个类RedisProperties:

    spring:
      redis:
        database: 0
        host: 127.0.0.1
        password:
        port: 6379
        jedis:
          pool:
            max-active: 200
            max-wait: -1
            max-idle: 10
            min-idle: 0
        timeout: 1000
    

    直接使用StringRedisTemplate即可:
    在这里插入图片描述
    当然也可以自己按照他们那样的配也是可以的:
    在整合的时候,我想起来,以前都是配置连接池,后来都是直接配置RedisConnectionFactory,然后试了一下,加入没有jedis的pom配置,会报如下错误:

    Caused by: org.springframework.beans.factory.BeanCreationException:
    Error creating bean with name ‘taskConnectionFactory’ defined in class
    path resource [net/rdd/config/TaskServiceConfig.class]: Bean
    instantiation via factory method failed; nested exception is
    org.springframework.beans.BeanInstantiationException: Failed to
    instantiate
    [org.springframework.data.redis.connection.RedisConnectionFactory]:
    Factory method ‘taskConnectionFactory’ threw exception; nested
    exception is java.lang.NoClassDefFoundError:
    org/apache/commons/pool2/impl/GenericObjectPoolConfig

    尽管试了一下,发现必须要配置jedis的配置,然后看了一下源码:发现factory内部是维护了一个连接池,后期整理一下;
    然后是连接的配置类:

    package net.rdd.config;
    import net.rdd.listener.RedisMessageListener;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.connection.RedisPassword;
    import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.core.script.DefaultRedisScript;
    import org.springframework.data.redis.core.script.RedisScript;
    import org.springframework.data.redis.listener.PatternTopic;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    import org.springframework.scripting.support.ResourceScriptSource;
    
    @Configuration
    public class RedisServiceConfig {
    
        @Value("${redis.task.host}")
        private String redisHost;
    
        @Value("${redis.task.port}")
        private int redisPort;
    
        @Value("${redis.task.pass}")
        private String redisPass;
    
        @Value("${redis.task.db}")
        private int redisDb;
    
    
        @Bean
        @Primary
        public RedisConnectionFactory taskConnectionFactory() {
            JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
            connectionFactory.setPort(redisPort);
            connectionFactory.setHostName(redisHost);
            connectionFactory.setDatabase(redisDb);
            connectionFactory.setPassword(redisPass);
            return connectionFactory;
        }
    
        @Bean
        public RedisTemplate taskRedisTemplate() {
            RedisTemplate template = new StringRedisTemplate();
            template.setConnectionFactory(taskConnectionFactory());
            return template;
        }
    
        @Bean
        public RedisConnectionFactory rddConnectionFactory() {
            // 推荐使用
            RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
            redisStandaloneConfiguration.setPort(redisPort);
            redisStandaloneConfiguration.setHostName(redisHost);
            redisStandaloneConfiguration.setDatabase(3);
            redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPass));
            JedisConnectionFactory redisStandaloneConfigurationFactory = new JedisConnectionFactory(redisStandaloneConfiguration);
    
    //        JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
    //        connectionFactory.setPort(redisPort);
    //        connectionFactory.setHostName(redisHost);
    //        connectionFactory.setDatabase(3);
    //        connectionFactory.setPassword(redisPass);
    //
            //todo something wrong
            /**
             * org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
             */
    //        JedisShardInfo jedisShardInfo = new JedisShardInfo(redisHost,redisPort );
    //        jedisShardInfo.setConnectionTimeout(10000);
    //        jedisShardInfo.setSoTimeout(10000);
    //        jedisShardInfo.setPassword(redisPass);
    //        JedisConnectionFactory jedisShardInfoFactory = new JedisConnectionFactory(jedisShardInfo);
    
            return redisStandaloneConfigurationFactory;
        }
    
        @Bean("rddRedisTemplate")
        public StringRedisTemplate rddRedisTemplate() {
            StringRedisTemplate template = new StringRedisTemplate();
            template.setConnectionFactory(rddConnectionFactory());
    
    //        RedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
    //        RedisSerializer stringRedisSerializer = new StringRedisSerializer();
    //        // key 的序列化采用 StringRedisSerializer
    //        template.setKeySerializer(stringRedisSerializer);
    //        template.setHashKeySerializer(stringRedisSerializer);
    //        // value 值的序列化采用 GenericJackson2JsonRedisSerializer
    //        template.setValueSerializer(genericJackson2JsonRedisSerializer);
    //        template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
    
            return template;
        }
    
        @Bean
        public RedisScript<Boolean> lockScript() {
            DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();
            redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/redis-lock.lua")));
            redisScript.setResultType(Boolean.class);
            return redisScript;
        }
    
        @Bean
        public RedisScript<Boolean> unlockScript() {
            DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();
            redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/redis-unlock.lua")));
            redisScript.setResultType(Boolean.class);
            return redisScript;
        }
    
        @Bean
        //key过期监听,指定数据库
        RedisMessageListenerContainer keyExpirationListenerContainer(RedisMessageListener listener) {
            RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
            listenerContainer.setConnectionFactory(taskConnectionFactory());
            listenerContainer.addMessageListener(listener, new PatternTopic("__keyevent@" + redisDb + "__:expired"));
            return listenerContainer;
        }
    }
    

    然后具体使用,注入对应的类就好了:

     @Autowired
        @Qualifier(value = "taskRedisTemplate")
        private RedisTemplate taskRedisTemplate;
    
        @Autowired
        @Qualifier(value = "rddRedisTemplate")
        private RedisTemplate rddRedisTemplate;
    
        @Test
        public void test02() {
            taskRedisTemplate.opsForValue().set("dssd","fdsfds");
    
            rddRedisTemplate.opsForValue().set("322","ewew");
        }
    

    这样,简单的配置就好了.源码参考地址:https://github.com/stackXu/SpringBootRedis

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    实习第一天
    使用epublib解析epub文件(章节内容、书籍菜单)
    jdk1.8以前不建议使用其自带的Base64来加解密
    java学习-AES加解密之AES-128-CBC算法
    java学习-sha1散列算法
    日、周、月活跃用户数,用户流失率
    java学习-java.lang.Math随机数生成
    AndroidStudio报错Software caused connection abort: recv failed
    java学习-java.lang一Number类
    jdk内置类javax.imageio.ImageIO支持的图片处理格式
  • 原文地址:https://www.cnblogs.com/javayida/p/13347089.html
Copyright © 2011-2022 走看看