SpringBoot2.4.2下使用Redis配置Lettuce的示例

网友投稿 721 2022-09-04


SpringBoot2.4.2下使用Redis配置Lettuce的示例

目录1. Springboot2.4.2下对Redis的基础集成1.1 maven添加依赖1.2 添加Redis配置文件1.3 注册RedisTemplate和StringRedisTemplate的Bean1.4 编写一个控制器示例进行redis操作2. 使用redis进行发布订阅2.1 添加一个发布者的接口2.2 添加一个发布者的实现类2.3 添加一个消息监听bean2.4 添加bean注册2.5 改写之前的控制器如下3. 监听key的过期事件

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

1.1 maven添加依赖

org.springframework.boot

spring-boot-starter-data-redis

2.4.2

注: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.http://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 redisTemplate(LettuceConnectionFactory connectionFactory) {

RedisTemplate 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 redisTemplate;

@Autowired

private ChannelTopic topic;

public RedisMessagePublisher() {

}

public RedisMessagePublisher(final RedisTemplate 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 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需要开启事件


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【BP预测】基于布谷鸟算法优化BP神经网络数据回归预测含Matlab源码(布谷鸟算法matlab程序)
下一篇:【DELM预测】基于鲸鱼算法改进深度学习极限学习机实现数据预测附matlab代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~