Spring Boot緩存實戰 Caffeine

Caffeine和Spring Boot集成

Caffeine是使用Java8對Guava緩存的重寫版本,在Spring Boot 2.0中將取代Guava。若是出現Caffeine,CaffeineCacheManager將會自動配置。使用spring.cache.cache-names屬性能夠在啓動時建立緩存,並能夠經過如下配置進行自定義(按順序):html

  • spring.cache.caffeine.spec: 定義的特殊緩存
  • com.github.benmanes.caffeine.cache.CaffeineSpec: bean定義
  • com.github.benmanes.caffeine.cache.Caffeine: bean定義

例如,如下配置建立一個foo和bar緩存,最大數量爲500,存活時間爲10分鐘:java

spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

除此以外,若是定義了com.github.benmanes.caffeine.cache.CacheLoader,它會自動關聯到CaffeineCacheManager。因爲該CacheLoader將關聯被該緩存管理器管理的全部緩存,因此它必須定義爲CacheLoader<Object, Object>,自動配置將忽略全部泛型類型。git

引入依賴

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
	<groupId>com.github.ben-manes.caffeine</groupId>
	<artifactId>caffeine</artifactId>
	<version>2.6.0</version>
</dependency>

開啓緩存的支持

使用@EnableCaching註解讓Spring Boot開啓對緩存的支持github

@SpringBootApplication
@EnableCaching// 開啓緩存,須要顯示的指定
public class SpringBootStudentCacheCaffeineApplication {

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

配置文件

新增對緩存的特殊配置,如最大容量、過時時間等spring

spring.cache.cache-names=people
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s

若是使用了refreshAfterWrite配置還必須指定一個CacheLoader,如:數據庫

/**
 * 必需要指定這個Bean,refreshAfterWrite=5s這個配置屬性才生效
 *
 * @return
 */
@Bean
public CacheLoader<Object, Object> cacheLoader() {

    CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() {

        @Override
        public Object load(Object key) throws Exception {
            return null;
        }

        // 重寫這個方法將oldValue值返回回去,進而刷新緩存
        @Override
        public Object reload(Object key, Object oldValue) throws Exception {
            return oldValue;
        }
    };

    return cacheLoader;
}

Caffeine配置說明:

  • initialCapacity=[integer]: 初始的緩存空間大小
  • maximumSize=[long]: 緩存的最大條數
  • maximumWeight=[long]: 緩存的最大權重
  • expireAfterAccess=[duration]: 最後一次寫入或訪問後通過固定時間過時
  • expireAfterWrite=[duration]: 最後一次寫入後通過固定時間過時
  • refreshAfterWrite=[duration]: 建立緩存或者最近一次更新緩存後通過固定的時間間隔,刷新緩存
  • weakKeys: 打開key的弱引用
  • weakValues:打開value的弱引用
  • softValues:打開value的軟引用
  • recordStats:開發統計功能

注意:

  • expireAfterWrite和expireAfterAccess同事存在時,以expireAfterWrite爲準。
  • maximumSize和maximumWeight不能夠同時使用
  • weakValues和softValues不能夠同時使用

示例代碼

/**
 * @author yuhao.wang
 */
@Service
public class PersonServiceImpl implements PersonService {
    private static final Logger logger = LoggerFactory.getLogger(PersonServiceImpl.class);

    @Autowired
    PersonRepository personRepository;

    @Override
    @CachePut(value = "people", key = "#person.id")
    public Person save(Person person) {
        Person p = personRepository.save(person);
        logger.info("爲id、key爲:" + p.getId() + "數據作了緩存");
        return p;
    }

    @Override
    @CacheEvict(value = "people")//2
    public void remove(Long id) {
        logger.info("刪除了id、key爲" + id + "的數據緩存");
        //這裏不作實際刪除操做
    }

    /**
     * Cacheable
     * value:緩存key的前綴。
     * key:緩存key的後綴。
     * sync:設置若是緩存過時是否是隻放一個請求去請求數據庫,其餘請求阻塞,默認是false。
     */
    @Override
    @Cacheable(value = "people", key = "#person.id", sync = true)
    public Person findOne(Person person, String a, String[] b, List<Long> c) {
        Person p = personRepository.findOne(person.getId());
        logger.info("爲id、key爲:" + p.getId() + "數據作了緩存");
        return p;
    }

    @Override
    @Cacheable(value = "people1")//3
    public Person findOne1() {
        Person p = personRepository.findOne(2L);
        logger.info("爲id、key爲:" + p.getId() + "數據作了緩存");
        return p;
    }

    @Override
    @Cacheable(value = "people2")//3
    public Person findOne2(Person person) {
        Person p = personRepository.findOne(person.getId());
        logger.info("爲id、key爲:" + p.getId() + "數據作了緩存");
        return p;
    }
}

參考:緩存

源碼: https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

spring-boot-student-cache-caffeine 工程

爲監控而生的多級緩存框架 layering-cache這是我開源的一個多級緩存框架的實現,若是有興趣能夠看一下

相關文章
相關標籤/搜索