参考文档-Redis快速入门指南-中文
参考文档-Redis 教程
一、启动并连接
本地启动一个redis
或者用redis cloud
免费账户,都可以。
1 | docker run --name CommonTrain -p 6379:6379 -itd redis:7.2 |
然后下载REDISINSIGHT。
二、支持的数据类型
- 字符串
string
- 哈希
hash
- 列表
list
- 集合
set
- 有序集合
sorted set
- 位图
bitmaps
- 基数统计
hyperLogLogs
参考文档-Redis快速入门指南-中文
参考文档-Redis 教程
本地启动一个redis
或者用redis cloud
免费账户,都可以。
1 | docker run --name CommonTrain -p 6379:6379 -itd redis:7.2 |
然后下载REDISINSIGHT。
string
hash
list
set
sorted set
bitmaps
hyperLogLogs
缓存击穿就是大量并发访问同一个热点数据,一旦这个热点数据缓存失效,则请求压力都来到数据库。
1 | @Override |
使用缓存预热,把数据提前放入缓存,然后根据过期时间,发布合理的定时任务,主动去更新缓存,让热点数据永不过期。
Redis之缓存穿透问题解决方案实践SpringBoot3+Docker
缓存雪崩,指大量的缓存失效,大量的请求又同时落在数据库。主要的一种诱因是key设置的过期时间都一样。
加锁,每次只让一个线程可以访问数据库,随后存入缓存。性能太差。
最简单有效的解决办法是设置不同的过期时间。比如
1 | int timeout = 10 + new Random().nextInt(20); |
使用缓存预热,把数据提前放入缓存,然后根据过期时间,发布合理的定时任务,主动去更新缓存。
缓存预热参考代码如下。
1 | @Component |
至于定时任务,可以使用xxl-job。具体使用方法,可以参考这个文章
Docker部署xxl-job调度器并结合SpringBoot测试
Spring AMQP(3.1.1)设置ConfirmCallback和ReturnsCallback
环境如下
Version | |
---|---|
SpringBoot | 3.2.1 |
spring-amqp | 3.1.1 |
RabbitMq | 3-management |
老版本的spring-amqp
在CorrelationData
上设置ConfirmCallback
。但是今天却突然发现correlationData.getFuture()
没有addCallback
函数了。
查询文档和帖子后,发现ConfirmCallback
和ReturnsCallback
都需要在RabbitTemplate
中设置,同时ConfirmCallback
中默认无法得到消息内容,如果想在ConfirmCallback
中把消息内容存到数据库等地方进行记录,怎么办呢?
参考手册
1 | @Slf4j |
在上面的类中继续添加RabbitTemplate
,并设置ConfirmCallback
和ReturnsCallback
。
1 | @Bean |
原始的CorrelationData
,目前已经无法从中获取消息内容,也就是说现在的ConfirmCallback
无法获取到消息的内容,因为设计上只关注是否投递到exchange
成功。如果需要在ConfirmCallback
中获取消息的内容,需要扩展这个类,并在发消息的时候,放入自定义数据。
1 | public class EnhancedCorrelationData extends CorrelationData { |
在EnhancedCorrelationData
把消息本身放进去,或者如果你有表记录消息,你可以只放入其id
。这样触发ConfirmCallback的时候,就可以获取消息内容。
1 | public void notifyPayResult() { |
在 Spring Boot
开发中,我们时常遇到需要在一个类的内部调用自己的其他方法,并且这些方法可能需要事务支持。这种场景通常发生在业务逻辑较为复杂的服务类中,其中一些操作需要确保数据的一致性和完整性。本文将以 MediaFileServiceImpl
类为例,探讨如何在 Spring Boot
中有效地使用当前类的代理类来处理内部事务。
考虑一个典型的例子:在 MediaFileServiceImpl
服务类中,upload
方法需要调用 upload2Mysql
方法。这里,upload2Mysql
方法是事务性的,意味着它涉及到数据库操作,这些操作需要在一个事务中被处理。如果直接在 upload
方法中调用 upload2Mysql
,由于 Spring
的代理方式,事务管理可能不会被正确应用,因为实际上是在同一个实例内部进行方法调用,绕过了 Spring
的代理。
1 | @Service |
@Lazy
(推荐)在 MediaFileServiceImpl
类中使用 @Lazy
注解解决循环依赖问题。
1 | @Service |
方法注入是一种允许在运行时动态注入方法实现的技术。这里,我们通过一个简单的例子来说明如何应用方法注入。
1 | @Service |
ApplicationContext
这种方法通过 ApplicationContext
获取当前类的代理。
1 | @Service |
将事务性方法移至另一个服务类中。
1 | @Service |
使用 AspectJ 代理模式而不是默认的 JDK 动态代理。
1 | @EnableAspectJAutoProxy(proxyTargetClass = true) |
然后,您的 MediaFileServiceImpl
类保持不变。