© 2011-2014 The original authors.

이 문서의 복사본은 당신 자신을 위해서나, 다른 사람들에게 배포를 위해 만들어질 수 있습니다. 복사에 대해 어떤 비용을 청구하지 않아야 하며, 프린트되거나 전자적으로 배포될 때에도 Copyright 문구를 포함해야 합니다.

서문

스프링 데이터 레디스 프로젝트는 스프링 개념을 키밸류 스타일의 데이터 저장소를 사용하는 개발솔루션에 적용한 것입니다. 우리는 메시지를 송수신하는 데 있어 "template"을 높은레벨 추상화로 제공을 합니다. 당신은 스프링 프레임워크에서의 JDBC 지원과 유사함을 눈치챌 것입니다
The Spring Data Redis project applies core Spring concepts to the development of solutions using a key-value style data store. We provide a "template" as a high-level abstraction for sending and receiving messages. You will notice similarities to the JDBC support in the Spring Framework.

새로운 특징

1. 스프링 데이터 레디스 1.5 에서의 새로운 점

  • Redis HyperLogLog 명령어 PFADD, PFCOUNT and PFMERGE에 대한 지원 추가

  • RedisSerializers에 기반한 Jackson 을 찾는 설정가능한 JavaType (역주: 이상하게 쪼금 까다롭군?;; 흠흠; )

  • 레디스 센티널에 접속하기 위한 PropertySource 기반 설정 (보기 : Redis Sentinel Support).

  • Add support for Redis HyperLogLog commands PFADD, PFCOUNT and PFMERGE.

  • Configurable JavaType lookup for Jackson based RedisSerializers.

  • PropertySource based configuration for connecting to Redis Sentinel (see: Redis Sentinel Support).

소개

이 문서는 스프링 데이터 레디스 (SDR)지원을 위한 레퍼런스 가이드 입니다. 키밸류 모듈 개념과 용어, 다양한 저장소 네임스페이스를 위한 문법을 설명합니다.

키밸류 저장소나 스프링, 스프링데이터 예제를 위한 소개를 위해서는 시작해보기를 참고해주세요 - 이 문서는 오직 스프링 데이터 레디스 지원을 참조하며, 사용자가 이미 키밸류 저장소와 스프링의 개념에 익숙하다고 가정합니다.

This document is the reference guide for Spring Data Redis (SDR) Support. It explains Key Value module concepts and semantics and the syntax for various stores namespaces.

For an introduction to key value stores or Spring, or Spring Data examples, please refer to Getting Started - this documentation refers only to Spring Data Redis Support and assumes the user is familiar with the key value storages and Spring concepts.

2. 왜 스프링 데이터 레디스 인가 ?

스프링 프레임워크는 선도적인 풀스택 Java/JEE 어플리케이션 프레임워크 입니다. 이것은 경량화 콘테이너를 제공하며, AOP, DI와 간편한 서비스 추상화의 사용으로, 비침투적인 프로그래밍 모델을 제공합니다.

NoSQL 저장소는 수평적 scalability 와 속도를 위해 고전적인 RDBMS의 대안을 제공하고 있습니다. 구현체에 관해서라면 키밸류 저장소는 NOSQL 영역에서 하나의 커다란 (그리고 오래된) 부분을 차지합니다 .

스프링 데이터 레디스(SDR) 프레임워크는 불필요한 작업과 저장소와 상호작용하는 보일러플레이트한 코드를 제거함으로써 ,레디스 키밸류 저장소를 사용하는 스프링 애플리케이션을 쉽게 만들게 해줍니다.

The Spring Framework is the leading full-stack Java/JEE application framework. It provides a lightweight container and a non-invasive programming model enabled by the use of dependency injection, AOP, and portable service abstractions.

NoSQL storages provide an alternative to classical RDBMS for horizontal scalability and speed. In terms of implementation, Key Value stores represent one of the largest (and oldest) members in the NoSQL space.

The Spring Data Redis (or SDR) framework makes it easy to write Spring applications that use the Redis key value store by eliminating the redundant tasks and boiler plate code required for interacting with the store through Spring’s excellent infrastructure support.

3. 요구사항

스프링 데이서 레디스 1.2.x 바이너리는 JDK 6.0 이상을 필요로 하며 스프링 프레임워크 3.2.8 이상을 필요로 합니다 .

키밸류 저장소의 면에서 Redis 2.6.x 나 그 이상이 필요하며 스프링 데이터 레디스는 현재 2.6과 2.8 버젼에 대하여 테스트 되었습니다.

Spring Data Redis 1.2.x binaries requires JDK level 6.0 and above, and Spring Framework 3.2.8 and above.

In terms of key value stores, Redis 2.6.x or higher is required. Spring Data Redis is currently tested against the latest 2.6 and 2.8 releases.

4. 시작해보기

새로운 프레임워크를 배우는 것은 언제나 간단하진 않습니다. 이 섹션에서 우리 (스프링데이터팀)는 (우리가 생각하기에 따라가기에) 쉬운 스프링 레디스 모듈을 시작하는 가이드를 제공하고자 합니다. 물론 가능하다면, 당신에게 맞는 당신의 학습 경로를 따라가는 데는 자유롭게 생각하셔도 됩니다. 다른 사람들 도울 수 있는 어떤 더 나은 이 문서에 대한 더 나은 방법이 있다면 알려주세요 :)

Learning a new framework is not always straight forward. In this section, we (the Spring Data team) tried to provide, what we think is, an easy to follow guide for starting with the Spring Data Redis module. Of course, feel free to create your own learning 'path' as you see fit and, if possible, please report back any improvements to the documentation that can help others.

4.1. 첫번째 단계

우리가 왜 스프링데이터레디스 인가?,에서 설명한 대로 스프링데이터레디스 (SDR) 는 스프링 프레임워크와 레디스 키/값 저장소 간의 통합을 제공합니다. 그러므로 양쪽 프레임워크를 알고 있는 일은 매우 중요하다고 할 수 있습니다. 이 SDR 문서를 도처에는, 각각의 섹션들이 관련된 링크를 제공하지만 미리 이런 주제들에 대해 익숙한 것이 제일 최선일 것입니다.

As explained in Why Spring Data Redis?, Spring Data Redis (SDR) provides integration between Spring framework and the Redis key value store. Thus, it is important to become acquainted with both of these frameworks (storages or environments depending on how you want to name them). Throughout the SDR documentation, each section provides links to resources relevant however, it is best to become familiar with these topics beforehand.

4.1.1. 스프링 알기

스프링 데이터는 스프링프레임워크의 핵심core 기능들을 톡톡히 사용합니다(^^;). IoC 컨테이너, 자원resource 추상화나 AOP 인프라구조같은 것들 말이죠.. 말 나온 김에, 스프링 데이터 레디스얘기를 해보도록 해보도록 하겠습니다.(의역). 이외에도 스프링 프레임워크를 매우 이해하기 쉬운 (때때로 멋진) 문서도 많고 많은 블로그 글들에 책도 도처에 있지요. 스프링 가이드 home page 를 보시면 더 많은 정보가 있구요 일반적으로 여기서는 SDR(스프링 데이터 레디스)를 시도해보고 싶은 개발자들을 위한 시작 지점이 되겠습니다.

Spring Data uses heavily Spring framework’s core functionality, such as the IoC container, resource abstract or AOP infrastructure. While it is not important to know the Spring APIs, understanding the concepts behind them is. At a minimum, the idea behind IoC should be familiar. That being said, the more knowledge one has about the Spring, the faster she will pick up Spring Data Redis. Besides the very comprehensive (and sometimes disarming) documentation that explains in detail the Spring Framework, there are a lot of articles, blog entries and books on the matter - take a look at the Spring Guides home page for more information. In general, this should be the starting point for developers wanting to try Spring DR.

4.1.2. NOSQL과 키밸류 저장소 알기
4.1.2. Knowing NoSQL and Key Value stores

NOSQL 저장소는 저장소 세계를 점령했습니다. 어마어마한 영역에 솔루션, 용어와 패턴과 의미(더 상황을 악화시키는 것은 여러 의미를 가진 의미)의 과잉이 일어나고 있습니다. 반면 몇몇 원칙들은 공통적입니다. 사용자가 어느 정도의 SDR에 의해 제공되는 저장소에 대해 친숙해야 한다는 것은 중요합니다. 이러한 솔루션들에 친숙해지는 가장 최고의 방법은 그것들의 문서를 읽고 예제를 따라해보는 것입니다. 보통 5-10분 이상이 걸리지 않고, 당신이 RDMBS에만 친숙하다면 이러한 일들을 몇번 더 해서 친숙해져야 할 것입니다.

NoSQL stores have taken the storage world by storm. It is a vast domain with a plethora of solutions, terms and patterns (to make things worse even the term itself has multiple meanings). While some of the principles are common, it is crucial that the user is familiar to some degree with the stores supported by SDR. The best way to get acquainted with these solutions is to read their documentation and follow their examples - it usually doesn’t take more then 5-10 minutes to go through them and if you are coming from an RDMBS-only background many times these exercises can be an eye opener.

4.1.3. 예제 시도해보기

