SpringBoot2.4.2下配置Lettuce使用Redis
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下配置Lettuce使用Redis的更多相关文章
- windows环境下配置php和redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 一.Window 下安装 下载地址:https://github.com/dmajkic/redis/downl ...
- SpringBoot(十一):springboot2.0.2下配置mybatis generator环境,并自定义字段/getter/settetr注释
Mybatis Generator是供开发者在mybatis开发时,快速构建mapper xml,mapper类,model类的一个插件工具.它相对来说对开发者是有很大的帮助的,但是它也有不足之处,比 ...
- Ubuntu下PHP开发配置(新增redis、sphinx、sqlserver相关配置)
由于本人比较懒,所以一般都是用xampp的直接拿来改的…………(当然xampp中一般php版本都是比较新的用的过程中请大家注意哈,可能会和老版本冲突) 此次除了使用xampp外,还扩展了sphinx, ...
- Linux下配置Redis集群模式
配置机器1 在演示中,172.16.179.130为当前ubuntu机器的ip 在172.16.179.130上进⼊Desktop⽬录,创建conf⽬录 在conf⽬录下创建⽂件7000.conf,编 ...
- windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error
windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error 学习了:https ...
- Windows下配置Redis,并修改密码
原文:Windows下配置Redis,并修改密码 Windows下配置Redis,并修改密码 下载 Redis Windows版本的GitHub链接,直接下载zip文件解压到指定文件夹下或者下载msi ...
- Ubuntu下配置python完成爬虫任务(笔记一)
Ubuntu下配置python完成爬虫任务(笔记一) 目标: 作为一个.NET汪,是时候去学习一下Linux下的操作了.为此选择了python来边学习Linux,边学python,熟能生巧嘛. 前期目 ...
- linux安装和配置 mysql、redis 过程中遇到的问题记录
linux下部署mysql和redis网上的教程很多,这里记录一下我部署.配置的过程中遇到的一些问题和解决办法. mysql ①安装完成后启动的时候报错 Starting MySQL.The serv ...
- redis的单实例配置+web链接redis
[root@cache01 src]# wget http://download.redis.io/redis-stable.tar.gz [root@cache01 src]# tar -xzvf ...
随机推荐
- 关于某 App 请求参数 sign 字段加密分析
受害者: 6ZqG5LyX5pWw5o2u 通过 Charles 抓包发现关键信息请求均携带 sign 参数,且每次请求的值都不一样: 使用 jadx 将对应的 apk 反编译并分析,全局搜素 &qu ...
- CF1547B Alphabetical Strings 题解
Content 我们有一个空的字符串,第 \(i\) 次操作我们可以将字母表中第 \(i\) 个字母加入字符串的最前面或最后面.我们称一个长度为 \(n\) 的字符串是合法的,当且仅当这个字符串可以通 ...
- java 数据类型:集合接口Collection之队列Queue:PriorityQueue ;Dequeue接口和ArrayDeque实现类:
什么是Queue集合: Queue用于模拟队列这种数据结构,队列通常是"先进先出"(FIFO)的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素. ...
- JAVA实现调用默认浏览器打开网页
/** * @title 使用默认浏览器打开 * @param url 要打开的网址 */ private static void browse2(String url) throws Excepti ...
- htmlunit设置只采集html,取消对css,javascript支持
引入htmlunit依赖 <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit --> < ...
- 【LeetCode】1423. 可获得的最大点数 Maximum Points You Can Obtain from Cards (Python)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,滑动窗口,递归,前缀和,preSum,刷题群 目录 题目描述 解题思路 递归 ...
- 【LeetCode】1008. Construct Binary Search Tree from Preorder Traversal 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...
- 【LeetCode】940. Distinct Subsequences II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- D. Substring
D. Substring 题意: 给你一个有向图,然后给你一串字符串第i个点的值为第i个字符,然后给你m条有向边,从中找一条路径然后这条路径中点的值相同的个数的最大值,如果图有环输出-1. 思路: 拓 ...
- 教学日志:javaSE-面向对象2
一.局部变量和成员变量 package class4.oop1; /** * @Auther: Yu Panpan * @Date: 2021/12/10 - 12 - 10 - 14:47 * @D ...