Spring Boot 통합 Redis 의 전체 절차
22134 단어 springboot통합redis
실제 개발 에서 캐 시 처 리 는 필수 입 니 다.클 라 이언 트 가 매번 서버 를 요청 할 수 없습니다.서버 는 매번 데이터베이스 에서 찾 아야 합 니 다.왜 캐 시 를 사용 합 니까?결국 시스템 의 운행 속 도 를 높이 기 위해 서다.사용자 가 자주 방문 하 는 내용 을 사용자 와 가장 가 까 운 곳 에 저장 하고 방문 속도 가 가장 빠 른 곳 에 저장 하여 사용자 의 응답 속 도 를 향상 시 킵 니 다.오늘 은 springboot 에서 redis 를 통합 하 는 상세 한 절 차 를 말씀 드 리 겠 습 니 다.
1.Spring Boot 의 Redis 지원
Spring 의 Redis 지원 은 Spring Data Redis 를 사용 하여 이 루어 집 니 다.일반적으로 Jedis 나 lettuce(기본 값)를 사용 합 니 다.Java 클 라 이언 트 는 org.spring from work.boot.autoconfigure.data.redis(Spring Boot 2.x)에서 redis 의 자동 설정 AutoConfigure DataRedis
RedisAutoConfiguration 은 RedisTemplate 와 StringRedisTemplate(키 값 만 문자 형 데이터)템 플 릿 을 제공 합 니 다.그 중에서 주 해 는@Conditional OnMissingBean 이 관건 입 니 다.이 Bean 이 Spring 에 이미 존재 한다 면 무시 하고 존재 하지 않 는 다 면 이 곳 에 등록 하여 Spring 에서 관리 할 수 있 습 니 다.즉,우 리 는 이 bean 을 다시 쓸 수 있 습 니 다.자신의 RedisTemplate 와 StringRedisTemplate 를 실현 하려 면 사실 다시 써 야 합 니 다.이 유 는 다음 과 같 습 니 다.
4.567917.우리 가 필요 로 하 는 직렬 화 를 실현 하지 못 했다
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
실전1.의존 도 추가
1)spring-boot-starter-cache 의존,캐 시 관리 가 필요 합 니 다.
<!-- Spring Boot Cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2)spring-boot-starter-data-redis 의존(주:spring boot 2.x 는 data 에서)이 필요 합 니 다.redis 지원:주로 Jedis 클 라 이언 트 를 위주 로 하고 기본 lettuce 를 클 라 이언 트 로 하 는 의존 도 를 제외 합 니 다.
<!-- Redis Cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- lettuce , jedis -->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
3)jedis-client 의존 이 필요 합 니 다(주:Redis Client 3 버 전 이상 은 spring-boot-starter-data-redis 와 충돌 할 수 있 습 니 다.2.9.x 를 사용 하 는 것 이 좋 습 니 다).jedis 를 클 라 이언 트 로 사용 하 는 것 이 좋 습 니 다.
<!-- Redis Client 3 spring-boot-starter-data-redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2,redis 설정RedisConfig 설정 클래스 를 만 들 고@Configuration 주 해 를 추가 하 며 캐 시 관리 지원(주석 추가@EnableCashing)을 열 고 CachingConfigurer Support 를 계승 하여 키 생 성 정책 을 다시 작성 합 니 다.
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
/**
* key : + + key
* @return
*/
@Bean
@Override
public KeyGenerator keyGenerator() {
return (Object target, Method method, Object... params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
}
이후 사용 한 application.yml 프로필 중 jedis 를 클 라 이언 트 로 선 택 했 습 니 다.
# redis
redis:
port: 6379
# Redis ( )
password:
host: xxx.xxx.xxx.xxx
database: 0
jedis:
pool:
# ( )
max-active: 300
#
max-idle: 100
# ( )
max-wait: 10000
# ( )
timeout: 5000
설정 속성 을 동시에 읽 고 JedisPoolConfig 를 주입 합 니 다.
/**
* redis
*/
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.database}")
private int database;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.max-wait}")
private long maxWaitMillis;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
/**
* JedisPoolConfig
* @return
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
log.info(" JedisPoolConfig");
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
jedisPoolConfig.setMaxIdle(maxIdle);
return jedisPoolConfig;
}
3.직렬 화 실현RedisTemplate 나 StringRedisTemplate 를 정렬 하 는 동시에 등록 Bean 을 다시 씁 니 다.
RedisTemplate 는 기본적으로 JdkSerializationRedisSerializer 를 사용 하고,StringRedisTmeplate 는 기본적으로 StringRedisSerializer 를 사용 합 니 다.하지만 모두 실제 요구 에 부합 되 지 않 는 다.
/**
* RedisTemplate:
* @param redisConnectionFactory
* @return
*/
@Bean
@SuppressWarnings({"rawtype", "unchecked"})
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
//
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// final
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
log.info("objectMapper: {}", om);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key String
template.setKeySerializer(stringRedisSerializer);
// hash key String
template.setHashKeySerializer(stringRedisSerializer);
// value jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash value jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
template.setEnableTransactionSupport(true);
return template;
}
/**
* StringRedisTmeplate: String
* @param redisConnectionFactory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key String
template.setKeySerializer(stringRedisSerializer);
// hash key String
template.setHashKeySerializer(stringRedisSerializer);
// value jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash value jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
4.Redis 연결 공장 을 설립 하고 Bean 등록Spring Boot 1.x 와 Spring Boot 2.x 의 차 이 를 주의 하 십시오.코드 에 설명 되 어 있 으 며,Spring Boot 1.x 는 JedisConnection Factory 를 사용 하고 있 습 니 다.Spring Boot 2.x 는 RedisStandalone Configuration 을 사용 한 후 JedisConnection Factory 에 전송 하여 Bean 으로 돌아 갑 니 다.
/**
* RedisConnectionFactory
* @return
*/
@Bean
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
log.info(" JedisConnectionFactory");
/* Spring Boot 1.x , RedisStandaloneConfiguration
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setDatabase(database);*/
// JedisConnectionFactory hsot、database、password
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setDatabase(database);
// JedisConnectionFactory jedisPoolConfig
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jedisPoolConfigBuilder =
(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder)JedisClientConfiguration.builder();
jedisPoolConfigBuilder.poolConfig(jedisPoolConfig);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
5.완전한 RedisConfig 설정 클래스
/**
*
* @author jian
* @date 2019/4/14
* @description
* 1) RedisTemplate( StringRedisTemplate) , ( , <Object, Object> )
* RedisTemplate StringRedisTemplate)
* 2) RedisCacheManager
*
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
private static final Logger log = LoggerFactory.getLogger(RedisConfig.class);
/**
* redis
*/
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.database}")
private int database;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.max-wait}")
private long maxWaitMillis;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
/**
* JedisPoolConfig
* @return
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
log.info(" JedisPoolConfig");
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
jedisPoolConfig.setMaxIdle(maxIdle);
return jedisPoolConfig;
}
/**
* RedisConnectionFactory
* @return
*/
@Bean
public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
log.info(" JedisConnectionFactory");
/* Spring Boot 1.x , RedisStandaloneConfiguration
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setDatabase(database);*/
// JedisConnectionFactory hsot、database、password
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setDatabase(database);
// JedisConnectionFactory jedisPoolConfig
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jedisPoolConfigBuilder =
(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder)JedisClientConfiguration.builder();
jedisPoolConfigBuilder.poolConfig(jedisPoolConfig);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
/**
* RedisCacheManager
* @param connectionFactory
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheManager redisCacheManager = RedisCacheManager.create(connectionFactory);
return redisCacheManager;
}
/**
* key : + + key
* @return
*/
@Bean
@Override
public KeyGenerator keyGenerator() {
return (Object target, Method method, Object... params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
/**
* RedisTemplate:
* @param redisConnectionFactory
* @return
*/
@Bean
@SuppressWarnings({"rawtype", "unchecked"})
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
//
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// final
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
log.info("objectMapper: {}", om);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key String
template.setKeySerializer(stringRedisSerializer);
// hash key String
template.setHashKeySerializer(stringRedisSerializer);
// value jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash value jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
template.setEnableTransactionSupport(true);
return template;
}
/**
* StringRedisTmeplate: String
* @param redisConnectionFactory
* @return
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key String
template.setKeySerializer(stringRedisSerializer);
// hash key String
template.setHashKeySerializer(stringRedisSerializer);
// value jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash value jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
테스트1.redis 도구 류 작성
RedisTemplate 와 StringRedisTemplate 템 플 릿 은 주요 데이터 접근 방법 을 제공 하지만:
Object result = null;
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
result = operations.get(key);
그러나 패 키 징 후 클 라 이언 트 사용자 에 비해 비교적 명확 하 다.
/**
*
*
* @param key
* @return
*/
public Object get(final String key) {
Object result = null;
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
}
완전한 간단 한 도구 클래스 는 다음 과 같 습 니 다.
@Component
public class RedisUtils {
@Autowired
private RedisTemplate redisTemplate;
/**
* value
*
* @param keys
*/
public void remove(final String... keys) {
for (String key : keys) {
remove(key);
}
}
/**
* key
*
* @param pattern
*/
public void removePattern(final String pattern) {
Set<Serializable> keys = redisTemplate.keys(pattern);
if (keys.size() > 0) {
redisTemplate.delete(keys);
}
}
/**
* value
*
* @param key
*/
public void remove(final String key) {
if (exists(key)) {
redisTemplate.delete(key);
}
}
/**
* value
*
* @param key
* @return
*/
public boolean exists(final String key) {
return redisTemplate.hasKey(key);
}
/**
*
*
* @param key
* @return
*/
public Object get(final String key) {
Object result = null;
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
}
/**
*
*
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value) {
boolean result = false;
try {
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
*
*
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value, Long expireTime) {
boolean result = false;
try {
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
2.Person 실체 류주의해 야 할 것 은 반드시 직렬 화 를 실현 하고 직렬 화 된 버 전 ID 가 있어 야 한 다 는 것 이다.
public class Person implements Serializable {
private final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
private String gender;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
3.테스트 클래스 작성Redis 도구 류 Spring 은 이미 관리(@Compent 주석 추가)를 했 습 니 다.사용 은 간단 합 니 다.RedisUtils 만 주입 하면 됩 니 다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
private RedisUtils redisUtils;
@Test
public void test(){
Person person = new Person();
person.setAge(23);
person.setId("001");
person.setName("Zhangsan");
redisUtils.set("person-001", person);
System.out.println(redisUtils.get("person-001"));
}
}
4.테스트 결과IDE 콘 솔 에서:
클 라 이언 트 로그 인 후 value 값 보기
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.