제공된 예제소스 같은 곳(http://github.com/spring-projects/spring-data-keyvalue-examples)에서 키밸류 저장소를 위한 다양한 예제들을 발견할 수 있을 것입니다. SDR을 위해서 흥미로운 것은 retwisj 예제입니다. 이것은 로컬이나 클라우드로 디플로이되면서, 레디스에서 빌드되는 트위터 클론입니다. 이 문서를 보시고 다음 블로그 아티클이나 live instance에서 더 많은 정보를 읽어보세요 ^^

One can find various samples for key value stores in the dedicated example repo, at http://github.com/spring-projects/spring-data-keyvalue-examples. For Spring Data Redis, of interest is the retwisj sample, a Twitter-clone built on top of Redis which can be run locally or be deployed into the cloud. See its documentation, the following blog entry or the live instance for more information.

4.2.도움이 필요한가요?

만약 당신이 문제에 직면하거나, 조언을 필요로 한다면 다음 링크를 마음껏 사용해보세요 :

If you encounter issues or you are just looking for advice, feel free to use one of the links below:

4.2.1. 커뮤니티 지원

Stackoverflow에서 스프링 데이터 태그 메시지 보드를 보시고 (레디스에 관한 것은 아닙니다 ) 스프링 데이터 유저들과 정보를 공유하고 서로 도움을 받아보세요. 글쓰기를 위해서는 회원등록이 필요로 할 것입니다.

The Spring Data tag on Stackoverflow is a message board for all Spring Data (not just Redis) users to share information and help each other. Note that registration is needed only for posting.

4.2.2. 전문가 지원

전문적으로는 책임 기간을 가지고 Pivotal Software, Inc.에서 소스 지원부터 가능합니다. 이 회사는 스프링 데이터와 스프링를 지원하는 회사입니다.

Professional, from-the-source support, with guaranteed response time, is available from Pivotal Software, Inc., the company behind Spring Data and Spring.

4.3. 개발 따라가기(역주: 소스 코드 버그나 그런 얘기이므로 생략 )

For information on the Spring Data source code repository, nightly builds and snapshot artifacts please see the Spring Data home page.

You can help make Spring Data best serve the needs of the Spring community by interacting with developers on Stackoverflow at either spring-data or spring-data-redis.

If you encounter a bug or want to suggest an improvement, please create a ticket on the Spring Data issue tracker.

To stay up to date with the latest news and announcements in the Spring eco system, subscribe to the Spring Community Portal.

Lastly, you can follow the Spring blog or the project team (Thomas and Christoph) on Twitter.

레퍼런스 문서

문서 구조

이 부분은 레퍼런스 문서로써, SDR에서제공하는 핵심 기능을 설명합니다.

This part of the reference documentation explains the core functionality offered by Spring Data Redis.

Redis 지원은 레디스 모듈 특징 셋을 소개합니다.

Redis support introduces the Redis module feature set.

5. 레디스 지원

스프링 데이터에서 지원되는 키밸류 저장소중의 하나는 Redis입니다. 프로젝트 홈페이지를 인용하자면 :

One of the key value stores supported by Spring Data is Redis. To quote the project home page:

레디스는 고급 키밸류 저장소입니다. 이것은 memcached 와 비슷하지만, 데이터셋은 변덕스럽지(volatile) 않습니다. 그리고 값은 정확히 문자열(멤캐쉬처럼)이 될 수 있지만, 이것은 또한 리스트, 셋, 그리고 정렬된 셋을 지원합니다. 모든 이러한 데이터 타입은 원자적 연산으로 생성될 수 있으며 요소를 push/pop, add/remove 할 수 있고 서버사이드 결합, 상호작용, 셋들간의 차이(difference between sets), 등등을 할 수가 있습니다. 레디스는 여러 종류를 정렬 기능을 지원합니다.
Redis is an advanced key-value store. It is similar to memcached but the dataset is not volatile, and values can be strings, exactly like in memcached, but also lists, sets, and ordered sets. All this data types can be manipulated with atomic operations to push/pop elements, add/remove elements, perform server side union, intersection, difference between sets, and so forth. Redis supports different kind of sorting abilities.

스프링 데이터 레디스는 스프링 어플리케이션으로부터 레디스로의 간편한 접근과 설정을 제공합니다. 저장소와 상호작용하는 데 로우레벨과 하이레벨 추상화를 제공하며, 유저를 인프라스트럭쳐적 걱정에서 편하게 해줍니다 .

Spring Data Redis provides easy configuration and access to Redis from Spring applications. It offers both low-level and high-level abstractions for interacting with the store, freeing the user from infrastructural concerns.

5.1. 레디스 요구사항

스프링 레디스는 REDIS 2.6 이나 그 이상의 버젼을 필요로 하면 JAVA SE 6.0 이상의 버젼을 필요로 합니다. 언어바인딩(아니면 코넥터)에 관해서 스프링 레디스는 레디스를 위한 인기있는 오픈소스 자바 라이브러리인, Jedis, JRedis, SRPLettuce에 통합되어 있습니다. 만약 당신이 다른 코넥터를 원한다면 저희 팀에 피드백을 주시길 바랍니다.

Spring Redis requires Redis 2.6 or above and Java SE 6.0 or above . In terms of language bindings (or connectors), Spring Redis integrates with Jedis, JRedis, SRP and Lettuce, four popular open source Java libraries for Redis. If you are aware of any other connector that we should be integrating with please send us feedback.

5.2. 하이레벨 뷰를 위한 레디스 지원

레디스 지원은 몇가지 컴포넌트를 제공합니다 (의존성 순서대로):

The Redis support provides several components (in order of dependencies):

많은 작업에서 하이레벨 추상화와 지원서비스는 훌륭한 선택입니다. 어떤 지점에서 레이어간에 이동이 있을 수 있습니다. 예를 들자면, 레디스와 직접적으로 통신하기 위해 로우레벨 코넥션을 가지고 있는 것은 매우 쉬울 수 있습니다.

For most tasks, the high-level abstractions and support services are the best choice. Note that at any point, one can move between layers - for example, it’s very easy to get a hold of the low level connection (or even the native library) to communicate directly with Redis.

5.3. 레디스에 접속하기

레디스와 스프링을 사용할 때 첫번째 일은 IOC 컨테이너를 이용해 저장소에 접속하는 것입니다. 이것을 하기 위해 자바 코넥터(나 바인딩)이 필요합니다. 당신이 고르는 라이브러리가 무엇이든, 지속적으로 모든 코넥터에서 행동을 하려고 할 때, 스프링데이터레디스 API에는 하나의 세트가 필요로 합니다. org.springframework.data.redis.connection패키지와 그 안의 RedisConnection와 레디스에서 active된 connections을 받고 작업하기 위한 RedisConnectionFactory인터페이스입니다.

One of the first tasks when using Redis and Spring is to connect to the store through the IoC container. To do that, a Java connector (or binding) is required. No matter the library one chooses, there is only one set of Spring Data Redis API that one needs to use that behaves consistently across all connectors, namely the org.springframework.data.redis.connection package and its RedisConnection and RedisConnectionFactory interfaces for working with and retrieving active connections to Redis.

5.3.1. RedisConnection 과 RedisConnectionFactory

RedisConnection 은 레디스 통신에 있어서 building block 을 제공하여 레디스 백엔드에서의 통신을 다루게 됩니다. 또한 자동적으로 코넥팅 라이브러리 예외를 스프링 일관성(consistency) DAO 예외hierarchy 로 전환해주기도 합니다. 그래서 어떤 코드의 변화도 없이 작업문법은 일관적으로 남아있게 됩니다.

RedisConnection provides the building block for Redis communication as it handles the communication with the Redis back-end. It also automatically translates the underlying connecting library exceptions to Spring’s consistent DAO exception hierarchy so one can switch the connectors without any code changes as the operation semantics remain the same.

네이티브 라이브러리 API 가 필요로 하는 경우를 위해 RedisConnectiongetNativeConnection라는 메소드를 제공하는데, 이것은 통신을 위해 사용되는 raw한 객체를 리턴합니다.
For the corner cases where the native library API is required, RedisConnection provides a dedicated method getNativeConnection which returns the raw, underlying object used for communication.

활성화된 RedisConnection들은 RedisConnectionFactory을 통해서 생성됩니다. 추가적으로 팩토리는 PersistenceExceptionTranslator로 활동을 하며, 한번 선언되면 투명한 예외 전환을 한다는 것을 의미합니다. 예를 들자면 @Repository와 AOP의 사용을 통한 예외 전환을 말합니다. 더 많은 정보는 스프링 프레임워크 문서에서의 이 section 에서 보실 수가 있습니다.

Active RedisConnection s are created through RedisConnectionFactory. In addition, the factories act as PersistenceExceptionTranslator s, meaning once declared, they allow one to do transparent exception translation. For example, exception translation through the use of the @Repository annotation and AOP. For more information see the dedicated section in Spring Framework documentation.

설정해둔 것에 따라서, 팩토리는 새로운 코넥션이나 (코넥션풀이나 공유 네이티브 코넥션이 사용되는 경우) 존재하는 코넥션을 리턴할 수가 있습니다.
Depending on the underlying configuration, the factory can return a new connection or an existing connection (in case a pool or shared native connection is used).

RedisConnectionFactory 와 작업을 하는 가장 쉬운 방법은 적절한 코넥터를 IOC코넥터를 이용해 설정하고 그것을 사용하는 클래스에 주입하는 것입니다.

The easiest way to work with a RedisConnectionFactory is to configure the appropriate connector through the IoC container and inject it into the using class.

불행히도 현재는 모든 코넥터가 레디스의 특징을 지원하는 것은 아닙니다. 라이브러리가 지원하지 않는 코넥션 API에 있는 메소드를 실행시킬 때, UnsupportedOperationException 이 던져집니다. 이러한 상황은 나중에 다양한 코넥터들이 좀 더 성숙하면서 고쳐질 것같습니다.
Unfortunately, currently, not all connectors support all Redis features. When invoking a method on the Connection` API that is unsupported by the underlying library, an `UnsupportedOperationException is thrown. This situation is likely to be fixed in the future, as the various connectors mature.

5.3.2. JEDIS 접속기 설정

Jedisorg.springframework.data.redis.connection.jedis package에서의 스프링 데이터 레디스 모듈에서 지원되는 코넥터 중의 하나로 간단한 설정은 다음과 같습니다 :

Jedis is one of the connectors supported by the Spring Data Redis module through the org.springframework.data.redis.connection.jedis package. In its simplest form, the Jedis configuration looks as follow:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <!-- Jedis ConnectionFactory -->
  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"/>

</beans>

그러나 프로덕션 사용을 위해서라면, host와 password설정을 조금 다르게 해야 할 것입니다. :

For production use however, one might want to tweak the settings such as the host or password:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="server" p:port="6379" />

</beans>

5.3.3. JRedis 코넥터 설정

JRedis 는 또 다른 유명한 오픈소스 코텍터로 org.springframework.data.redis.connection.jredis패키지를 통해서 지원이 되고 있습니다.

일반적인 JRedis 설정은 다음과 같습니다. :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="jredisConnectionFactory" class="org.springframework.data.redis.connection.jredis.JredisConnectionFactory" p:host-name="server" p:port="6379"/>

</beans>

설정이 상당히 Jedis와 비슷합니다. 한가지 주목할 만한 다른 점은 기본적으로 JredisConnectionFactory 풀 코넥션 입니다. JRedis에서 코넥션 풀을 사용하기 위해서는 JredisConnectionFactoryJredisPool인스턴스와 함께 설정해야 합니다. 예를 들면 다음과 같습니다 :

The configuration is quite similar to Jedis, with one notable exception. By default, the JredisConnectionFactory pools connections. In order to use a connection pool with JRedis, configure the JredisConnectionFactory with an instance of JredisPool. For example:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="jredisConnectionFactory" class="org.springframework.data.redis.connection.jredis.JredisConnectionFactory">
    <constructor-arg>
      <bean class="org.springframework.data.redis.connection.jredis.DefaultJredisPool">
        <constructor-arg value="localhost" />
        <constructor-arg value="6379" />
      </bean>
    </constructor-arg>
  </bean>

</beans>

5.3.4. SRP 코넥터 설정해보기

SRP (Sam's 레디스 프로토콜의 합성어) 은 SDR의 세번째 오픈소스 커넥터로 org.springframework.data.redis.connection.srp 패키지에서 제공합니다 .

SRP (an acronym for Sam’s Redis Protocol) is the third open-source connector supported by Spring Data Redis through the org.springframework.data.redis.connection.srp package.

지금까지로 봐서 설정이 추측하기 쉬우실 겁니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="srpConnectionFactory" class="org.springframework.data.redis.connection.srp.SrpConnectionFactory" p:host-name="server" p:port="6379"/>

</beans>

말할 것없이 설정이 다른 설정과 비슷합니다.

5.3.5. Lettuce 커넥터 설정

Lettuce 는 네번째 SDR 어쩌고org.springframework.data.redis.connection.lettuce 패키지는 여기. (발번역ㄱㄱ ;; )

Lettuce is the fourth open-source connector supported by Spring Data Redis through the org.springframework.data.redis.connection.lettuce package.

설정 매우 쉬움 쉬움

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="lettuceConnectionFactory" class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory" p:host-name="server" p:port="6379"/>

</beans>

또한 Lettuce특정으로 몇가지 달라질 수 있는 코넥션 파라미터가 있습니다. 기본적으로 LettuceConnectionFactory로 생성되는 모든 LettuceConnections은, 모든 논블로킹-논트랜잭션 작업을 위해 같은 쓰레드세이프한 네이티브 코넥션을 공유합니다. shareNativeConnection 를 false로 사용하여 제공된 코넥션을 매시간 사용합니다. LettuceConnectionFactory는 또한 LettucePool과 함께 사용되어 pooling blocking 하고 transactional 한 코넥션을 사용하기도하고, shareNativeConnection이 false로 되어있다면 모든 코넥션을 사용하기도 합니다.

There are also a few Lettuce-specific connection parameters that can be tweaked. By default, all LettuceConnections created by the LettuceConnectionFactory share the same thread-safe native connection for all non-blocking and non-transactional operations. Set shareNativeConnection to false to use a dedicated connection each time. LettuceConnectionFactory can also be configured with a LettucePool to use for pooling blocking and transactional connections, or all connections if shareNativeConnection is set to false.

5.4. 레디스 센티널 지원

높은 가용성(available) Redis를 다루기 위해 RedisSentinelConfiguration를 사용하여 Redis Sentinel에 대한 지원이 있습니다. For dealing with high available Redis there is support for Redis Sentinel using RedisSentinelConfiguration.

For dealing with high available Redis there is support for Redis Sentinel using RedisSentinelConfiguration.

Jedis 가 지금은 오직 레디스 센티널을 지원한다는 것을 알아둡시다.
Please note that currently only Jedis supports Redis Sentinel.
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
  RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration() .master("mymaster")
  .sentinel("127.0.0.1", 26379) .sentinel("127.0.0.1", 26380);
  return new JedisConnectionFactory(sentinelConfig);
}

RedisSentinelConfiguration 은 또한 PropertySource를 통해 정의될 수 있습니다.

RedisSentinelConfiguration can also be defined via PropertySource.

설정 프로퍼티들
  • spring.redis.sentinel.master: 마스터 노드 이름.

  • spring.redis.sentinel.nodes: 콤마로 분리된 호스트:포트 쌍의 리스트.

때떄로 센티널의 일부와 직접적인 상호작용이 필요로 합니다.. RedisConnectionFactory.getSentinelConnection() 이나 RedisConnection.getSentinelCommands()를 사용하는 것은 당신에게 첫번째로 활성화 설정된 센티널에 대한 접근을 제공해줄 것입니다.

Sometimes direct interaction with the one of the Sentinels is required. Using RedisConnectionFactory.getSentinelConnection() or RedisConnection.getSentinelCommands() gives you access to the first active Sentinel configured.

5.5. RedisTemplate을 통해 객체와 작업하기
5.5. Working with Objects through RedisTemplate

대부분의 사용자들은 RedisTemplate을 사용하고 이에 맞는 패키지 org.springframework.data.redis.core를 사용할 것입니다. - template은 사실 그것의 풍부한 특징들에 의해 레디스 모듈의 중심 클래스입니다. 템플릿은 레디스 상호작용을 위해 높은 레벨 추상화를 제공합니다. RedisConnection가 바이너리값(byte arrays)을 받고 리턴하는 로우레벨 메소드를 제공하는 반면 template은 직렬화와 코넥션 관리를 해주며 유저가 그러한 세부사항을 다루는 것에서 자유롭게 해줍니다.

게다가 template 은 특정 타입이나 특정 키를 위해 풍부하고, 고상한(generified:사전없는 단어로 다른 단어로 바꿔서 번역) 인터페이스를 제공하는 작업 뷰 (다음 레디스 명령어 모음reference)를 KeyBound를 통해 밑에 설명한 것처럼 주게 됩니다.

Most users are likely to use RedisTemplate and its coresponding package org.springframework.data.redis.core - the template is in fact the central class of the Redis module due to its rich feature set. The template offers a high-level abstraction for Redis interactions. While RedisConnection offers low level methods that accept and return binary values (byte arrays), the template takes care of serialization and connection management, freeing the user from dealing with such details.

Moreover, the template provides operations views (following the grouping from Redis command reference) that offer rich, generified interfaces for working against a certain type or certain key (through the KeyBound interfaces) as described below:

Table 1. 작업 뷰들 Operational views(여기는 원문용어를 그대로 살리는 게 나을 것같다 )
Interface Description

Key Type Operations

ValueOperations

Redis string (or value) operations

ListOperations

Redis list operations

SetOperations

Redis set operations

ZSetOperations

Redis zset (or sorted set) operations

HashOperations

Redis hash operations

HyperLogLogOperations

Redis HyperLogLog operations like (pfadd, pfcount,…​)

Key Bound Operations

BoundValueOperations

Redis string (or value) key bound operations

BoundListOperations

Redis list key bound operations

BoundSetOperations

Redis set key bound operations

BoundZSetOperations

Redis zset (or sorted set) key bound operations

BoundHashOperations

Redis hash key bound operations

한번 설정되면, 템플릿은 스레드세이프하며 여러개의 인스턴스에서 재사용될수 있습니다.

Once configured, the template is thread-safe and can be reused across multiple instances.

특별히, RedisTemplate 은 대부분의 작업을 위해 자바기반의 직렬화를 사용합니다. 이것은 template에 읽혀지거나 쓰여지는 어떤 객체는 자바를 통해 직렬화/역직렬화 된다는 것을 의미합니다. 직렬화 메커니즘은 tempalte에 의해 쉽게 변경될 수 있으며, Redis 모듈은 org.springframework.data.redis.serializer에서 몇몇 사용가능한 구현체를 제공합니다. 더 많은 정보를 원한다면 Serializers를 보세요. 당신은 또한 어떤 직렬화를 null로 설정하고, enableDefaultSerializer 를 false로 해서 RedisTemplate을 raw byte 배열과 함께 사용할 수 있습니다. serializer가 그것들을 받아들이는 한, 모든 키를 null이 아닌 값으로 설정하는 것을 필요로 하는 template이 null이 될 수 있습니다 (역주: 번역이 애매하다. 원문을 보자!). 더 많은 정보를 위해 각각의 serializer의 자바doc을 보세요~

Out of the box, RedisTemplate uses a Java-based serializer for most of its operations. This means that any object written or read by the template will be serializer/deserialized through Java. The serialization mechanism can be easily changed on the template, and the Redis module offers several implementations available in the org.springframework.data.redis.serializer package - see Serializers for more information. You can also set any of the serializers to null and use RedisTemplate with raw byte arrays by setting the enableDefaultSerializer property to false. Note that the template requires all keys to be non-null - values can be null as long as the underlying serializer accepts them; read the javadoc of each serializer for more information.

특정 template view 가 필요한 경우를 위해, view를 의존성으로 등록하고서 주입합니다 : 콘테이너가 자동적으로 opsFor[X]호출을 제거하는 전환을 수행할 것입니다

For cases where a certain template view is needed, declare the view as a dependency and inject the template: the container will automatically perform the conversion eliminating the opsFor[X] calls:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>
  <!-- redis template definition -->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
  ...

</beans>
public class Example {

  // inject the actual template
  @Autowired
  private RedisTemplate<String, String> template; // inject the template as ListOperations

  @Resource(name="redisTemplate")
  private ListOperations<String, String> listOps;

  public void addLink(String userId, URL url) {
    listOps.leftPush(userId, url.toExternalForm());
  }
}

5.6. 문자열 중점 편의 클래스
5.6. String-focused convenience classes

레디스에 저장되는 키와 밸류 값이 java.lang.String이 되는 것이 흔하기 때문에 레디스 모듈은 두 가지 확장(extension)을 RedisConnectionRedisTemplate을, StringRedisConnection (그리고 DefaultStringRedisConnection 구현체) 와 StringRedisTemplate을 각자 집중적인 문자열 중점 작업으로 제공합니다. 게다가 String 키에 연결되면, template과 커넥션은 StringRedisSerializer 를 사용하여 저장된 키와 값을 사람이 읽기 쉽게 합니다 (의역함) (같은 인코딩이 레디스와 당신의 코드에서 일어났다고 가정합니다) 예를 들어 :

Since it’s quite common for the keys and values stored in Redis to be java.lang.String, the Redis modules provides two extensions to RedisConnection and RedisTemplate, respectively the StringRedisConnection (and its DefaultStringRedisConnection implementation) and StringRedisTemplate as a convenient one-stop solution for intensive String operations. In addition to being bound to String keys, the template and the connection use the StringRedisSerializer underneath which means the stored keys and values are human readable (assuming the same encoding is used both in Redis and your code). For example:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/>

  <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/>
  ...
</beans>
public class Example {

  @Autowired
  private StringRedisTemplate redisTemplate;

  public void addLink(String userId, URL url) {
    redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
  }
}

우리의 다른 스프링 템플릿과 마찬가지로, RedisTemplateStringRedisTemplateRedisCallback interface를 통하여서, 개발자가 레디스에게 직접적으로 이야기하는 것을 허용합니다.

As with the other Spring templates, RedisTemplate and StringRedisTemplate allow the developer to talk directly to Redis through the RedisCallback interface. This gives complete control to the developer as it talks directly to the RedisConnection. Note that the callback receives an instance of StringRedisConnection when a StringRedisTemplate is used.

public void useCallback() {

  redisTemplate.execute(new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      Long size = connection.dbSize();
      // Can cast to StringRedisConnection if using a StringRedisTemplate
      ((StringRedisConnection)connection).set("key", "value");
    }
   });
}

