zoukankan      html  css  js  c++  java
  • SpringBoot使用简单缓存

    第一步开启缓存(只要是springboot项目就可以)  数据库连接等相关配置请读者自行实现。

    在Application启动类上添加注解 @EnableCaching 开启缓存

    @SpringBootApplication
    @EnableCaching
    public class SpringCacheApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCacheApplication.class, args);
        }
    
    }

    在Service 或者Controller中使用缓存  在方法上使 @Cacheable 使用缓存,使用缓存必须要定义缓存组件的名字

      也就是设置cacheNames 可以有多个

    @Controller
    public class UserController {
        @Autowired
        UserService userService;
    
        private Logger logger = LoggerFactory.getLogger(UserController.class);
    
        @RequestMapping("/getUser/{id}")
        @ResponseBody
        @Cacheable(cacheNames = {"temp"})  //@Cacheable(cacheNames = {"temp"},key = "")
        public User getUser(@PathVariable("id") int id){
            logger.info("进入方法getUser方法并访问数据库,没有缓存");
            User userById = userService.getUserById(id);
            return userById;
        }
    }

    第一次访问getUser/1  的时候是没有缓存的,控制台会打印一条info日志

    第二次访问的时候,就会通过缓存去查询数据,不会打印该日志

    可以通过日志打印方式查看缓存是否生效

    下面介绍缓存其他的知识:

      JSR-107 缓存规范
        Java Caching 定义了5个核心接口:
      CachingProvider :定义了创建,配置,获取,管理和控制多个CacheManager,一个应用可以在运行期访问多个CachingProvider
      CacheManager :定义了创建,配置,获取,管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中,一个CacheManager仅被一个CachingProvider所拥有
      Cache:是一个类似Map的数据结构并临时存储以Key为索引的值,一个Cache仅被一个CacheManager所拥有
      Entry:是一个存储在Cache中的Key-Value对
      Expiry:每一个存储在Cache中的条目有一个定义的有效期,一旦超过,这个有效期,条目为过期状态,过期则不可访问,更新和删除,缓存的有效期可以通过ExpiryPolicy设置

      使用JSR-107需要导入 javax.cache依赖 (cache-api)

    Spring缓存抽象

      底层与是JSR-107  

      从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术并支持JCache(JSR-107)注解简化开发  

      提供了各种缓存实现如:RedisCache , EhCacheCache , ConcurrentMapCache等

      每次调用需要缓存功能的方法时,Spring会检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户,下次调用直接从缓存中获取

      注意:
        1.确定方法需要被缓存以及他们的缓存策略
        2.从缓存中读取之前缓存存储的数据


      重要的接口和缓存注解
        Cache:缓存接口,定义缓存操作
    CacheManager:缓存管理器,管理各种缓存组件
    @Cacheable:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
    @CacheEvict:清空缓存
    @CachePut:保证方法被调用,又希望结果被缓存,更新缓存
    @EnableCaching:开启基于注解的缓存
    keyGennerator:缓存数据时key生成策略
    serialize:缓存数据时value序列化策略


      @Cacheable
        属性:
          cacheNames/value:缓存组件名称
          key:缓存数据时使用的key 默认使用方法参数的值,可以通过编写SpEL表达式制定
            SpEL可以使用的值:
            前面请添加#root. 如#root.method
            methodName:当前被调用的方法名
            method:当前被调用的方法
            target:当前被调用的目标对象
            targetClass:当前被调用的目标对象类
            args:当前被调用的方法的参数列表
            caches:当前方法调用使用的缓存列表
            argument name:方法参数的名字 可以直接使用 #参数名 或#0(下标方式)
            result:方法执行的返回值

        keyGenerator:key的生成器 和key二选一

        cacheManager:指定缓存管理器
        cacheResolver:缓存解析器 和cacheManager 二选一
        condition:指定符合条件的情况下才缓存
        unless:不符合条件缓存,可以获取结果进行判断
        sync:缓存是否使用异步

    如果没有指定缓存如redis等 缓存是存在concurrentHashMap中的

    知识点来自于bilibili视频  地址:https://www.bilibili.com/video/av56568003?p=4

  • 相关阅读:
    图解AVL树
    浅析Java7中的ConcurrentHashMap
    浅析CopyOnWriteArrayList
    浅析CAS与AtomicInteger原子类
    IDEA左侧不以树形结构展示项目结构
    maven常见问题
    Mybatis实现多表联合查询
    Mybatis实现单表增删改查操作
    解决mybaits配置错误:Cause: org.xml.sax.SAXParseException; lineNumber: 17; columnNumber: 119; 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
    Deepin_运维实践系列博客导航
  • 原文地址:https://www.cnblogs.com/linux0kk/p/12175971.html
Copyright © 2011-2022 走看看