在SpringBoot项目中使用redis简单用法(一)

news/2024/7/5 2:03:15

基本准备

首先肯定是需要将Redis的包和Redis链接配置好 
这里以maven作为项目构建工具,所以直接在POM文件中引入的Redis依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

接下来就是Redis链接的配置

spring:
  redis:
    host: 127.0.0.1
    port: 6379

简单使用

@EnableCaching

想要使用注解的方式来使用Redis缓存,那么首先就是得使能缓存,在Application.java上添加该注解

@SpringBootApplication
@EnableCaching
public class SellApplication {

    public static void main(String[] args) {
        SpringApplication.run(SellApplication.class, args);
    }
}


@Cacheable
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。 
对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。
@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "123")
public ResultVO findOne(@Param("productId") String productId) {
    log.info("Get from database ...");
    // 从数据库获取数据, ProductInfo必须实现Serializable
    ProductInfo productInfo = productService.findOne(productId);
    return ResultVOUtil.success(productInfo);
}

cacheNames: 缓存的名称,不能为空 
key: 缓存的 key,可以为空

key可以使用SpEL 表达式编写,实现动态key。

@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "#productId")
public ResultVO findOne(@Param("productId") String productId) {
    log.info("Get from database ...");
    ProductInfo productInfo = productService.findOne(productId);
    return ResultVOUtil.success(productInfo);
}

 

这里只有当productId被缓存过,才会调用缓存中的数据。如果没有被访问过,那么还是会先从数据库中获取再缓存的。

condition:缓存的条件,可以为空,使用 SpEL 编写

@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "#productId", condition="#productId >= 3 ")
public ResultVO findOne(@Param("productId") Integer productId) {
    log.info("Get from database ... " + productId);
    ProductInfo productInfo = productService.findOne(String.valueOf(productId));
    return ResultVOUtil.success(productInfo);
}

 

这里设置了condition="#productId >= 3 ",所以只有当接口参数productId>=3的时候才会进行缓存

unless: 排除条件,除非… 
因为我们返回的ResultVO 是经过封装的,如果一切正常的话,那么ResultVO 中的code值应该是0,所以可以利用unless来进行判断
@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "#productId", unless="#result.getCode() != 0 ")
public ResultVO findOne(@Param("productId") Integer productId) {
    log.info("Get from database ... " + productId);
    ProductInfo productInfo = productService.findOne(String.valueOf(productId));
    if(productInfo == null) {
        return ResultVOUtil.error(-1, "Null Product");
    }
    return ResultVOUtil.success(productInfo);
}

 

unless="#result.getCode() != 0 "表示,只有当ResultVO 中的code值等于0的时候才缓存。

与condition不同的是,unless表达式是在方法调用之后进行评估的。如果返回false,才放入缓存(与condition相反)。

@CachePut
如果缓存需要更新,则可以使用@CachePut 
@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@PostMapping("/update")
@CachePut(cacheNames = "product", key = "#productForm.productId")
public ResultVO update(@RequestBody ProductForm productForm) {
    ProductInfo productInfo = new ProductInfo();
    BeanUtils.copyProperties(productForm, productInfo);
    productService.save(productInfo);
    return ResultVOUtil.success(productInfo);
}

 

@CacheEvict
@CacheEvict要求指定一个或多个缓存,使之都受影响。此外,还提供了一个额外的参数allEntries 。表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,将忽略指定的key。有的时候我们需要Cache一下清除所有的元素。

@CacheConfig
@CacheConfig是一个类级别的注解,允许共享缓存的名称(CacheName)、KeyGenerator、CacheManager 和CacheResolver。
 


http://lihuaxi.xjx100.cn/news/244526.html

相关文章

一个经典例子让你彻彻底底理解java回调机制

以前不理解什么叫回调&#xff0c;天天听人家说加一个回调方法啥的&#xff0c;心里想我草&#xff0c;什么叫回调方法啊&#xff1f;然后自己就在网上找啊找啊找&#xff0c;找了很多也不是很明白&#xff0c;现在知道了&#xff0c;所谓回调&#xff1a;就是A类中调用B类中的…

微信公众号开发(一)

1.登录开发公众平台 https://mp.weixin.qq.com/ 2.注册填好相关信息登录后 3.设置域名 首先介绍一款在线调试工具https://natapp.cn 注册登录后先购买vip隧道&#xff0c;然后购买二级域名 购买域名 然后下载客户端&#xff0c;使用教程参考https://natapp.cn/article/nata…

Add Digits

题干就是给一个非负整数&#xff0c;把各位数加起来&#xff0c;若超过一位&#xff0c;则继续把各位加起来&#xff0c;直到和是一位数。 example&#xff1a; 39->12->3 坦白说我是看了第三个提示意识到的&#xff0c;所以说要找规律&#xff0c;先要暴力列举。 int ad…

EXTJS之Ext.util.Observable自定义事件

暂时还不会用Ext.mixin.Observable&#xff0c; 催悲的测试了近两个小时。这TMD的语法差距也太大了啊。。 在新版EXTJS里&#xff0c;已去除了addEvents。 弄个出来&#xff0c;大概知道下吧。 ?123456789101112131415161718192021222324252627282930313233343536373839404142…

实例规格 ECS (共享计算型)和 (通用型-原独享)性能上有什么区别? ...

实例规格 ECS (共享计算型)和 (通用型-原独享)性能上有什么区别? 实例规格 共享计算型 和 通用型(原独享), 如果同样是2核4G 或者4核8G ; 性能上有什么差异/差距大吗? 内存型比通用性性能好些&#xff0c;而且CPU和内存配比&#xff1a; 通用型为1&#xff1a;2&…

SpringBoot实现微信点餐

项目介绍 采用前后端分离的方式&#xff0c;前端采用Vue.js&#xff0c;后端采用SpringBoot进行开发

读书笔记:《图解HTTP》第三章 HTTP报文

原文地址博客积累地址 HTTP报文的作用 HTTP报文时是HTTP进行请求和响应时用来交换信息的&#xff0c;可以理解它为搬东西的包裹&#xff0c;来搬运交换的信息报文流 HTTP报文在HTTP应用程序&#xff08;客户端、服务器、代理&#xff09;之间发送数据块&#xff0c;这些数据块以…

匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

0x00 前言 通过上一篇博客《匹夫细说C#&#xff1a;庖丁解牛聊委托&#xff0c;那些编译器藏的和U3D给的》的内容&#xff0c;我们实现了使用委托来构建我们自己的消息系统的过程。但是在日常的开发中&#xff0c;仍然有很多开发者因为这样或那样的原因而选择疏远委托&#xff…