5.7. 직렬화- Serializers
5.7. Serializers

프레임워크의 관점에서, 레디스에 저장된 데이터는 단지 bytes입니다. 레디스 자신이 다양한 타입을 지원하는 반면에 이것들은 대개 데이터가 표현되는 방법보다, 저장되는 방법을 참조합니다. 이것은 정보가 문자열이나 다른 객체로 변환될지 사용자의 결정에 달렸습니다. 유저 (커스텀) 타입과 로우 데이터(혹은 거꾸로)간의 전환은 RedisSerializer 인터페이스(패키지 org.springframework.data.redis.serializer)를 통하여 스프링데이터 레디스를 통해 다루어집니다. (RedisSerializer는 이름이 암시하는 데로 직렬화 프로세스를 관리합니다.) 멋진 여러개의 구현체가 사용가능하며, 이 문서에서 두개가 이미 언급되었습니다(StringRedisSerializerJdkSerializationRedisSerializer) 입니다. 그러나 객체/XML 매핑을 위해서 스프링3부터의OXM 지원을 하는, OxmSerializer도 사용할 수 있고, JSON 형식저장을 위해서라면 JacksonJsonRedisSerializer 이나 Jackson2JsonRedisSerializer 도 사용할 수 있습니다. 저장형식은 값에만 제한된 것이 아니고, 키, 값 , 해위에 어떠한 제약 없이 사용될 수 있습니다.

