zoukankan      html  css  js  c++  java
  • springboot Redis 缓存

    1,先整合 redis 和 mybatis

    步骤一: springboot 整合 redis
    步骤二: springboot 整合 mybatis

    2,启动类添加 @EnableCaching 注解,开启缓存

      因为缓存获取不到数据要到数据库获取,所以还要扫描 mybatis 接口路径

    @SpringBootApplication
    @MapperScan("com.test.Idao")
    @EnableCaching
    public class StringbootRedisCacheApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(StringbootRedisCacheApplication.class, args);
        }
    }

    3,增(获取)、删、改缓存注解

    @Cacheable 获取缓存 ---- 该注解用于方法上,方法不一定执行

      @Cacheable(cacheNames = "user", key="#id"),在 redsi 中 key 是 cacheNames 和 key 拼接而成,如果 id 为 1 ,具体的 key 为:user::1

        cacheNames 随意指定,key 只能是来自于当前方法的参数

      会根据 key 先到 redis 获取数据,如果没获取到,就运行方法到数据库取得数据并放入 redis,下次调用该方法就不会到数据库了

    @CachePut 更新缓存 ---- 该注解用于方法上,方法每次都会执行

      配置和 @Cacheable 一致

      先到数据库修改数据,再根据 key 到 redis 中查询,如果有数据就更新,如果没有就添加,值是方法的返回值

    @CacheEvict 删除缓存 ---- 该注解用于方法上,方法每次都会执行

      配置和 @Cacheable 一致

      根据 key 到 redis 中查询,如果有数据就删除

    @CacheConfig ---- 该注解用于类上,用于简化上面 3 个配置,可以一次性定义 cacheNames ,方法上配置别的属性即可

    示例

    // key 只能是 id,因为参数是 id
    @Cacheable(cacheNames="user", key="#id")
    public User getUserById(int id){}
    
    // 如果参数是对象,key 可以是参数的任意属性名
    @CachePut(cacheNames="user", key="#user.id")
    public User updateUserById(User user){}
    
    // 如果参数是基本类型,可以不配置 key,默认就是该参数作为 key
    @CacheEvict(cacheNames="user")
    public User deleteUserById(int id){}
    
    // CacheConfig 配置了 cacheNames="user",所有方法的cacheNames都是 user
    @CacheConfig(cacheNames="user")
    public class UserService{
      @Cacheable
      public User getUserById(int id){}
      @CachePut(key="#user.id")
       public User updateUserById(User user){}
    }

    坑:

    1,如果 key 不是唯一的(比如用户表中的 name 字段作为缓存的 key ),结果就会在缓存中一个 key 查出一个 list ,这是修改要特别注意因为 @CacheEvict 注解会把该方法的返回值作为 value 覆盖原来的 value,我有个这样的需求,我的解决办法是:修改方法不做缓存操作,方法执行完后调用一个方法来清除原来的缓存,这样能解决数据的准确性,但是每当修改后要再查询数据的话就需要把 mysql 数据放入 redis

    2,在 pojo 类上不能使用 @Repository 注解,建议使用 @Component

    3,各个缓存方法只能在外部调用才会生效(比如在 service 层定义,在 controller 层调用)

  • 相关阅读:
    JasperReport
    Linux
    Linux
    Linux
    Linux
    Groovy
    Linux
    VS
    Aliyun
    Linux
  • 原文地址:https://www.cnblogs.com/huanggy/p/9473822.html
Copyright © 2011-2022 走看看