本文测试环境: 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编写RESTful API

Spring Boot 自带缓存及结合 Redis 使用的更多相关文章

  1. Spring Boot 入门之缓存和 NoSQL 篇(四)

    原文地址:Spring Boot 入门之缓存和 NoSQL 篇(四) 博客地址:http://www.extlight.com 一.前言 当系统的访问量增大时,相应的数据库的性能就逐渐下降.但是,大多 ...

  2. Spring Boot中使用缓存

    Spring Boot中使用缓存 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一. 原始的使 ...

  3. Spring Boot中的缓存支持(一)注解配置与EhCache使用

    Spring Boot中的缓存支持(一)注解配置与EhCache使用 随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决 ...

  4. spring boot guava cache 缓存学习

    http://blog.csdn.net/hy245120020/article/details/78065676 ****************************************** ...

  5. Spring Boot 集成 Ehcache 缓存,三步搞定!

    作者:谭朝红 www.ramostear.com/articles/spring_boot_ehcache.html 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序 ...

  6. Spring Boot 2.x 缓存应用 Redis注解与非注解方式入门教程

    Redis 在 Spring Boot 2.x 中相比 1.5.x 版本,有一些改变.redis 默认链接池,1.5.x 使用了 jedis,而2.x 使用了 lettuce Redis 接入 Spr ...

  7. Spring Boot(十三):整合Redis哨兵,集群模式实践

    前面的两篇文章(Redis的持久化方案, 一文掌握Redis的三种集群方案)分别介绍了Redis的持久化与集群方案 -- 包括主从复制模式.哨兵模式.Cluster模式,其中主从复制模式由于不能自动做 ...

  8. spring boot连接linux服务器上的redis

    本文章为给新手学习spring boot远程连通redis提供一个学习参考. 环境是intellij idea(window)+ redis(linux虚拟机-vmware). 首先在linux安装好 ...

  9. spring boot多数据源配置(mysql,redis,mongodb)实战

    使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...

随机推荐

  1. Miller-Rabin 素数检验算法

    算法简介 Miller-Rabin算法,这是一个很高效的判断质数的方法,可以在用\(O(logn)\) 的复杂度快速判断一个数是否是质数.它运用了费马小定理和二次探测定理这两个筛质数效率极高的方法. ...

  2. Dapr Golang HTTP 调用

    Dapr Golang HTTP 调用 版本介绍 Go 版本:1.15 Dapr Go SKD 版本:0.11.1 工程结构 从上图可知,新建 3 个 Go 启动项目,cmd 为启动项目目录,其中 c ...

  3. 阿里P8大佬熬夜10天,把所有Android第三方库整理成了PDF

    缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑.快速迭代的目的越来越难,还有应用之间的互相调用等等问题,插件化技术应用而生.如果没有插件化技术,美团. ...

  4. SQL SERVER数据库常用命令

    创建数据库: 命令:create database 数据库名: 示例:create database student: 删除数据库: 命令:drop database 数据库名: 示例:drop da ...

  5. Python调用Java(基于Ubuntu 18.04)

    最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...

  6. 腾讯云--腾讯云sdk-实现脚本修改腾讯云负载均衡权重

    一.请确认你的当前python环境为python 2.x 获取 python 版本的方法 (linux shell) # python -v python 2.7.11 二.CLB SDK下载与配置 ...

  7. 获取url后面的参数

    function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = qu ...

  8. xenserver中linux虚拟机修改启动顺序

    xenserver是思杰的一款类似于vmware ESXI的虚拟化平台,或者说虚拟化操作系统,上面可以安装许多虚拟机,但是当你装完linux虚拟机,你会发现一个问题,不能像windows vm那样直接 ...

  9. 文本多行省略号(CSS最优方案)

    Float定位溢出隐藏 优点: 纯CSS实现,性能好,不用js调优 兼容性高 多行省略,自动显示 缺点: 单词截断 代码如下: <div class="ellipses-div&quo ...

  10. arm-linux 修改rootfs登录名和密码

    1.保证文件系统busybox中已经配置了login登录功能. 2.修改命令行前缀名 (1)进到/etc/sysconfig,找到HOSTNAME文件,修改里面为想要的登录名后,之后再重新加载文件系统 ...