From the framework perspective, the data stored in Redis is just bytes. While Redis itself supports various types, for the most part these refer to the way the data is stored rather then what it represents. It is up to the user to decide whether the information gets translated into Strings or any other objects. The conversion between the user (custom) types and raw data (and vice-versa) is handled in Spring Data Redis through the RedisSerializer interface (package org.springframework.data.redis.serializer) which as the name implies, takes care of the serialization process. Multiple implementations are available out of the box, two of which have been already mentioned before in this documentation: the StringRedisSerializer and the JdkSerializationRedisSerializer. However one can use OxmSerializer for Object/XML mapping through Spring 3 OXM support or either JacksonJsonRedisSerializer or Jackson2JsonRedisSerializer for storing data in JSON format. Do note that the storage format is not limited only to values - it can be used for keys, values or hashes without any restrictions.

5.8. 레디스 메시징/PubSub

스프링 데이터는 레디스를 위한 메시징 통합을 제공합니다. 스프링 프레임워크의 JMS통합과 기능과 작명에서 매우 비슷하며, JMS지원에 익숙한 사용자들은 아주 편안함을 느끼게 될 것입니다.

Spring Data provides dedicated messaging integration for Redis, very similar in functionality and naming to the JMS integration in Spring Framework; in fact, users familiar with the JMS support in Spring should feel right at home.

레디스 메시징은 대략적으로 두 기능의 영역으로 나눠집니다. 말하자면 메시지의 생산(production)이나 출판(publication) 그리고 소비(consumption)와 구독(subscription)이라는 영역입니다. 그러므로 간단히는 pubsub(Publish/Subscribe)이라고도 부릅니다. RedisTemplate클래스는 메시지 생산을 위해 사용됩니다. JavaEE의 메시지 드리븐 빈 스타일과 비슷한 비동기(async)접수를 위해 스프링 데이터는 메시지 드리븐 POJO(MDPs)를 생산하는 메시지 리스너 콘테이너를 제공하며, 동기적(synchronous) 접수에는 RedisConnection 계약(contract)를 사용합니다.

Redis messaging can be roughly divided into two areas of functionality, namely the production or publication and consumption or subscription of messages, hence the shortcut pubsub (Publish/Subscribe). The RedisTemplate class is used for message production. For asynchronous reception similar to Java EE’s message-driven bean style, Spring Data provides a dedicated message listener container that is used to create Message-Driven POJOs (MDPs) and for synchronous reception, the RedisConnection contract.

org.springframework.data.redis.connectionorg.springframework.data.redis.listener는 레디스 메시징을 사용하는 핵심 기능을 제공합니다.

The package org.springframework.data.redis.connection and org.springframework.data.redis.listener provide the core functionality for using Redis messaging.

5.8.1. 메시지 송신/발행
5.8.1. Sending/Publishing messages

다른 작업과 함께 메시지를 발행하기 위해, 로우레벨의 RedisConnection이나 하이레벨의 RedisTemplate를 사용할 수 있습니다. 양쪽의 엔티티들은 publish 메소드를 제공하며 이 메소드는 아규먼트로 보낼 메시지와 목적지 채널을 받습니다. RedisConnection가 로우데이터(바이트배열)을 받는 반면에 RedisTemplate는 무작위의 객체가 메시지로 보내지는 것을 허용합니다. :

To publish a message, one can use, as with the other operations, either the low-level RedisConnection or the high-level RedisTemplate. Both entities offer the publish method that accepts as argument the message that needs to be sent as well as the destination channel. While RedisConnection requires raw-data (array of bytes), the RedisTemplate allow arbitrary objects to be passed in as messages:

// send message through connection RedisConnection con = ...
byte[] msg = ...
byte[] channel = ...
con.publish(msg, channel); // send message through RedisTemplate
RedisTemplate template = ...
template.convertAndSend("hello!", "world");

5.8.2.
메시지 수신/구독
Receiving/Subscribing for messages

받는쪽에서는, 하나 혹은 여러개의 채널에서 직접적으로 네이밍하거나 패턴매칭을 통해서 구독을 할 수가 있습니다. 패턴매칭의 접근은 꽤 유용합니다. 여러개의 구독이 하나의 명령어로 생성되는 것뿐만 아니라 아직 구독시간에 생성되지 않은 채널에도 (패턴이 매칭되는 한 ) listen을 한다는데 꽤 유용합니다

On the receiving side, one can subscribe to one or multiple channels either by naming them directly or by using pattern matching. The latter approach is quite useful as it not only allows multiple subscriptions to be created with one command but to also listen on channels not yet created at subscription time (as long as they match the pattern).

로우레벨에서 RedisConnectionsubscribepSubscribe 메소드를 제공하며 이 메소드는 각각의 패널에 의해 골라진 채널에 의한 구독을 위한 레디스 명령어를 매핑?(map)합니다. 여러개의 채널이나 패턴들은 아규먼트로 사용될 수 있다는 것을 알고갑시다. 리스닝을 하건 안하건..코넥션의 구독이나 단순하게 쿼리를 바꾸기 위해 RedisConnectiongetSubscriptionisSubscribed메소드를 제공합니다.

At the low-level, RedisConnection offers subscribe and pSubscribe methods that map the Redis commands for subscribing by channel respectively by pattern. Note that multiple channels or patterns can be used as arguments. To change the subscription of a connection or simply query whether it is listening or not, RedisConnection provides getSubscription and isSubscribed method.

스프링데이터에서의 구독 명령어 는 블로킹입니다. 즉, 코넥션에서 구독을 호출하는 것은 현재 쓰레드가 메시지를 기다리면서 블록되게 합니다. 이 쓰레드는 구독이 해제되거나 추가적인 쓰레드가 unsubscribe or pUnsubscribe를 같은 코넥션에서 실행시킬 때 이 블록킹은 해제됩니다. 이 문제에 대한 해결책은 밑의 See 메시지 리스너 콘테이너를 보세요~ (역주 : 링크가 null로 되어있다. 원래 링크가 없는 듯하다. )
Subscription commands in Spring Data Redis are blocking. That is, calling subscribe on a connection will cause the current thread to block as it will start waiting for messages - the thread will be released only if the subscription is canceled, that is an additional thread invokes unsubscribe or pUnsubscribe on the same connection. See message listener container below for a solution to this problem.

위에서 언급한대로, 구독이 되면, 코넥션은 메시지를 위해서 대기를 시작합니다. 새로운 구독을 추가하거나 현재의 구독을 수정/취소하는 것 외에는, 어떠한 명령어도 실행될 수는 없습니다. 이 말은 다른 것을 실행하는 것 즉 subscribe, pSubscribe, unsubscribe, 나 pUnsubscribe은 맞지 않고, 예외를 던진다는 것을 말합니다.

As mentioned above, once subscribed a connection starts waiting for messages. No other commands can be invoked on it except for adding new subscriptions or modifying/canceling the existing ones. That is, invoking anything other then subscribe, pSubscribe, unsubscribe, or pUnsubscribe is illegal and will throw an exception.

메시지를 구독하기 위해 MessageListener 콜백을 구현할 필요가 있습니다. 콜백에서-각각의 시간에 새로운 메시지가 도착하고 콜백은 실행되고 사용자의 코드가 onMessage메소드를 통해서 실행됩니다. 저 인터페이스는 실제 메시지에 대한 접근을 제공할 뿐만 아니라, 받은 채널과 (채널매칭하는데 사용된)패턴에 대해서도 접근을 제공합니다. (약간 번역이 애매했으므로 원문 체크 필요). 이 정보는 피호출자가 다양한 메시지들을 내용(content)뿐만 아니라 데이터(data) 를 통해서도 구별하게 해줍니다.

