温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot2.4.2下怎么使用Redis配置Lettuce

发布时间:2022-01-13 16:48:43 来源:亿速云 阅读:200 作者:iii 栏目:开发技术

这篇文章主要讲解了“SpringBoot2.4.2下怎么使用Redis配置Lettuce”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot2.4.2下怎么使用Redis配置Lettuce”吧!

    1. Springboot2.4.2下对Redis的基础集成

    1.1 maven添加依赖

     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                 <version>2.4.2</version>
            </dependency>

    注:Springboot2.4.2下默认使用的就是Lettuce而不是Jedis因此无需在依赖进行排除Jedis

    1.2 添加Redis配置文件

    首先Redis需要准备一个配置文件,本文设定一个单独的文件redis.properties 放在resource文件夹下

    redis.properties

    hostName = localhost
      port = 6379
      password = password
      pool.maxIdle = 10000
      pool.minIdle = 1000
      pool.maxWaitMillis = 5000
      pool.maxTotal = 2
      database = 10

    1.3 注册RedisTemplate和StringRedisTemplate的Bean

    LettuceRedisConfig.java

    package com.xxx.demo.redis;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
    import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    import java.io.Serializable;
    import java.time.Duration;
    /**
     * @author linkanyway
     * @version 1.0
     * @name LettuceRedisConfig
     * @description TODO
     * @date 2022/01/11 22:44
     */
    @Configuration
    @PropertySource("classpath:redis.properties")
    public class LettuceRedisConfig {
        @Value("${hostName}")
        private String hostName;
        @Value("${password}")
        private String password;
        @Value("${port}")
        private int port;
        @Value("${database}")
        private int database;
        @Value("${pool.maxIdle}")
        private int maxIdle;
        @Value("${pool.minIdle}")
        private int minIdle;
        @Value("${pool.maxWaitMillis}")
        private int maxWaitMillis;
        @Value("${pool.maxTotal}")
        private int maxTotal;
        /**
         * LettuceConnectionFactory
         *
         * @return
         */
        @Bean
        public LettuceConnectionFactory redisConnectionFactory() {
            RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration ();
            redisStandaloneConfiguration.setHostName (hostName);
            redisStandaloneConfiguration.setPort (port);
            redisStandaloneConfiguration.setPassword (password);
            redisStandaloneConfiguration.setDatabase (database);
            GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig ();
            poolConfig.setMaxIdle (maxIdle);
            poolConfig.setMinIdle (minIdle);
            poolConfig.setMaxWaitMillis (maxWaitMillis);
            poolConfig.setMaxTotal (maxTotal);
            LettucePoolingClientConfiguration lettucePoolingClientConfiguration =
                    LettucePoolingClientConfiguration.builder ().commandTimeout (Duration.ofSeconds (10)).shutdownTimeout (Duration.ZERO).poolConfig (poolConfig).build ();
            LettuceConnectionFactory lettuceConnectionFactory =
                    new LettuceConnectionFactory (redisStandaloneConfiguration, lettucePoolingClientConfiguration);
            lettuceConnectionFactory.setShareNativeConnection (false);
            return lettuceConnectionFactory;
        }
        /**
         * RedisTemplate
         *
         * @param connectionFactory
         * @return
         */
        @Bean
        public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
            RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<> ();
            redisTemplate.setKeySerializer (new StringRedisSerializer ());
            redisTemplate.setValueSerializer (new GenericJackson2JsonRedisSerializer ());
            redisTemplate.setConnectionFactory (connectionFactory);
            return redisTemplate;
        }
        /**
         * @param factory
         * @return
         */
        @Bean
        public StringRedisTemplate configStringRedisTemplate(@Autowired LettuceConnectionFactory factory) {
            StringRedisTemplate template = new StringRedisTemplate (factory);
            template.setEnableTransactionSupport (true);
            ObjectMapper mapper;
            GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer ();
            template.setValueSerializer (new StringRedisSerializer ());
            template.setKeySerializer (new StringRedisSerializer ());
            template.setHashKeySerializer (new StringRedisSerializer ());
            template.setHashValueSerializer (new StringRedisSerializer ());
            template.afterPropertiesSet ();
            return template;
        }
    }

    1.4 编写一个控制器示例进行redis操作

    package com.xx.demo.controller;
    import com.xxx.demo.redis.MessagePublisher;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    /**
     * @author linkanyway
     * @version 1.0
     * @name RedisController
     * @description TODO
     * @date 2022/01/11 22:37
     */
    @RestController
    @RequestMapping("redis")
    public class RedisController {
        final
        StringRedisTemplate redisTemplate;
        public RedisController(StringRedisTemplate redisTemplate) {
            this.redisTemplate = redisTemplate;
       
        }
        @GetMapping("add")
        public String add() {
            redisTemplate.opsForValue ().set ("a", "1");
            return "hi";
        }
    }

    2. 使用redis进行发布订阅

    2.1 添加一个发布者的接口

    package com.xxx.demo.redis;
    
    /**
     * @author linkanyway
     * @version 1.0
     * @name MessagePublisher
     * @description TODO
     * @date 2022/01/11 23:45
     */
    public interface MessagePublisher {
        void publish(final String message);
    }

    2.2 添加一个发布者的实现类

    RedisMessagePublisher.java

    package com.xxx.demo.redis;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.listener.ChannelTopic;
    import java.io.Serializable;
    /**
     * @author linkanyway
     * @version 1.0
     * @name RedisMessagePublisher
     * @description TODO
     * @date 2022/01/11 23:46
     */
    public class RedisMessagePublisher implements MessagePublisher {
        @Autowired
        private RedisTemplate<String, Serializable> redisTemplate;
        @Autowired
        private ChannelTopic topic;
        public RedisMessagePublisher() {
        }
        public RedisMessagePublisher(final RedisTemplate<String, Serializable> redisTemplate, final ChannelTopic topic) {
            this.redisTemplate = redisTemplate;
            this.topic = topic;
        }
        @Override
        public void publish(final String message) {
            redisTemplate.convertAndSend (topic.getTopic (), message);
        }
    }

    2.3 添加一个消息监听bean

    RedisMessageSubscriber.java

    package com.xxx.demo.redis;
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.scheduling.annotation.Async;
    /**
     * @author linkanyway
     * @version 1.0
     * @name RedisMessageSubscriber
     * @description TODO
     * @date 2022/01/11 23:47
     */
    public class RedisMessageSubscriber implements MessageListener {
        @Override
        @Async
        public void onMessage(Message message, byte[] pattern) {
            System.out.println ("Message received: " + new String (message.getBody ()));
        }
    }

    2.4 添加bean注册

    RedisMessageConfig.java

    package com.xxx.demo.redis;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.listener.ChannelTopic;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
    import java.io.Serializable;
    /**
     * @author linkanyway
     * @version 1.0
     * @name RedisMessageConfig
     * @description TODO
     * @date 2022/01/11 23:44
     */
    @Configuration
    public class RedisMessageConfig {
        @Bean
        MessageListenerAdapter messageListener() {
            return new MessageListenerAdapter (new RedisMessageSubscriber ());
        }
        @Bean
        RedisMessageListenerContainer redisContainer(LettuceConnectionFactory factory) {
            final RedisMessageListenerContainer container = new RedisMessageListenerContainer ();
            container.setConnectionFactory (factory);
            container.addMessageListener (messageListener (), topic ());
            return container;
        }
        @Bean
        MessagePublisher redisPublisher(@Autowired RedisTemplate<String, Serializable> redisTemplate) {
            return new RedisMessagePublisher (redisTemplate, topic ());
        }
        @Bean
        ChannelTopic topic() {
            return new ChannelTopic ("pubsub:queue");
        }
    }

    2.5 改写之前的控制器如下

    package com.xxx.demo.controller;
    import com.kreakin.demo.redis.MessagePublisher;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    /**
     * @author linkanyway
     * @version 1.0
     * @name RedisController
     * @description TODO
     * @date 2022/01/11 22:37
     */
    @RestController
    @RequestMapping("redis")
    public class RedisController {
        final
        StringRedisTemplate redisTemplate;
        final
        MessagePublisher publisher;
        public RedisController(StringRedisTemplate redisTemplate, MessagePublisher publisher) {
            this.redisTemplate = redisTemplate;
            this.publisher = publisher;
        }
        @GetMapping("hi")
        public String hi() {
            redisTemplate.opsForValue ().set ("a", "1");
            return "hi";
        }
        @GetMapping("pub")
        public String pub() {
            publisher.publish ("sdfsf");
            return "ok";
        }
    }

    3. 监听key的过期事件

    RedisKeyExpireSubscriber.java

    package com.xxx.demo.redis;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    import org.springframework.stereotype.Component;
    /**
     * @author linkanyway
     * @version 1.0
     * @name RedisKeyExpireSubscriber
     * @description TODO
     * @date 2022/01/12 00:00
     */
    @Slf4j
    @Component
    public class RedisKeyExpireSubscriber extends KeyExpirationEventMessageListener {
        /**
         * Creates new {@link } for {@code __keyevent@*__:expired} messages.
         *
         * @param listenerContainer must not be {@literal null}.
         */
        public RedisKeyExpireSubscriber(RedisMessageListenerContainer listenerContainer) {
            super (listenerContainer);
        }
        @Override
        public void onMessage(Message message, byte[] pattern) {
            log.error (message.toString ());
        }
    }

    注意: Redis需要开启事件

    感谢各位的阅读,以上就是“SpringBoot2.4.2下怎么使用Redis配置Lettuce”的内容了,经过本文的学习后,相信大家对SpringBoot2.4.2下怎么使用Redis配置Lettuce这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI