캐시
우리가 자주가는 데이터베이스에 액세스하는 경우 동시 시스템을 백업의 양이, 그리고 그 압력이 데이터베이스를 계속 증가 할 것입니다 때 데이터베이스 충돌 피크 현상에서도 발생할 수 있습니다. 그래서 일반적으로 우리가 더 이상 데이터베이스에서 쿼리입니다, 그리고 마지막으로 캐시에 추가하고 사용자에게 반환하는 경우가 반환되지 않는 경우는, 쿼리 캐시와 함께 시작됩니다에 와서 데이터베이스, 사용자 액세스이 문제 동시 액세스를 해결하기 위해 캐시를 사용합니다, 물론, 당신은 검색 기능을 제공하기 위해 캐싱을 사용할 수 있습니다.
캐시는, 우리는 일반적으로 로컬 캐싱과 분산 캐시로 나눌 수 있습니다.
우리가 일반적으로 Ehcache를 사용하는 동안 일반적으로 사용되는 로컬 캐시,으로 Ehcache, 구아바 캐시가, 결국, 그는 순수 자바이며, 기능을 확장 할 수있는 우리가 소스 코드를 해결할 수 문제, 또한 자신의 차 개발이있다.
물론 일반적으로 분산 캐싱, 레디 스는 메모리 기반 단일 스레드, 효율이 매우 높은되면, 레디 스입니다.
二, 봄 캐시
난 당신이 프로젝트에 캐시를 통합하려는 경우, 우리는 봄 캐시를 사용합니다 생각, 그것은뿐만 아니라 여러 캐싱 프레임 워크 (으로 Ehcache, jcache 등), 또한 주석의 사용을 기반으로 할 수 있습니다 통합 매우 편리합니다.
: 봄 컨텍스트 지원의 통합 캐싱 프레임 워크
스프링 맥락에서 캐시 주석 :
물론, 아니 레디 스의 봄의 맥락에서 통합,하지만 우리가 봄 - 데이터 - 레디 스를 찾을 수 있습니다.
그러나 우리는 모두 알고, 그것은 봄 또는 봄 부팅 프로젝트에 있는지, 우리는 캐시가 동시에 여러 통합 할 수있는 캐시를 모두 통합 할 수 있습니다.
봄 부팅에서, 우리는 일반적으로 사용 spring.cache.type
사용할 캐시 지정하고 자동 구성을 완료하기 위해 관련 구성 정보를 입력합니다.
CacheType 소스 : 우리가 볼 수있는, 봄 캐싱 프레임 워크의 큰 다양성을 지원합니다.
package org.springframework.boot.autoconfigure.cache;
public enum CacheType {
GENERIC,
JCACHE,
EHCACHE,
HAZELCAST,
INFINISPAN,
COUCHBASE,
REDIS,
CAFFEINE,
SIMPLE,
NONE;
private CacheType() {
}
}
우리가 모두 캐싱 프레임 워크를 통합하는 등의 필요가 그렇다면 예를 들어, 로컬 캐시으로 Ehcache, 분산 캐시 레디 스,
전체가 할 수있는?
당신은 할 수있을 수 있지만,이 봄 멀티 레벨 캐시를 제공하지 않지만, 전체 당신에게 자신을 필요로한다.
三, h2cache - 스프링 부팅 선발
1. h2cache - 스프링 부팅 스타터는 무엇입니까?
마이크로 서비스, 각 서비스는 서비스 사이의 통신에 무, RPC를 통해 갈 필요가 또는 HTTP입니다. 그리고 각 서비스는 서비스 A의 필요성이 테이블 서비스 B 데이터를 얻을 수 있다면, 당신은 HTTP 또는 RPC 통신을 필요 그래서, 및 필요성의 피크가 초당 100 번 호출하는 경우는 것을 의미한다고, 자신의 해당 데이터베이스가 그것은 100 HTTP 통신 또는 RPC, 꽤 많은 시간이 소요 건물 인 인터페이스를 필요로한다.
그럼 어떻게 그것을 해결하기 위해?
그러나 트래픽이 높은 서비스 물론 여전히 로컬 캐시를 필요로,이 시간 우리는 레디 스 같은 분산 캐시를 필요로하므로 서로 다른 서비스는 일반적으로, 위의 다른 컴퓨터에 배포 된 때문, 확실히 로컬 캐시하지 않습니다 . 그래서 마지막으로, 우리는 로컬 캐시뿐만 아니라 분산 캐시뿐만 아니라 필요하지만, 자신을 통합 할 필요가있다, 그래서 봄 부팅, 이러한 멀티 레벨 캐시 기능을 제공하지 않았다.
나는 이미 전체 스프링 부팅 스타터, 소유, 걱정하지 마세요 h2cache-spring-boot-starter
, 우리는 단지 구성 파일에서 해당 정보를 구성 할 필요가, 당신은 멀티 레벨 캐시의 기능을 활성화 할 수 있습니다.
2 시작
의존도를 추가 :
우리는 ~ 내가의 메이븐 중앙 저장소에이 항목을 게시 한 때문에, 신뢰할 수있는 정상 아래에 소개
<denpency>
<groupId>com.github.howinfun</groupId>
<artifactId>h2cache-spring-boot-starter</artifactId>
<version>0.0.1</version>
</denpency>
봄 부팅 속성에서 서비스를 활성화하고 해당 설정을 추가 :
열기 멀티 레벨 캐시 서비스 :
# Enable L2 cache or not
h2cache.enabled=true
구성으로 Ehcache :
# Ehcache Config
## the path of ehcache.xml (We can put it directly under Resources)
h2cache.ehcache.filePath=ehcache.xml
#Set whether the EhCache CacheManager should be shared (as a singleton at the ClassLoader level) or independent (typically local within the application).Default is "false", creating an independent local instance.
h2cache.ehcache.shared=true
구성 레디 스 : 기본 캐시 구성 및 사용자 정의 캐시 구성을 포함
참고 포인트는 다음과 같습니다 h2cache 스프링 부팅 - 스타터 도입하면서 Lettuce
및 Jedis
클라이언트 및 기본값을 사용하여 클라이언트 상추 봄 부팅, 우리는 Jedis 클라이언트를 사용해야 할 경우 그래서, 당신은 상추를 제거 의존 할 필요가있다.
# Redis Config
## default Config (expire)
h2cache.redis.default-config.ttl=200
### Disable caching {@literal null} values.Default is "false"
h2cache.redis.default-config.disable-null-values=true
### Disable using cache key prefixes.Default is "true"
h2cache.redis.default-config.use-prefix=true
## Custom Config list
### cacheName -> @CacheConfig#cacheNames @Cacheable#cacheNames and other comments, etc
h2cache.redis.config-list[0].cache-name=userCache
h2cache.redis.config-list[0].ttl=60
h2cache.redis.config-list[0].use-prefix=true
h2cache.redis.config-list[0].disable-null-values=true
h2cache.redis.config-list[1].cache-name=bookCache
h2cache.redis.config-list[1].ttl=60
h2cache.redis.config-list[1].use-prefix=true
#Redis
spring.redis.host=10.111.0.111
spring.redis.password=
spring.redis.port=6379
spring.redis.database=15
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=30
캐시 주석을 사용하는 방법
언제 까지나 우리처럼 전에 사용하여 Spring Cache
주석이 될 수 있습니다.
예를 들어 :
지속성 계층 코드, 내가 사용은 다음과 같습니다 MyBatis로-PLUS .
package com.hyf.testDemo.redis;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Repository;
/**
* @author Howinfun
* @desc
* @date 2020/3/25
*/
@Repository
// Global cache config,We usually set the cacheName
@CacheConfig(cacheNames = {"userCache"})
public interface UserMapper extends BaseMapper<User> {
/**
* put the data to cache(Ehcache & Redis)
* @param id
* @return
*/
@Cacheable(key = "#id",unless = "#result == null")
User selectById(Long id);
/**
* put the data to cache After method execution
* @param user
* @return
*/
@CachePut(key = "#user.id", condition = "#user.name != null and #user.name != ''")
default User insert0(User user) {
this.insert(user);
return user;
}
/**
* evict the data from cache
* @param id
* @return
*/
@CacheEvict(key = "#id")
int deleteById(Long id);
/**
* Using cache annotations in combination
* @param user
* @return
*/
@Caching(
evict = {@CacheEvict(key = "#user.id", beforeInvocation = true)},
put = {@CachePut(key = "#user.id")}
)
default User updateUser0(User user){
this.updateById(user);
return user;
}
}
테스트 :
질의 : 우리는 데이터에 추가됩니다, 데이터베이스 쿼리 결과에서 그것을 볼 수 Ehcache
와 Redis
캐시, 모든 것 다음의 문의 개시 후 Ehcache
또는 Redis
쿼리한다.
2020-04-03 09:55:09.691 INFO 5920 --- [nio-8080-exec-7] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-04-03 09:55:10.044 INFO 5920 --- [nio-8080-exec-7] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-04-03 09:55:10.051 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById : ==> Preparing: SELECT id,create_time,update_time,read_frequency,version,book_name FROM book WHERE id=?
2020-04-03 09:55:10.068 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById : ==> Parameters: 51(Long)
2020-04-03 09:55:10.107 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById : <== Total: 1
2020-04-03 09:55:10.113 INFO 5920 --- [nio-8080-exec-7] c.hyf.cache.cachetemplate.H2CacheCache : insert into ehcache,key:51,value:Book2(id=51, bookName=微服务架构, readFrequency=1, createTime=2020-03-20T16:10:13, updateTime=2020-03-27T09:14:44, version=1)
2020-04-03 09:55:10.118 INFO 5920 --- [nio-8080-exec-7] c.hyf.cache.cachetemplate.H2CacheCache : insert into redis,key:51,value:Book2(id=51, bookName=微服务架构, readFrequency=1, createTime=2020-03-20T16:10:13, updateTime=2020-03-27T09:14:44, version=1)
2020-04-03 09:55:31.864 INFO 5920 --- [nio-8080-exec-2] c.hyf.cache.cachetemplate.H2CacheCache : select from ehcache,key:51
삭제 : 데이터베이스에서 데이터를 삭제하면이 삭제됩니다 Ehcache
및 Redis
해당 캐시 데이터.
2020-04-03 10:05:18.704 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById : ==> Preparing: DELETE FROM book WHERE id=?
2020-04-03 10:05:18.704 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById : ==> Parameters: 51(Long)
2020-04-03 10:05:18.731 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById : <== Updates: 1
2020-04-03 10:05:18.732 INFO 5920 --- [nio-8080-exec-3] c.hyf.cache.cachetemplate.H2CacheCache : delete from ehcache,key:51
2020-04-03 10:05:18.844 INFO 5920 --- [nio-8080-exec-3] c.hyf.cache.cachetemplate.H2CacheCache : delete from redis,key:51
다른 사람은 보여주지 않는다 ...
넷째, 마지막으로
당신이 가서 소스 코드가 봄 캐시 멀티 레벨 캐시를 기반으로하는 방법을 볼 수 있습니다 당신이있는 거 관심이 있다면 물론,이 스타터 ~, 매우 간단합니다