In order to subscribe for messages, one needs to implement the MessageListener callback: each time a new message arrives, the callback gets invoked and the user code executed through onMessage method. The interface gives access not only to the actual message but to the channel it has been received through and the pattern (if any) used by the subscription to match the channel. This information allows the callee to differentiate between various messages not just by content but also through data.

메시지 리스너 콘테이너
Message Listener Containers

블록킹 특징때문에, 로우레벨 구독은 매력적이지가 않습니다. 이것은 모든 단일 리스너를 위해 코넥션과 쓰레드 관리를 필요로 합니다. 이러한 문제를 경감시키기 위해, 스프링데이터는 RedisMessageListenerContainer를 제공하는 데 이것은 사용자를 대신하여 복잡한 일들을 해줍니다. EJB나 JMS와 친숙한 사용자들은 스프링 프레임워크에서 지원하는 개념과 메시지드리븐 POJO(MDPs)에서의 유사한 컨셉을 발견할 수 있을 것입니다.(역주: 별로 안 중요한 내용이니, 뭐 비슷하다 그런 뜻으로 넘어가자. =3=3)

Due to its blocking nature, low-level subscription is not attractive as it requires connection and thread management for every single listener. To alleviate this problem, Spring Data offers RedisMessageListenerContainer which does all the heavy lifting on behalf of the user - users familiar with EJB and JMS should find the concepts familiar as it is designed as close as possible to the support in Spring Framework and its message-driven POJOs (MDPs)

RedisMessageListenerContainer 는 메시지 리스너 콘테이너로 동작합니다. 이것은 레디스 채널로 부터 메시지를 받는데 사용되며 이것에 주입받은 메시지 리스너를 조정합니다. 리스너 콘테이너는 모든 메시지 접수 스레딩과 처리를 위한 리스너들에게 dispatch하는 책임이 있습니다. 메시지 리스너 콘테이너는 MDP와 메시지 공급자의 중개인이며, 수신된 메시지를 등록하고 자원습득과 해제 예외전환같은 것을 관리합니다. 이것(콘테이너)는 어플리케이션 개발자로써 당신이 메시지를 수신하는데 관련한 비즈니스 로직(아마 복잡한)을 쓰게 해주며, 보일러플레이트한 레디스 인프라스트럭쳐 걱정을 프레임워크로 위임합니다.

RedisMessageListenerContainer acts as a message listener container; it is used to receive messages from a Redis channel and drive the MessageListeners that are injected into it. The listener container is responsible for all threading of message reception and dispatches into the listener for processing. A message listener container is the intermediary between an MDP and a messaging provider, and takes care of registering to receive messages, resource acquisition and release, exception conversion and the like. This allows you as an application developer to write the (possibly complex) business logic associated with receiving a message (and reacting to it), and delegates boilerplate Redis infrastructure concerns to the framework.

더군다나, 어플리케이션 발자국?(footprint)를 최소화하기 위해 RedisMessageListenerContainer는 하나의 코넥션과 하나의 스레드가 다양한 리스너로부터 공유되는 것을 허용합니다. 비록 그들이 구독을 공유하지 않더라도 말입니다. 그러므로 얼마나 많은 채널과 리스너가 있던지간에 어플리케이션 tracks과 런타임 비용은 그것의 수명(lifetim)동안 같을 것입니다. 게다가 콘테이너는 런타임 설정변화를 허용해서 재시작의 필요없이 어플리케이션이 운영중인 동안에 리스너를 추가하거나 삭제할 수 있게 합니다. 추가적으로 콘테이너는 지연구독접근을 사용하여, 필요할 때 RedisConnection를 사용하고 - 만약 모든 리스너가 구독중이지않으면 자동적으로 수행된 것을 정리하고(clean up) 사용한 스레드를 해제합니다.

Furthermore, to minimize the application footprint, RedisMessageListenerContainer allows one connection and one thread to be shared by multiple listeners even though they do not share a subscription. Thus no matter how many listeners or channels an application tracks, the runtime cost will remain the same through out its lifetime. Moreover, the container allows runtime configuration changes so one can add or remove listeners while an application is running without the need for restart. Additionally, the container uses a lazy subscription approach, using a RedisConnection only when needed - if all the listeners are unsubscribed, cleanup is automatically performed and the used thread released.

메시지의 동기적인(asynch) 방법을 돕기 위해, 콘테이너는 메시지를 dispatching하는 데, java.util.concurrent.Executor를 필요로 합니다. (아니면 스프링의 TaskExecutor). 적재량(load)에 따라, 리스너나 런타임 환경에 따라 더 나은 serve 를 위해 실행자(executor)가 변경되거나 다르게 될 수 있습니다. (특별히 app servers같이 관리되는 환경에서 말입니다.) 적절한 TaskExecutor를 골라서 런타임의 장점을 누리길 강력히 권합니다.

To help with the asynch manner of messages, the container requires a java.util.concurrent.Executor ( or Spring’s TaskExecutor) for dispatching the messages. Depending on the load, the number of listeners or the runtime environment, one should change or tweak the executor to better serve her needs - in particular in managed environments (such as app servers), it is highly recommended to pick a a proper TaskExecutor to take advantage of its runtime.

메시지 리스너 어댑터
The MessageListenerAdapter

MessageListenerAdapter클래스는 스프링 비동기 메시지 지원의 마지막 컴포넌트입니다. 한마디로, 이것은 당신이 어떤 클래스든간에 MDP로 노출시키는 것을 허용합니다.(물론 거기엔 몇가지 제약이 있겠지만요)

다음의 인터페이스 정의를 생각해봅시다. 비록 인터페이스가 MessageListener인터페이스를 상속할지라도 이것은 여전히 MessageListenerAdapter클래스의 사용을 통해서 MDP로써 사용될 수 있습니다. 또한 얼마나 많은 메시지 핸들링 메소드가 다양한 수신하고 핸들할 수 있는, Message타입의 contents에 따라 강력히 입력되었는지(typed) 봐보세요. 추가적으로 메시지가 보내지는 채널이나 패턴이 메소드의 두번째 문자열 타입 아규먼트로 전해지는 것을 봐봅시다.

The MessageListenerAdapter class is the final component in Spring’s asynchronous messaging support: in a nutshell, it allows you to expose almost any class as a MDP (there are of course some constraints).

Consider the following interface definition. Notice that although the interface extends the MessageListener interface, it can still be used as a MDP via the use of the MessageListenerAdapter class. Notice also how the various message handling methods are strongly typed according to the contents of the various Message types that they can receive and handle. In addition, the channel or pattern to which a message is sent can be passed in to the method as the second argument of type String:

public interface MessageDelegate {
  void handleMessage(String message);
  void handleMessage(Map message); void handleMessage(byte[] message);
  void handleMessage(Serializable message);
  // pass the channel/pattern as well
  void handleMessage(Serializable message, String channel);
 }
public class DefaultMessageDelegate implements MessageDelegate {
  // implementation elided for clarity...
}

특별히 얼마나 많은 위의 MessageDelegate인터페이스(DefaultMessageDelegate 클래스 위의) 구현체가 레디스 의존성을 전혀 가지고 있지 않음을 알아둡시다. 이것은 정말로 다음의 설정을 통해 MDP로 만들 수가 있는 POJO입니다.

In particular, note how the above implementation of the MessageDelegate interface (the above DefaultMessageDelegate class) has no Redis dependencies at all. It truly is a POJO that we will make into an MDP via the following configuration.

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:redis="http://www.springframework.org/schema/redis"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis.xsd">

<!-- the default ConnectionFactory -->
<redis:listener-container>
  <!-- the method attribute can be skipped as the default method name is "handleMessage" -->
  <redis:listener ref="listener" method="handleMessage" topic="chatroom" />
</redis:listener-container>

<bean id="listener" class="redisexample.DefaultMessageDelegate"/>
 ...
<beans>
리스너 토픽은 채널이 될 수 도 있고(e.g. topic="chatroom") 패턴(e.g. topic="*room")이 될 수도 있습니다
The listener topic can be either a channel (e.g. topic="chatroom") or a pattern (e.g. topic="*room")

위의 예제는 Redis 네임 스페이스를 사용하여 메시지 리스너 콘테이너를 선언하고 자동적으로 리스너로 POJO를 등록합니다. 이렇게 만들어진 beans 정의는 아래와 같습니다. :

The example above uses the Redis namespace to declare the message listener container and automatically register the POJOs as listeners. The full blown, beans definition is displayed below:

<bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
  <constructor-arg>
    <bean class="redisexample.DefaultMessageDelegate"/>
  </constructor-arg>
</bean>

<bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory"/>
  <property name="messageListeners">
    <map>
      <entry key-ref="messageListener">
        <bean class="org.springframework.data.redis.listener.ChannelTopic">
          <constructor-arg value="chatroom">
        </bean>
      </entry>
    </map>
  </property>
</bean>

각각의 메시지가 수신되면 어답터는 자동적으로 설정된 RedisSerializer를 사용하여 로우레벨 포맷과 필요로 하는 오브젝트 타입간에 투명한 전환을 수행합니다. 메메소드 실행으로 인해 발생되는 어떠한 예외도 콘테이너에 의해 잡히고 다뤄집니다. (기본적으로, 로깅됩니다)

Each time a message is received, the adapter automatically performs translation (using the configured RedisSerializer) between the low-level format and the required object type transparently. Any exception caused by the method invocation is caught and handled by the container (by default, being logged).

5.9.
레디스 트랜잭션
Redis Transactions

레디스는 transactionsmulti, exec, 와 discard 커맨트를 통하여 지원합니다. 이러한 작업은 RedisTemplate를 통하여 사용가능합니다만, RedisTemplate는 같은 코넥션을 사용하는 트랜잭션에서 모든 작업이 실행됨을 보장하지는 않습니다.

Redis provides support for transactions through the multi, exec, and discard commands. These operations are available on RedisTemplate, however RedisTemplate is not guaranteed to execute all operations in the transaction using the same connection.

스프링 데이터 레디스는 여러 작업이 같은 connection에서 레디스 트랜잭션을 필요로 할 때 사용하기 위한 SessionCallback 인터페이스를 제공합니다. 예를 들자면 :

Spring Data Redis provides the SessionCallback interface for use when multiple operations need to be performed with the same connection, as when using Redis transactions. For example:

