1. 程式人生 > >Spring Boot (24) 使用Spring Cache集成Redis

Spring Boot (24) 使用Spring Cache集成Redis

ng- 否則 好的 編寫 大小 調用 最好 nts 超時時間

Spring 3.1引入了基於註解(annotation)的緩存(cache)技術,它本質不是一個具體的緩存實現方案,而是一個對緩存使用的抽象,通過在既有代碼中添加少量它定義的個助攻annotation,就能夠達到緩存方法的返回對象的效果。

特點

  具備相當好的靈活性,不僅能夠使用SpEL來定義緩存的key和各種condition,還提供開箱即用的緩存臨時存儲方案,也支持和主流的專業緩存例如EHCache、Redis、Guava的集成。

    基於annotation即可使得現有代碼支持緩存

    開箱即用Out-Of-The-Box,不用安裝和部署額外第三方組件即可使用緩存

    支持Spring Express Language,能使用對象的任何屬性或者方法來定義緩存的key和condition

    支持AspectJ,並通過其實現任何方法的緩存支持

    支持自定義key和自定義緩存管理者,具有相當的靈活性和擴展性

使用前後

  使用前:

    我們需要硬編碼,如果切換Cache Client還需要修改代碼,耦合度高,不易於維護

public String get(String key) {
    String value = userMapper.selectById(key);
    if (value != null) {
        cache.put(key,value);
    }
    return value;
}

  使用後:

    基於Spring Cache註解,緩存由開發者自己配置,但不用參與到具體編碼

@Cacheable(value = "user", key = "#key")
public String get(String key) {
    return userMapper.selectById(key);
}

添加依賴

需要添加redis的依賴 同上篇

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

屬性配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/david2018_db?characterEncoding=utf8
    username: root
    password: 1234
  redis:
    host: 10.211.55.5 #redis服務器地址
    timeout: 10000 #超時時間
    database: 0 #0-15 16個庫 默認0
    lettuce:
      pool:
        max-active: 8 #最大連接數
        max-wait: -1 #默認-1 最大連接阻塞等待時間
        max-idle: 8 #最大空閑連接 默認8
        min-idle: 0 #最小空閑連接
  cache:
    type: redis

spring.cache.type 一般來說是根據依賴的包自行裝配,但先後順序會對redis使用有影響,(Jcache->EhCache->Redis->Guava) 最好還是手動配置一下

實體類

public class t_user implements Serializable {
    private Integer id;
    private String username;
    private String password;

    ...
}

mybatisDao

@Mapper
public interface tUserDao {
    @Delete("delete from t_user where id = #{id}")
    int delete(int id);

    @Update("update t_user set username = #{username},password = #{password} where id = #{id}")
    int update(t_user user);

    @Select("select * from t_user where id = #{id}")
    t_user getById(int id);
}

Service

@Service
public class t_userService {

    @Resource
    private tUserDao dao;

    @Cacheable(value="t_user",key="#id")
    public t_user getById(int id) {
        System.out.println("進入查詢方法");
        return dao.getById(id);
    }

    @CacheEvict(value="t_user",key="#id")
    public int delete(Integer id){
        System.out.println("進入刪除方法");
        return dao.delete(id);
    }

    @CachePut(value="t_user",key="#user.id")
    public int update(t_user user) {
        System.out.println("進入修改方法");
        return dao.update(user);
    }
}

Controller

@RequestMapping("/t_user")
@RestController
public class t_userController {
    @Autowired
    private t_userService service;



    @GetMapping("/delete")
    public String delete(int id){
        service.delete(id);
        return "delete";
    }

    @GetMapping("/update")
    public String update(t_user user){
        service.update(user);
        return "update";
    }

    @GetMapping("/getById")
    public String getById(int id){
        return service.getById(id).toString();
    }
}

最後在啟動類中使用@EnableCaching啟動Cache

@EnableCaching
@SpringBootApplication
public class BootApplication{

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

運行測試:http://localhost:8088/t_user/getById?id=1 輸入此路徑後 控制臺只打印一次進入查詢方法 說明緩存了 ,而修改 刪除是回打印 修改了方法 和刪除了的方法的,從而切面去刪掉redis中緩存的數據。其中#代表是一個SpEL表達式。

根據條件操作緩存

  根據條件操作好uancun內容並不影響數據庫操作,條件表達式返回一個布爾值,true/false,當條件為true,則進行緩存操作,否則直接調用方法返回結果。

    長度:@CachePut(value="user",key="#user.id",condition="#user.username.legnth() < 10") 只緩存用戶名長度小於10的數據

    大小:@Cacheable(value="user",key="#id",condition="#id < 10") 只緩存id小於10的數據

    組合:@Cacheable(value="user",key="#user.username.concat(#user.password)")

    提前操作:@CacheEvict(value="user",allEntries=true,beforeInvocation=true)加上beforeInvocation=true後,不管內部是否報錯,緩存都將被清除,默認情況為false。

註解介紹

  @Cacheable(根據方法的請求參數對其結果進行緩存)

    key:緩存的key,可以為空,如果指定要按照SpEL表達式編寫,如果不指定,則缺省按照方法的所有參數進行組合(如:@Cacheable(value="user",key="#username"))

    value:緩存的名稱,在Spring 配置文件中定義,必須指定至少一個(如:@Cacheable(value="user")或者@Cacheable(value={"user1","user2"})

    condition:緩存的條件,可以為空,使用SpEL編寫,返回true或者false,只有為true才進行緩存(如:@Cacheable(value="user",key="#id",condition="#id < 10"))

  @CachePut(根據方法的請求參數對其結果進行緩存,和@Cacheable不同的是,它每次都會觸發真實方法的調用)

  @CacheEvict(根據條件對緩存進行清空)

    allEntries:是否清空所有緩存內容,缺省為false,如果指定為true,則方法調用後將立即清空所有緩存(如:@CacheEvict(value="user",key="#id",allEntries=true))

    beforeInvocation:是否在方法執行前就清空,缺省為false,如果指定為true,則在方法還沒有執行的時候就清空緩存,缺省情況下,如果方法拋出異常,則不會清空緩存(如:@CacheEvict(value="user",key="#id",beforeInvocation))

Spring Boot (24) 使用Spring Cache集成Redis