首页 技术 正文
技术 2022年11月14日
0 收藏 478 点赞 2,966 浏览 9501 个字

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需要开启事件

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,111
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,584
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,431
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,203
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,838
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,922