//execute a transaction
List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
  public List<Object> execute(RedisOperations operations) throws DataAccessException {
    operations.multi();
    operations.opsForSet().add("key", "value1");

    // This will contain the results of all ops in the transaction
    return operations.exec();
  }
});
System.out.println("Number of items added to set: " + txResults.get(0));

RedisTemplate은 이것의 값과 해쉬키와 exec의 모든 결과를 역직렬화시켜주는 해쉬 밸류 serializer를 리턴하기 전에 사용합니다. 트랜잭션 결과를 위해 당신에게 커스텀 직렬화를 허용하게 해주는 추가적인 exec 메소드가 있습니다.

RedisTemplate will use its value, hash key, and hash value serializers to deserialize all results of exec before returning. There is an additional exec method that allows you to pass a custom serializer for transaction results.

버젼 1.1 에서 RedisConnectionRedisTemplateexec메소드에 중대한 변화가 일어났었습니다. 이전에는 이 메소드들이 코넥터들의 트랜잭션 결과를 직접적으로 리턴했었습니다. 이것은 데이터 타입이 RedisConnection의 메소드들로부터 반환되는 것과 종종 다를 수도 있다는 것을 의미하는 데요. 예를 들자면 zAdd는 요소가 정렬셋에 추가되었다는 것을 가리키는 boolean 값을 리턴합니다. 대부분의 코넥터는 이 값을 long으로 리턴하고 스프링 데이터 레디스는 전환을 수행합니다. 또 다른 흔한 차이는 대부분의 코넥터들이 set같은 작업을 위하여 응답상태(보통 문자열 "OK")를 리턴한다는 것입니다. 이러한 응답들은 일반적으로 스프링 데이터 레디스에 의해 버려집니다. 1.1 버젼 이전에는 이러한 전환이 exec의 결과로 수행되지 않았습니다. 또한 결과가 RedisTemplate에서 직렬화되지 않았습니다. 그래서 이것들은 종종 로우 바이트 배열을 포함했었습니다. 만약 이러한 변화가 당신의 어플리케이션에 의도치 않은 영향을 끼친다면, convertPipelineAndTxResults를 false로 설정해서 RedisConnectionFactory가 이런 행동을 하지 않게 하세요.
An important change has been made to the exec methods of RedisConnection and RedisTemplate in version 1.1. Previously these methods returned the results of transactions directly from the connectors. This means that the data types often differed from those returned from the methods of RedisConnection. For example, zAdd returns a boolean indicating that the element has been added to the sorted set. Most connectors return this value as a long and Spring Data Redis performs the conversion. Another common difference is that most connectors return a status reply (usually the String "OK") for operations like set. These replies are typically discarded by Spring Data Redis. Prior to 1.1, these conversions were not performed on the results of exec. Also, results were not deserialized in RedisTemplate, so they often included raw byte arrays. If this change breaks your application, you can set convertPipelineAndTxResults to false on your RedisConnectionFactory to disable this behavior.

5.9.1. @Transactional 지원

트랜잭션 지원은 기본으로 가능하지 않게되어있고 명시적으로 각각의 RedisTemplate에서 setEnableTransactionSupport(true)설정을 해줌으로써 활성화하게 되어있습니다. 이것은 쓰이고 있는 RedisConnectionMULTI를 발동시키는 현재 Thread 에 바인딩 되게 해줍니다. 만약 트랜잭션이 에러없이 끝나게 되면 EXEC가 호출되고 그렇지 않으면 DISCARD가 호출됩니다. 한번 MULTI되면 RedisConnection는 쓰기작업을 queue해놓고, KEYS같은 모든 readonly 작업은 (non thread bound)인 신선한 RedisConnection로 들어가게 됩니다.

Transaction Support is disabled by default and has explicitly to be enabled for each RedisTemplate in use by setting setEnableTransactionSupport(true). This will force binding the RedisConnection in use to the current Thread triggering MULTI. If the transaction finishes without errors, EXEC is called, otherwise DISCARD. Once in MULTI, RedisConnection would queue write operations, all readonly operations, such as KEYS are piped to a fresh (non thread bound) RedisConnection.

/** Sample Configuration **/
@Configuration
public class RedisTxContextConfiguration {
  @Bean
  public StringRedisTemplate redisTemplate() {
    StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory());
    // explicitly enable transaction support
    template.setEnableTransactionSupport(true);
    return template;
  }

  @Bean
  public PlatformTransactionManager transactionManager() throws SQLException {
    return new DataSourceTransactionManager(dataSource());
  }

  @Bean
  public RedisConnectionFactory redisConnectionFactory( // jedis, lettuce, srp,... );

  @Bean
  public DataSource dataSource() throws SQLException { // ... }
}
/** Usage Constrainsts **/

// executed on thread bound connection
template.opsForValue().set("foo", "bar");

// read operation executed on a free (not tx-aware)
connection template.keys("*");

// returns null as values set within transaction are not visible
template.opsForValue().get("foo");

5.10. 파이프라이닝

레디스는 pipelining를 위한 지원을 제공합니다. 이것은 여러개의 커맨드를 응답의 대기없이 서버로 전송하는 것과 관련이 있습니다. 그리고 응답을 개별단계로 읽어들입니다. 파이프라이닝은 많은 요소들을 같은 리스트에 추가하는 것 같이, 당신이 한 줄로 몇몇개의 명령들을 전송할 필요가 있을 때 성능을 향상 시킬 수 있습니다.

Redis provides support for pipelining, which involves sending multiple commands to the server without waiting for the replies and then reading the replies in a single step. Pipelining can improve performance when you need to send several commands in a row, such as adding many elements to the same List.

스프링 데이터 레디스는 파이프라인으로 명령어들을 실행하기 위해 몇몇RedisTemplate메소드를 제공합니다. 만약 당신이 파이프라인된 작업에 대한 결과를 신경쓰지 않는 다면 당신은 표준 execute 메소드를 사용할 수 있고 pipeline 아규먼트에 true를 전달할 수 있습니다. executePipelined 메소드는 제공된 RedisCallback이나 SessionCallback를 파이프라인에서 실행하고 결과를 리턴합니다. 예를 들자면 :

Spring Data Redis provides several RedisTemplate methods for executing commands in a pipeline. If you don’t care about the results of the pipelined operations, you can use the standard execute method, passing true for the pipeline argument. The executePipelined methods will execute the provided RedisCallback or SessionCallback in a pipeline and return the results. For example:

//pop a specified number of items from a queue
List<Object> results = stringRedisTemplate.executePipelined(
  new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
      for(int i=0; i< batchSize; i++) {
        stringRedisConn.rPop("myqueue");
      }
    return null;
  }
});

위의 예제는 파이프라인에서 큐에 있는 아이템들의 bulk right pop 을 수행합니다. results 리스트는 모든 popped된 아이템들을 가지고 있습니다. RedisTemplate는 그것의 값, 해쉬 키, 그리고 리턴전에 모든 결과를 deserialize하는 해쉬값 serializer을 이용하고, 그래서 위의 예제에서 리턴된 아이템은 문자열이 될 것입니다. 추가적인 executePipelined 메소드들이 파이프라인된 결과를 위해 커스텀 serializer를 전달하는 것을 허용하게 해줄 것입니다.

The example above executes a bulk right pop of items from a queue in a pipeline. The results List contains all of the popped items. RedisTemplate uses its value, hash key, and hash value serializers to deserialize all results before returning, so the returned items in the above example will be Strings. There are additional executePipelined methods that allow you to pass a custom serializer for pipelined results.

RedisCallback으로 부터 리턴되는 값이 null 이 될 필요가 있다는 것을 알아둡시다. 이 값은 파이프라인된 명령어들의 결과를 리턴하면서 버려지기 때문입니다 (의역. 언문 보실 필요..! 소스를 보니.. results변수에는 값이 들어가고 Callback은 null을 리턴하는 것같군? )

Note that the value returned from the RedisCallback is required to be null, as this value is discarded in favor of returning the results of the pipelined commands.

RedisConnectionclosePipeline메소드에서 중요한 변화가 1.1 버젼에서 만들어졌습니다. 이전에는 이 메소드는 코넥터로부터의 pipelined작업의 결과를 직접적으로 리턴했습니다. 이것은 데이터 타입이 RedisConnection의 메소드들로부터 반환되는 것과 종종 다를 수도 있다는 것을 의미하는 데요. 예를 들자면 zAdd는 요소가 정렬셋에 추가되었다는 것을 가리키는 boolean 값을 리턴합니다. 대부분의 코넥터는 이 값을 long으로 리턴하고 스프링 데이터 레디스는 전환을 수행합니다. 또 다른 흔한 차이는 대부분의 코넥터들이 set같은 작업을 위하여 응답상태(보통 문자열 "OK")를 리턴한다는 것입니다. 이러한 응답들은 일반적으로 스프링 데이터 레디스에 의해 버려집니다. 1.1 버젼 이전에는 이러한 전환이 exec의 결과로 수행되지 않았습니다. 또한 결과가 RedisTemplate에서 직렬화되지 않았습니다. 그래서 이것들은 종종 로우 바이트 배열을 포함했었습니다. 만약 이러한 변화가 당신의 어플리케이션에 의도치 않은 영향을 끼친다면, convertPipelineAndTxResults를 false로 설정해서 RedisConnectionFactory가 이런 행동을 하지 않게 하세요.
An important change has been made to the closePipeline method of RedisConnection in version 1.1. Previously this method returned the results of pipelined operations directly from the connectors. This means that the data types often differed from those returned by the methods of RedisConnection. For example, zAdd returns a boolean indicating that the element has been added to the sorted set. Most connectors return this value as a long and Spring Data Redis performs the conversion. Another common difference is that most connectors return a status reply (usually the String "OK") for operations like set. These replies are typically discarded by Spring Data Redis. Prior to 1.1, these conversions were not performed on the results of closePipeline. If this change breaks your application, you can set convertPipelineAndTxResults to false on your RedisConnectionFactory to disable this behavior.

5.11. 레디스 스크립팅
5.11. Redis Scripting

레디스 버젼 2.6 이상의 버젼은 evalevalsha명령어를 통한 Lua 스크립트의 실행지원을 제공합니다. 스프링 데이터 레디스는 직렬화를 다루고 자동적으로 레디스 스크립트 캐시를 사용하는 스크립트 실행을 위한 높은 레벨 추상화를 제공합니다.

