Spring Boot 自带缓存及结合 Redis 使用
本文测试环境: Spring Boot 2.1.4.RELEASE + Redis 5.0.4 + CentOS 7
自带缓存
如果没有使用缓存中间件,Spring Boot 会使用默认的缓存,我们只需启用即可
在启动类添加 @EnableCaching 注解
@SpringBootApplication
@EnableCaching
public class CacheredisApplication {
public static void main(String[] args) {
SpringApplication.run(CacheredisApplication.class, args);
}
}
缓存配置
- @Cacheable: 先判断有没有缓存,有缓存取缓存,否则执行后续操作后结果存入缓存
- @CachePut: 操作后结果存入缓存
- @CacheEvict: 清除缓存
具体使用见下面示例:
@Service
//@CacheConfig(cacheNames = "user") // 如果使用该注解, 方法中则可以省略 cacheNames 配置
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
// 缓存的最终 key 值为 user::id
@Cacheable(cacheNames = "user", key = "#id")
public User get(int id) {
return userDao.get(id);
}
@Override
// condition: 执行方法前判断是否使用注解的功能; unless: 执行方法后,判断是否使用注解提供的功能
@CachePut(cacheNames = "user", key = "#user.id", condition = "#user.id<10", unless = "#result.status = 1")
public User update(User user) {
return userDao.update(user);
}
@Override
// 默认规则: 只有一个参数则 key 值取该参数, 如果有多个参数则将这些参数拼接起来作为 key
@CacheEvict(cacheNames = "user")
public boolean delete(int id) {
return userDao.delete(id);
}
@Override
// allEntries 清除 cacheNames 下所有 key; beforeInvocation 方法执行前清除
@CacheEvict(cacheNames = "user", allEntries = true, beforeInvocation = true)
public boolean deleteAll() {
return userDao.deleteAll();
}
}
结合 Redis 使用
关于 Redis 基本使用,参考昨天的随笔 Spring Boot + Redis 初体验
添加配置
spring:
cache:
type: redis # 设置使用 redis 作为缓存 (此行可以不配置)
redis:
time-to-live: 300s
# key-prefix: key # 不要配置该项
# use-key-prefix: true # 不要配置该项
redis:
host: 192.168.30.101
port: 6379
database: 0
# password: ******
缓存类添加代码
@Service
public class UserServiceImpl implements UserService {
@Autowired
StringRedisTemplate redisTemplate;
... ...
}
注意事项
要缓存的类要实现 Serializable 接口
存在问题 (坑)
在配置文件配置 key-prefix 和 use-key-prefix 项生成的 key 会有问题:
key-prefix | 不配置 | key- | key- |
use-key-prefix | 不配置 | true | false |
Redis缓存内的key | user::1 | key-1 | 1 |
如上所示,如果配置了 key-prefix 和 use-key-prefix 设置的 cacheNames 会被覆盖掉,两个或以上类的对象缓存会有问题
未解决问题
结合 Redis 使用时即使使用自定义 RedisTemplate 改变了 Serializer, 但在实际序列化时仍然使用的是默认的 JdkSerializationRedisSerializer,不知道为什么会这样 (这应该也是需要缓存的类为什么必须实现 Serializable 接口),还恳请大神指教!
源码:GitHub
本人 C# 转 Java 的 newbie, 如果错误或不足欢迎指正,谢谢
参考:
Spring Boot 自带缓存及结合 Redis 使用的更多相关文章
- Spring Boot 入门之缓存和 NoSQL 篇(四)
原文地址:Spring Boot 入门之缓存和 NoSQL 篇(四) 博客地址:http://www.extlight.com 一.前言 当系统的访问量增大时,相应的数据库的性能就逐渐下降.但是,大多 ...
- Spring Boot中使用缓存
Spring Boot中使用缓存 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一. 原始的使 ...
- Spring Boot中的缓存支持(一)注解配置与EhCache使用
Spring Boot中的缓存支持(一)注解配置与EhCache使用 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决 ...
- spring boot guava cache 缓存学习
http://blog.csdn.net/hy245120020/article/details/78065676 ****************************************** ...
- Spring Boot 集成 Ehcache 缓存,三步搞定!
作者:谭朝红 www.ramostear.com/articles/spring_boot_ehcache.html 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序 ...
- Spring Boot 2.x 缓存应用 Redis注解与非注解方式入门教程
Redis 在 Spring Boot 2.x 中相比 1.5.x 版本,有一些改变.redis 默认链接池,1.5.x 使用了 jedis,而2.x 使用了 lettuce Redis 接入 Spr ...
- Spring Boot(十三):整合Redis哨兵,集群模式实践
前面的两篇文章(Redis的持久化方案, 一文掌握Redis的三种集群方案)分别介绍了Redis的持久化与集群方案 -- 包括主从复制模式.哨兵模式.Cluster模式,其中主从复制模式由于不能自动做 ...
- spring boot连接linux服务器上的redis
本文章为给新手学习spring boot远程连通redis提供一个学习参考. 环境是intellij idea(window)+ redis(linux虚拟机-vmware). 首先在linux安装好 ...
- spring boot多数据源配置(mysql,redis,mongodb)实战
使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...
随机推荐
- pip install kaggle 出现 【网络不可达】?
解决办法: pip install kaggle -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
- redis的rdb与aof持久化机制
Redis提供了两种持久化方案:RDB持久化和AOF持久化,一个是快照的方式,一个是类似日志追加的方式 RDB快照持久化 RDB持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘 ...
- 利用ms08_067入侵window xp sp1(English)版本
前几天上课,老师搬出实验,自己体验了一下 1.环境配置 需要准备kali(攻击机),window xp (我这里是sp1 英文版本,标题很清楚了),攻击机和目标靶机要在同意网段下我的kali(192. ...
- HTML5 实现的一个俄罗斯方块实例代码
/*实现的功能:方块旋转(W键).自动下落.移动(ASD).消行.快速下落(空格键).下落阴影.游戏结束.*/ <!DOCTYPE html> <html> < ...
- 分布式流平台Kafka
提到Kafka很多人的第一印象就是它是一个消息系统,但Kafka发展至今,它的定位已远不止于此,而是一个分布式流处理平台.对于一个流处理平台通常具有三个关键能力: 1. 发布和订阅消息流,在这一点上它 ...
- Spider--动态网页抓取--审查元素
# 静态网页在浏览器中展示的内容都在HTML的源码中,但主流网页使用 Javascript时,很多内容不出现在HTML的源代码中,我们需要使用动态网页抓取技术. # Ajax: Asynchronou ...
- Python_环境搭建_jupyterNotebook的使用
# @ Author : Collin_PXY # 虚拟环境的创建及Jupyter Notebook的基本使用 # Anaconda 和 Jupter Notebook的使用: # 首先得需要安装 A ...
- HiveMQ TDengine extension 使用指南
我们简单介绍一下 HiveMQ extension for TDengine 的部署和使用方法. TDengine 和 HiveMQ 部署方法 TDengine 安装最新 TDengine serve ...
- 储存与RAID--独立磁盘阵列
存储: 专门用来插硬盘的机器,作用是增加插口,可以多插硬盘. 这种有策略保证硬盘坏了,数据不丢.而本地磁盘坏了,会导致数据丢失,故一般操作系统放在本地磁盘.而数据放在存储盘. 存储里依然有:cpu( ...
- 查询OSD运行在哪些cpu上
前言 在看CPU相关的文章的时候,想起来之前有文章讨论是否要做CPU绑定,这个有说绑定的也有说不绑定的,然后就想到一个问题,有去观测这些OSD到底运行在哪些CPU上面么,有问题就好解决了,现在就是要查 ...