Redis versions 2.6 and higher provide support for execution of Lua scripts through the eval and evalsha commands. Spring Data Redis provides a high-level abstraction for script execution that handles serialization and automatically makes use of the Redis script cache.

스크립트는 RedisTemplateexecute메소드를 통해서 실행될 수 있습니다. RedisTemplate은 제공된 스크립트를 실행하기 위해 설정가능한 ScriptExecutor 를 사용합니다. 기본적으로는 ScriptExecutor가 제공된 키와 아규먼트의 직렬화와 스크립트 결과의 역직렬화를 관리합니다. 이것은 RedisTemplate 키 값 serializer들과 함께 이루어집니다. 스크립트 아규먼트들이나 결과를 위해서 추가적인 execute메소드가 있어서 이것을 통해서 커스텀 serializers를 전달할 수 있습니다.

Scripts can be run through the execute methods of RedisTemplate. RedisTemplate uses a configurable ScriptExecutor to execute the provided script. By default, the ScriptExecutor takes care of serializing the provided keys and arguments and deserializing the script result. This is done with the RedisTemplate key and value serializers. There is an additional execute method that allows you to pass custom serializers for the script arguments and result.

기본적으로 ScriptExecutor는 스크립트의 SHA1를 얻음(retrieve)함으로써 성능을 최적화하고, 처음으로 evalsha하는 것을 시도합니다. 아직 스크립트가 레디스 스크립트 캐쉬에 나타나지 않으면 eval 로 물러납니다(? eval로 fall back합니다.)

The default ScriptExecutor optimizes performance by retrieving the SHA1 of the script and attempting first to run evalsha, falling back to eval if the script is not yet present in the Redis script cache.

여기에 보통의 "check-and-set" 시나리오를 Lua script를 이용해서 실행하는 예제가 있습니다. 이것은 레디스 스크립트를 위해, 이상적인 유스케이스입니다. 이것은 우리가 명령어들의 집합을 원자적으로(atomically)실행하며, 하나의 명령어의 행동이 다른 것의 결과에 의해 영향을 받는 다는 것을 필요로 합니다.

Here’s an example that executes a common "check-and-set" scenario using a Lua script. This is an ideal use case for a Redis script, as it requires that we execute a set of commands atomically and the behavior of one command is influenced by the result of another.

@Bean
public RedisScript<Boolean> script() {
  DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();
  redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("META-INF/scripts/checkandset.lua")));
  redisScript.setResultType(Boolean.class);
}
public class Example {
  @Autowired
  RedisScript<Boolean> script;
  public boolean checkAndSet(String expectedValue, String newValue) {
    return redisTemplate.execute(script, Collections.singletonList("key"), expectedValue, newValue);
  }
}
 -- checkandset.lua local
 current = redis.call('GET', KEYS[1])
 if current == ARGV[1]
   then redis.call('SET', KEYS[1], ARGV[2])
   return true
 end
 return false

위의 XML은 DefaultRedisScript를 설정하는데 이것은 checkandset.lua라 불리는 파일을 가리키며 boolean값을 반환하기를 기대합니다. resultType는 Long, Boolean, List 나 역직렬화된 값 타입이 되야 합니다. 또한 script가 throw-away status (i.e "OK")를 반환하면 null이 될 수도 있습니다. 당신의 어플리케이션 콘텍스트에 매번 스크립트를 실행할 때마다 SHA1의 재계산을 피하기 위해 DefaultRedisScript의 싱글 인스턴스를 설정하는 것이 이상적입니다.

The XML above configures a DefaultRedisScript pointing to a file called checkandset.lua, which is expected to return a boolean value. The script resultType should be one of Long, Boolean, List, or deserialized value type. It can also be null if the script returns a throw-away status (i.e "OK"). It is ideal to configure a single instance of DefaultRedisScript in your application context to avoid re-calculation of the script’s SHA1 on every script execution.

위의 checkAndSet 메소드는 그러면 th Scripts를 실행하고(th? 레퍼런스 문서 오타인가?) 스크립트는 SessionCallback 의 안에서 트랜잭션이나 파이프라인의 일부로 실행될 수 있습니다. 더 많은 정보를 위해 레디스 트랜잭션 이나 파이프라이닝를 좀 더 보세요~

The checkAndSet method above then executes th Scripts can be executed within a SessionCallback as part of a transaction or pipeline. See Redis Transactions and Pipelining for more information.

SDR에 의해 지원되ㅏ는 스크립팅 지원은 스프링 Task 와 스케쥴러 추상화를 이용하여서, 레디스 스크립트의 주기적인 실행을 하게 해줄수도 있습니다. Spring Framework 문서를 좀 더 살펴보세요

The scripting support provided by Spring Data Redis also allows you to schedule Redis scripts for periodic execution using the Spring Task and Scheduler abstractions. See the Spring Framework documentation for more details.

5.12 . 지원 클래스들
5.12. Support Classes

org.springframework.data.redis.support패키지는 backing store로 레디스를 의존하는 다양한 재사용가능한 컴포넌트를 제공합니다. 현재 저 패키지는 atomic카운터, JDK Collections같은 다양한 JDK기반의 인터페이스 구현체를 레디스 위에서 구현합니다.

Package org.springframework.data.redis.support offers various reusable components that rely on Redis as a backing store. Currently the package contains various JDK-based interface implementations on top of Redis such as atomic counters and JDK Collections.

아토믹 카운터는 Redis 키 증가를 쉽게 wrap하게 해줍니다. 반면에 콜렉션은 저장소나 API의 최소한의 노출시키며, 레디스 키를 쉽게 관리하게 해줍니다. 특별히 RedisSetRedisZSet인터페이스는 intersectionunion같이 레디스에 의해 지원되는 set 작업에 대한 쉬운 접근을 제공합니다. 반면에 RedisListList, QueueDeque 계약(contract) (그리고 그것과 맞먹는 블로킹 silbings)을 레디스 위에서 구현하며, 저장소를 최소한의 설정으로 FIFO (First-In-First-Out), LIFO (Last-In-First-Out)capped collection로 노출시킵니다.

The atomic counters make it easy to wrap Redis key incrementation while the collections allow easy management of Redis keys with minimal storage exposure or API leakage: in particular the RedisSet and RedisZSet interfaces offer easy access to the set operations supported by Redis such as intersection and union while RedisList implements the List, Queue and Deque contracts (and their equivalent blocking siblings) on top of Redis, exposing the storage as a FIFO (First-In-First-Out), LIFO (Last-In-First-Out) or capped collection with minimal configuration:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="queue" class="org.springframework.data.redis.support.collections.DefaultRedisList">
    <constructor-arg ref="redisTemplate"/>
    <constructor-arg value="queue-key"/>
  </bean>

</beans>
public class AnotherExample {

  // injected
  private Deque<String> queue;

  public void addTag(String tag) {
    queue.push(tag);
  }
}
위의 예제에서 나타난 대로, 소비하는 코드는 실제 저장소 구현에서 decoupled 됩니다. 사실 레디스가 밑에서 사용된다는 가리킨다는 어떠한 가리킴도 없습니다. 이것은 development 에서 투명한 production 환경 으로의 이동을 만들며 높은 테스트 가능함을 만들어냅니다. ( Redis 구현은 단지 인메모리one으로 대체 될수 있습니다. (음 조금 발번역? ㅋ 레디스도 그냥 인메모리로, 대체테스트 한다는 것인가?! ) )

As shown in the example above, the consuming code is decoupled from the actual storage implementation - in fact there is no indication that Redis is used underneath. This makes moving from development to production environments transparent and highly increases testability (the Redis implementation can just as well be replaced with an in-memory one).

5.12.1. 스프링 캐쉬 추상화 지원
5.12.1. Support for Spring Cache Abstraction

스프링 레디스는 org.springframework.data.redis.cache패키지를 통해서 스프링 캐쉬 추상화에 대한 구현을 제공합니다. 레디스를 지원 구현으로 사용하기 위해서는 단순히 RedisCacheManager 를 설정에 추가하세요 :

Spring Redis provides an implementation for Spring cache abstraction through the org.springframework.data.redis.cache package. To use Redis as a backing implementation, simply add RedisCacheManager to your configuration:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:cache="http://www.springframework.org/schema/cache"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

  <!-- turn on declarative caching -->
  <cache:annotation-driven />

  <!-- declare Redis Cache Manager -->
  <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager" c:template-ref="redisTemplate"/>
</beans>
기본적으로 RedisCacheManagerCache가 요청될 때마다, 지연적으로 RedisCache를 초기화할 것입니다. 이것은 캐쉬 이름의 Set 을 미리 정의함으로써 바뀔 수 있습니다.
By default RedisCacheManager will lazily initialize RedisCache whenever a Cache is requested. This can be changed by predefining a Set of cache names.
기본적으로는 RedisCacheManager가 어떤 진행중인 트랜잭션에 참여하지 않을 것입니다. setTransactionAware 를 설정해서 트랜잭션 지원을 활성화하세요
By default RedisCacheManager will not participate in any ongoing transaction. Use setTransactionAware to enable transaction support.
By default RedisCacheManager does not prefix keys for cache regions, which can lead to an unexpected growth of a ZSET used to maintain known keys. It’s highly recommended to enable the usage of prefixes in order to avoid this unexpected growth and potential key clashes using more than one cache region.

5.13. Roadmap ahead

SDR프로젝트는 아직 초기단계입니다. 우리는 피드백과 유즈케이스, 당신이 마주칠 패턴들을 아는 데 관심이 많습니다. 그래서 레디스 모듈이 당신의 요구를 좀 더 충족하기를 원합니다. 이전에 언급한 채널(역주 : 링크 null로 깨짐...) 을 이용해서 우리에게 연락주세요. 당신의 연락을 기다립니다.

Spring Data Redis project is in its early stages. We are interested in feedback, knowing what your use cases are, what are the common patters you encounter so that the Redis module better serves your needs. Do contact us using the channels mentioned above, we are interested in hearing from you!

부록

부록 문서 구조

레퍼런스 문서 바깥에의 다양한 부록 문서

Schema는 SDR에 의해 제공되는 스키마를 정의합니다.

Schema defines the schemas provided by Spring Data Redis.

Appendix A: Schema

Core schema

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns="http://www.springframework.org/schema/redis"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tool="http://www.springframework.org/schema/tool"
    targetNamespace="http://www.springframework.org/schema/redis"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">

  <xsd:import namespace="http://www.springframework.org/schema/tool" schemaLocation="http://www.springframework.org/schema/tool/spring-tool.xsd"/>

  <xsd:annotation>
    <xsd:documentation><![CDATA[
Defines the configuration elements for the Spring Data Redis support.
Allows for configuring Redis listener containers in XML 'shortcut' style.
    ]]></xsd:documentation>
  </xsd:annotation>

  <xsd:element name="listener-container">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
Container of Redis listeners. All listeners will be hosted by the same container.
      ]]></xsd:documentation>
      <xsd:appinfo>
        <tool:annotation>
          <tool:exports type="org.springframework.data.redis.listener.RedisMessageListenerContainer"/>
        </tool:annotation>
      </xsd:appinfo>
    </xsd:annotation>
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="listener" type="listenerType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="connection-factory" type="xsd:string" default="redisConnectionFactory">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
A reference to the Redis ConnectionFactory bean.
Default is "redisConnectionFactory".
          ]]></xsd:documentation>
          <xsd:appinfo>
            <tool:annotation kind="ref">
              <tool:expected-type type="org.springframework.data.redis.connection.ConnectionFactory"/>
            </tool:annotation>
          </xsd:appinfo>
        </xsd:annotation>
      </xsd:attribute>
      <xsd:attribute name="task-executor" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
A reference to a Spring TaskExecutor (or standard JDK 1.5 Executor) for executing
Redis listener invokers. Default is a SimpleAsyncTaskExecutor.
          ]]></xsd:documentation>
          <xsd:appinfo>
            <tool:annotation kind="ref">
              <tool:expected-type type="java.util.concurrent.Executor"/>
            </tool:annotation>
          </xsd:appinfo>
        </xsd:annotation>
      </xsd:attribute>
      <xsd:attribute name="subscription-task-executor" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
A reference to a Spring TaskExecutor (or standard JDK 1.5 Executor) for listening
to Redis messages. By default reuses the 'task-executor' value.
          ]]></xsd:documentation>
          <xsd:appinfo>
            <tool:annotation kind="ref">
              <tool:expected-type type="java.util.concurrent.Executor"/>
            </tool:annotation>
          </xsd:appinfo>
        </xsd:annotation>
      </xsd:attribute>
      <xsd:attribute name="topic-serializer" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
A reference to the RedisSerializer strategy for converting Redis channels/patterns to
serialized format. Default is a StringRedisSerializer.
          ]]></xsd:documentation>
          <xsd:appinfo>
            <tool:annotation kind="ref">
              <tool:expected-type type="org.springframework.data.redis.serializer.RedisSerializer"/>
            </tool:annotation>
          </xsd:appinfo>
        </xsd:annotation>
      </xsd:attribute>
      <xsd:attribute name="phase" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
The lifecycle phase within which this container should start and stop. The lower
the value the earlier this container will start and the later it will stop. The
default is Integer.MAX_VALUE meaning the container will start as late as possible
and stop as soon as possible.
          ]]></xsd:documentation>
        </xsd:annotation>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name="listenerType">
    <xsd:attribute name="ref" type="xsd:string" use="required">
      <xsd:annotation>
        <xsd:documentation><![CDATA[
  The bean name of the listener object, implementing
  the MessageListener interface or defining the specified listener method.
  Required.
        ]]></xsd:documentation>
        <xsd:appinfo>
          <tool:annotation kind="ref"/>
        </xsd:appinfo>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="topic" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation><![CDATA[
The topics(s) to which the listener is subscribed. Can be (in Redis terminology) a
channel or/and a pattern. Multiple values can be specified by separating them with
spaces. Patterns can be specified by using the '*' character.
        ]]></xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="method" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation><![CDATA[
The name of the listener method to invoke. If not specified,
the target bean is supposed to implement the MessageListener
interface or provide a method named 'handleMessage'.
        ]]></xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="serializer" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation><![CDATA[
A reference to the RedisSerializer strategy for converting Redis Messages to
listener method arguments. Default is a StringRedisSerializer.
        ]]></xsd:documentation>
        <xsd:appinfo>
          <tool:annotation kind="ref">
            <tool:expected-type type="org.springframework.data.redis.serializer.RedisSerializer"/>
          </tool:annotation>
        </xsd:appinfo>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>

  <xsd:element name="collection">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
Factory creating collections on top of Redis keys.
      ]]></xsd:documentation>
      <xsd:appinfo>
        <tool:annotation>
          <tool:exports type="org.springframework.data.redis.support.collections.RedisCollectionFactoryBean"/>
        </tool:annotation>
      </xsd:appinfo>
    </xsd:annotation>
    <xsd:complexType>
	  <xsd:attribute name="id" type="xsd:ID">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
The name of the Redis collection.]]></xsd:documentation>
		</xsd:annotation>
	  </xsd:attribute>
      <xsd:attribute name="key" type="xsd:string" use="optional">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
Redis key of the created collection. Defaults to bean id.
          ]]></xsd:documentation>
        </xsd:annotation>
      </xsd:attribute>
      <xsd:attribute name="template" type="xsd:string" default="redisTemplate">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
A reference to a RedisTemplate bean.Default is "redisTemplate".
          ]]></xsd:documentation>
          <xsd:appinfo>
            <tool:annotation kind="ref">
              <tool:expected-type type="org.springframework.data.redis.core.RedisTemplate"/>
            </tool:annotation>
          </xsd:appinfo>
        </xsd:annotation>
      </xsd:attribute>
      <xsd:attribute name="type" default="LIST" use="optional">
        <xsd:annotation>
          <xsd:documentation><![CDATA[
The collection type (default is list).
If the key exists, its type takes priority. The type is used to disambiguate the collection type (map vs properties) or
specify one in case the key is missing.]]></xsd:documentation>
        </xsd:annotation>
        <xsd:simpleType>
        	<xsd:restriction base="xsd:string">
        		<xsd:enumeration value="LIST"/>
        		<xsd:enumeration value="SET"/>
        		<xsd:enumeration value="ZSET"/>
        		<xsd:enumeration value="MAP"/>
        		<xsd:enumeration value="PROPERTIES"/>
        	</xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Appendix B: Command Reference

Supported commands

Table 2. Redis commands supported by RedisTemplate.
Command Template Support

APPEND

X

AUTH

X

BGREWRITEAOF

X

BGSAVE

X

BITCOUNT

X

BITOP

X

BLPOP

X

BRPOP

X

BRPOPLPUSH

X

CLIENT KILL

X

CLIENT GETNAME

X

CLIENT LIST

X

CLIENT SETNAME

X

CLUSTER SLOTS

-

COMMAND

-

COMMAND COUNT

-

COMMAND GETKEYS

-

COMMAND INFO

-

CONFIG GET

X

CONFIG RESETSTAT

X

CONFIG REWRITE

-

CONFIG SET

X

DBSIZE

X

DEBUG OBJECT

-

DEBUG SEGFAULT

-

DECR

X

DECRBY

X

DEL

X

DISCARD

X

DUMP

X

ECHO

X

EVAL

X

EVALSHA

X

EXEC

X

EXISTS

X

EXPIRE

X

EXPIREAT

X

FLUSHALL

X

FLUSHDB

X

GET

X

GETBIT

X

GETRANGE

X

GETSET

X

HDEL

X

HEXISTS

X

HGET

X

HGETALL

X

HINCRBY

X

HINCRBYFLOAT

X

HKEYS

X

HLEN

X

HMGET

X

HMSET

X

HSCAN

X

HSET

X

HSETNX

X

HVALS

X

INCR

X

INCRBY

X

INCRBYFLOAT

X

INFO

X

KEYS

X

LASTSAVE

X

LINDEX

X

LINSERT

X

LLEN

X

LPOP

X

LPUSH

X

LPUSHX

X

LRANGE

X

LREM

X

LSET

X

LTRIM

X

MGET

X

MIGRATE

-

MONITOR

-

MOVE

X

MSET

X

MSETNX

X

MULTI

X

OBJECT

-

PERSIST

X

PEXIPRE

X

PEXPIREAT

X

PFADD

X

PFCOUNT

X

PFMERGE

X

PING

X

PSETEX

X

PSUBSCRIBE

X

PTTL

X

PUBLISH

X

PUBSUB

-

PUBSUBSCRIBE

-

QUIT

X

RANDOMKEY

X

RENAME

X

RENAMENX

X

RESTORE

X

ROLE

-

RPOP

X

RPOPLPUSH

X

RPUSH

X

RPUSHX

X

SADD

X

SAVE

X

SCAN

X

SCARD

X

SCRIPT EXITS

X

SCRIPT FLUSH

X

SCRIPT KILL

X

SCRIPT LOAD

X

SDIFF

X

SDIFFSTORE

X

SELECT

X

SENTINEL FAILOVER

X

SENTINEL GET-MASTER-ADD-BY-NAME

-

SENTINEL MASTER

-

SENTINEL MASTERS

X

SENTINEL MONITOR

X

SENTINEL REMOVE

X

SENTINEL RESET

-

SENTINEL SET

-

SENTINEL SLAVES

X

SET

X

SETBIT

X

SETEX

X

SETNX

X

SETRANGE

X

SHUTDOWN

X

SINTER

X

SINTERSTORE

X

SISMEMBER

X

SLAVEOF

X

SLOWLOG

-

SMEMBERS

X

SMOVE

X

SORT

X

SPOP

X

SRANDMEMBER

X

SREM

X

SSCAN

X

STRLEN

X

SUBSCRIBE

X

SUNION

X

SUNIONSTORE

X

SYNC

-

TIME

X

TTL

X

TYPE

X

UNSUBSCRIBE

X

UNWATCH

X

WATCH

X

ZADD

X

ZCARD

X

ZCOUNT

X

ZINCRBY

X

ZINTERSTORE

X

ZLEXCOUNT

-

ZRANGE

X

ZRANGEBYLEX

-

ZREVRANGEBYLEX

-

ZRANGEBYSCORE

X

ZRANK

X

ZREM

X

ZREMRANGEBYLEX

-

ZREMRANGEBYRANK

X

ZREVRANGE

X

ZREVRANGEBYSCORE

X

ZREVRANK

X

ZSCAN

X

ZSCORE

X

ZUNINONSTORE

X

댓글