天天看點

Spring認證中國教育管理中心-Spring Data Redis架構教程一

原标題:Spring認證中國教育管理中心-Spring Data Redis架構教程一

8.1.檔案結構

參考文檔的這一部分解釋了 Spring Data Redis 提供的核心功能。它解釋了鍵值子產品的概念和語義以及各種商店命名空間的文法。有關鍵值存儲、Spring 或 Spring Data 示例的介紹,請參閱學習 NoSQL 和鍵值存儲。本文檔僅涉及 Spring Data Redis 支援,并假設使用者熟悉鍵值存儲和 Spring 概念。

“ Redis 支援”介紹了 Redis 子產品功能集。

“ Redis Repositories ”介紹了對Redis的存儲庫支援。

本文檔是 Spring Data Redis (SDR) 支援的參考指南。

  1. 為什麼使用 Spring Data Redis?

Spring Framework 是領先的全棧 Java/JEE 應用程式架構。它通過使用依賴注入、AOP 和可移植服務抽象提供了一個輕量級容器和一個非侵入式程式設計模型。

NoSQL存儲系統提供了經典 RDBMS 的替代方案,以實作水準可擴充性和速度。在實作方面,鍵值存儲代表 NoSQL 空間中最大(也是最古老)的成員之一。

Spring Data Redis (SDR) 架構通過 Spring 出色的基礎架構支援消除了與存儲互動所需的備援任務和樣闆代碼,進而可以輕松編寫使用 Redis 鍵值存儲的 Spring 應用程式。

  1. Redis 支援

Spring Data 支援的鍵值存儲之一是Redis。引用Redis項目首頁:

Redis 是一種進階鍵值存儲。它與 memcached 類似,但資料集不是易失性的,值可以是字元串,就像在 memcached 中一樣,但也可以是清單、集合和有序集合。所有這些資料類型都可以通過原子操作進行操作,以推送/彈出元素、添加/删除元素、執行伺服器端并集、交集、集合之間的差異等。Redis 支援不同種類的排序能力。

Spring Data Redis 提供了從 Spring 應用程式輕松配置和通路 Redis 的功能。它提供了用于與商店互動的低級和進階抽象,使使用者擺脫了對基礎設施的擔憂。

10.1.入門

設定工作環境的一種簡單方法是在STS 中建立一個基于 Spring 的項目。

首先,您需要設定一個正在運作的 Redis 伺服器。

在 STS 中建立一個 Spring 項目:

轉至檔案 → 建立 → Spring 模闆項目 → 簡單 Spring 實用程式項目,并在出現提示時按是。然後輸入項目和包名稱,例如org.spring.redis.example. . 将以下内容添加到 pom.xml 檔案dependencies元素:org.springframework.dataspring-data-redis2.6.0

将 pom.xml 中 Spring 的版本改為<spring.framework.version>5.3.13</spring.framework.version>

将 Maven 的 Spring Milestone 存儲庫的以下位置添加到您pom.xml的<dependencies/>元素中,使其與您的元素處于同一級别:spring-milestoneSpring Maven MILESTONE Repository

https://repo.spring.io/libs-milestone

存儲庫也可在此處浏覽。

10.2.Redis 要求

Spring Redis 需要 Redis 2.6 或更高版本,并且 Spring Data Redis 與Lettuce和Jedis內建,這兩個流行的 Redis 開源 Java 庫。

10.3.Redis 支援進階視圖

Redis 支援提供了幾個元件。對于大多數任務,進階抽象和支援服務是最佳選擇。請注意,您可以在任何時候在層之間移動。例如,您可以獲得一個低級連接配接(甚至是本機庫)來直接與 Redis 通信。

10.4.連接配接到Redis

使用 Redis 和 Spring 時的首要任務之一是通過 IoC 容器連接配接到存儲。為此,需要一個 Java 連接配接器(或綁定)。無論你選擇的圖書館,你隻需要使用一組春天Redis的資料的API(這在所有連接配接器一緻的行為):在

org.springframework.data.redis.connection包及其RedisConnection并RedisConnectionFactory與工作和檢索到Redis的活動連接配接接口。

10.4.1.RedisConnection 和 RedisConnectionFactory

RedisConnection為 Redis 通信提供核心建構塊,因為它處理與 Redis 後端的通信。它還自動将底層連接配接庫異常轉換為 Spring 一緻的 DAO 異常層次結構,以便您可以在不更改任何代碼的情況下切換連接配接器,因為操作語義保持不變。

對于需要本機庫 API 的極端情況,RedisConnection提供了一個專用方法 ( getNativeConnection),該方法傳回用于通信的原始底層對象。

活動RedisConnection對象是通過RedisConnectionFactory. 此外,工廠充當

PersistenceExceptionTranslator對象,這意味着一旦聲明,它們就可以讓您進行透明的異常轉換。例如,您可以通過使用@Repository注解和 AOP進行異常翻譯。有關更多資訊,請參閱Spring Framework 文檔中的專用部分。

根據底層配置,工廠可以傳回新連接配接或現有連接配接(當使用池或共享本機連接配接時)。

使用 a 的最簡單方法RedisConnectionFactory是通過 IoC 容器配置适當的連接配接器并将其注入 using 類。

不幸的是,目前并非所有連接配接器都支援所有 Redis 功能。當在底層庫不支援的 Connection API 上調用方法時,

UnsupportedOperationException會抛出an 。以下概述說明了各個 Redis 連接配接器支援的功能:

Spring認證中國教育管理中心-Spring Data Redis架構教程一

10.4.2.配置生菜連接配接器

Lettuce是Spring Data Redis 通過包支援的基于Netty的開源連接配接器

org.springframework.data.redis.connection.lettuce。

将以下内容添加到 pom.xml 檔案dependencies元素:

<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.1.5.RELEASE</version>           

以下示例顯示了如何建立新的 Lettuce 連接配接工廠:

@Configuration

class AppConfig {

@Bean

public LettuceConnectionFactory redisConnectionFactory() {

return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));           

}

還有一些特定于生菜的連接配接參數可以調整。預設情況下,LettuceConnection由 所建立的所有執行個體LettuceConnectionFactory為所有非阻塞和非事務性操作共享相同的線程安全本機連接配接。要每次使用專用連接配接,請設定shareNativeConnection為false。如果設定為 ,LettuceConnectionFactory也可以配置為使用 aLettucePool用于池化阻塞和事務連接配接或所有連接配接。

shareNativeConnectionfalse

Lettuce 與 Netty 的原生傳輸內建,讓您可以使用 Unix 域套接字與 Redis 進行通信。確定包含與您的運作時環境比對的适當本機傳輸依賴項。以下示例顯示了如何為 Unix 域套接字建立生菜連接配接工廠/var/run/redis.sock:

return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock"));           

Netty 目前支援用于作業系統原生傳輸的 epoll (Linux) 和 kqueue (BSD/macOS) 接口。

10.4.3.配置 Jedis 連接配接器

Jedis是 Spring Data Redis 子產品通過

org.springframework.data.redis.connection.jedis包支援的社群驅動的連接配接器。

<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>           

Jedis 配置最簡單的形式如下:

public JedisConnectionFactory redisConnectionFactory() {

return new JedisConnectionFactory();           

但是,對于生産用途,您可能需要調整主機或密碼等設定,如以下示例所示:

class RedisConfiguration {

RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
return new JedisConnectionFactory(config);           

10.4.4.寫入主伺服器,從副本讀取

Redis 主/副本設定——沒有自動故障轉移(關于自動故障轉移,請參閱:哨兵)——不僅允許資料安全地存儲在更多節點上。它還允許通過使用Lettuce從副本讀取資料,同時将寫入推送到主伺服器。您可以使用 設定要使用的讀/寫政策,

LettuceClientConfiguration如下例所示:

class WriteToMasterReadFromReplicaConfiguration {

LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
  .readFrom(REPLICA_PREFERRED)
  .build();

RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("server", 6379);

return new LettuceConnectionFactory(serverConfig, clientConfig);           

對于通過INFO指令報告非公共位址的環境(例如,在使用 AWS 時),請使用

RedisStaticMasterReplicaConfiguration代替RedisStandaloneConfiguration。請注意,RedisStaticMasterReplicaConfiguration由于缺少跨單個伺服器的 Pub/Sub 消息傳播,是以不支援 Pub/Sub。

10.5.Redis 哨兵支援

對于處理高可用Redis,Spring Data Redis 已經支援Redis Sentinel,使用

RedisSentinelConfiguration,如下例所示:

/**

  • Jedis

*/

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);

  • Lettuce

public RedisConnectionFactory lettuceConnectionFactory() {

return new LettuceConnectionFactory(sentinelConfig);

RedisSentinelConfiguration也可以用 a 定義PropertySource,它允許您設定以下屬性:

配置屬性

spring.redis.sentinel.master: 主節點的名稱。

spring.redis.sentinel.nodes: 逗号分隔的主機:端口對清單。

spring.redis.sentinel.password: 使用 Redis Sentinel 進行身份驗證時應用的密碼

有時,需要與其中一個哨兵直接互動。使用

RedisConnectionFactory.getSentinelConnection()或RedisConnection.getSentinelCommands()允許您通路配置的第一個活動 Sentinel。

10.6.通過 RedisTemplate 處理對象

大多數使用者可能會使用RedisTemplate及其對應的包,

org.springframework.data.redis.core. 由于其豐富的功能集,模闆實際上是 Redis 子產品的中心類。該模闆為 Redis 互動提供了進階抽象。雖然RedisConnection提供接受和傳回二進制值(byte數組)的低級方法,但模闆負責序列化和連接配接管理,使使用者免于處理此類細節。

此外,模闆提供操作視圖(遵循 Redis 指令參考中的分組),提供豐富的通用接口,用于針對特定類型或特定鍵(通過KeyBound接口)工作,如下表所述:

配置後,模闆是線程安全的,可以跨多個執行個體重複使用。

RedisTemplate大多數操作使用基于 Java 的序列化程式。這意味着模闆寫入或讀取的任何對象都通過 Java 進行序列化和反序列化。您可以更改模闆上的序列化機制,Redis 子產品提供了多種實作,可在

org.springframework.data.redis.serializer包中使用。有關更多資訊,請參閱序列化程式。您還可以将任何序列化程式設定為 null 并通過将enableDefaultSerializer屬性設定為 RedisTemplate 與原始位元組數組false。請注意,模闆要求所有鍵都為非空。但是,隻要底層序列化程式接受它們,值就可以為空。閱讀每個序列化程式的 Javadoc 以擷取更多資訊。

對于需要某個模闆視圖的情況,将視圖聲明為依賴項并注入模闆。容器自動執行轉換,消除opsFor[X]調用,如以下示例所示:

<?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

https://www.springframework.org/schema/beans/spring-beans.xs

d">

...

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());           

10.7.以字元串為中心的便利課程

由于存儲在 Redis 中的鍵和值很常見java.lang.String,是以 Redis 子產品提供了RedisConnection和 的兩個擴充RedisTemplate,分别是StringRedisConnection(及其

DefaultStringRedisConnection實作)和StringRedisTemplate作為密集字元串操作的便捷一站式解決方案。除了綁定到String鍵之外,模闆和連接配接使用StringRedisSerializer底層,這意味着存儲的鍵和值是人類可讀的(假設在 Redis 和您的代碼中使用相同的編碼)。以下清單顯示了一個示例:

@Autowired

private StringRedisTemplate redisTemplate;

redisTemplate.opsForList().leftPush(userId, url.toExternalForm());           

由于與其他Spring模闆,RedisTemplate并StringRedisTemplate讓你直接通過交談Redis的RedisCallback界面。此功能可讓您完全控制,因為它直接與RedisConnection. 請注意,回調接收使用StringRedisConnectiona 時的執行個體StringRedisTemplate。以下示例顯示了如何使用該RedisCallback接口:

public void useCallback() {

redisTemplate.execute(new RedisCallback

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

});

10.8.序列化器

從架構的角度來看,Redis 中存儲的資料隻有位元組。雖然 Redis 本身支援各種類型,但在大多數情況下,這些類型指的是資料的存儲方式,而不是它所代表的内容。由使用者決定是否将資訊轉換為字元串或任何其他對象。

在 Spring Data 中,使用者(自定義)類型和原始資料(反之亦然)之間的轉換在

org.springframework.data.redis.serializer包中由 Redis 處理。

這個包包含兩種類型的序列化器,顧名思義,它們負責序列化過程:

基于RedisSerializer.

使用RedisElementReader和 的元素讀取器和寫入器RedisElementWriter。

這些變體之間的主要差別在于,RedisSerializer主要是byte[]在讀者和作者使用ByteBuffer.

有多種實作可用(包括本文檔中已經提到的兩種):

JdkSerializationRedisSerializer,預設情況下用于RedisCache和RedisTemplate。

的StringRedisSerializer。

但是,可以OxmSerializer通過 Spring OXM支援用于對象/XML 映射,

Jackson2JsonRedisSerializer或GenericJackson2JsonRedisSerializer用于以JSON格式存儲資料。

請注意,存儲格式不僅限于值。它可以用于鍵、值或散列,沒有任何限制。

預設情況下,RedisCache并RedisTemplate配置為使用 Java 本機序列化。Java 本機序列化以允許運作由利用易受攻擊的庫和類注入未經驗證的位元組碼的有效載荷引起的遠端代碼而聞名。操縱輸入可能會導緻在反序列化步驟期間在應用程式中運作不需要的代碼。是以,不要在不受信任的環境中使用序列化。通常,我們強烈建議您改用任何其他消息格式(例如 JSON)。

如果您擔心 Java 序列化導緻的安全漏洞,請考慮核心 JVM 級别的通用序列化過濾器機制,該機制最初是為 JDK 9 開發的,但後來移植到 JDK 8、7 和 6:

過濾傳入的序列化資料。

JEP 290。

OWASP:不可信資料的反序列化。

10.9.哈希映射

可以使用Redis 中的各種資料結構來存儲資料。

Jackson2JsonRedisSerializer可以轉換JSON格式的對象。理想情況下,可以使用普通鍵将 JSON 存儲為值。您可以通過使用 Redis 哈希來實作更複雜的結構化對象映射。Spring Data Redis 提供了各種将資料映射到哈希的政策(取決于用例):

直接映射,通過使用HashOperations和序列化程式

使用Redis 存儲庫

使用HashMapper和HashOperations

10.9.1.哈希映射器

哈希映射器是映射對象到 aMap<K, V>和傳回的轉換器。HashMapper旨在與 Redis 哈希一起使用。

有多種實作可用:

BeanUtilsHashMapper使用 Spring 的BeanUtils。

ObjectHashMapper使用對象到哈希映射。

Jackson2HashMapper使用FasterXML Jackson。

以下示例顯示了一種實作哈希映射的方法:

public class Person {

String firstname;

String lastname;

// …

public class HashMapping {

HashOperations<String, byte[], byte[]> hashOperations;

HashMapper<Object, byte[], byte[]> mapper = new ObjectHashMapper();

public void writeHash(String key, Person person) {

Map<byte[], byte[]> mappedHash = mapper.toHash(person);
hashOperations.putAll(key, mappedHash);           

public Person loadHash(String key) {

Map<byte[], byte[]> loadedHash = hashOperations.entries("key");
return (Person) mapper.fromHash(loadedHash);           

10.9.2.Jackson2HashMapper

Jackson2HashMapper使用FasterXML Jackson為域對象提供 Redis 哈希映射。 Jackson2HashMapper可以将頂級屬性映射為哈希字段名稱,并且可以選擇将結構展平。簡單類型映射到簡單值。複雜類型(嵌套對象、集合、映射等)表示為嵌套 JSON。

展平為所有嵌套屬性建立單獨的哈希條目,并盡可能将複雜類型解析為簡單類型。

考慮以下類及其包含的資料結構:

Address address;

Date date;

LocalDateTime localDateTime;

public class Address {

String city;

String country;

下表顯示了前面類中的資料在法線映射中的顯示方式:

扁平化要求所有屬性名稱不幹擾 JSON 路徑。使用展平時,不支援在映射鍵中或作為屬性名稱使用點或括号。生成的散列無法映射回對象。

java.util.Date并java.util.Calendar以毫秒表示。如果 JSR-310 日期/時間類型在類路徑上,toString則将其序列化為其形式jackson-datatype-jsr310。

10.10.Redis 消息傳遞(釋出/訂閱)

Spring Data 為 Redis 提供了專用的消息傳遞內建,在功能和命名上類似于 Spring Framework 中的 JMS 內建。

Redis 消息傳遞大緻可以分為兩個方面的功能:

消息的釋出或制作

消息的訂閱或消費

這是通常稱為釋出/訂閱(簡稱 Pub/Sub)的模式示例。所述RedisTemplate類用于消息生成。對于類似于 Java EE 的消息驅動 bean 樣式的異步接收,Spring Data 提供了一個專用的消息偵聽器容器,用于建立消息驅動的 POJO(MDP)以及用于同步接收的RedisConnection合約。

org.springframework.data.redis.connection和org.springframework.data.redis.listener軟體包提供了對Redis的消息的核心功能。

10.10.1.釋出(發送消息)

要釋出消息,您可以像其他操作一樣使用低級RedisConnection或進階RedisTemplate. 兩個實體都提供了publish接受消息和目标通道作為參數的方法。雖然RedisConnection需要原始資料(位元組數組),但RedisTemplate允許将任意對象作為消息傳入,如下例所示:

// send message through connection RedisConnection con = ...

byte[] msg = ...

byte[] channel = ...

con.publish(msg, channel); // send message through RedisTemplate

RedisTemplate template = ...

template.convertAndSend("hello!", "world");

10.10.2.訂閱(接收消息)

在接收端,可以通過直接命名或使用模式比對來訂閱一個或多個頻道。後一種方法非常有用,因為它不僅允許使用一個指令建立多個訂閱,而且還可以偵聽訂閱時尚未建立的頻道(隻要它們比對模式)。

在底層,RedisConnection提供subscribe和pSubscribe方法,分别映射 Redis 指令以按頻道或按模式訂閱。請注意,可以使用多個通道或模式作為參數。要更改連接配接的訂閱或查詢它是否正在偵聽,RedisConnection提供getSubscription和isSubscribed方法。

Spring Data Redis 中的訂閱指令被阻塞。也就是說,在連接配接上調用 subscribe 會導緻目前線程在開始等待消息時阻塞。隻有在取消訂閱時才會釋放線程,這發生在另一個線程調用unsubscribe或pUnsubscribe在同一連接配接上。有關此問題的解決方案,請參閱“消息偵聽器容器”(本文檔的後面部分)。

如前所述,一旦訂閱,連接配接就會開始等待消息。僅允許添加新訂閱、修改現有訂閱和取消現有訂閱的指令。調用比其他任何東西subscribe,pSubscribe,unsubscribe,或pUnsubscribe抛出異常。

為了訂閱消息,需要實作MessageListener回調。每次有新消息到達時,都會調用回調并通過該onMessage方法運作使用者代碼。該接口不僅可以通路實際消息,還可以通路通過它接收到的通道以及訂閱用于比對通道的模式(如果有)。此資訊使被調用者不僅可以通過内容而且還可以檢查其他詳細資訊來區分各種消息。

消息偵聽器容器

由于其阻塞性質,低級訂閱沒有吸引力,因為它需要對每個監聽器進行連接配接和線程管理。為了緩解這個問題,Spring Data 提供了

RedisMessageListenerContainer,它完成了所有繁重的工作。如果您熟悉 EJB 和 JMS,您應該會發現這些概念很熟悉,因為它被設計為盡可能接近 Spring Framework 及其消息驅動的 POJO (MDP) 中的支援。

RedisMessageListenerContainer充當消息偵聽器容器。它用于從 Redis 通道接收消息并驅動MessageListener注入其中的執行個體。偵聽器容器負責消息接收的所有線程并分派到偵聽器中進行處理。消息偵聽器容器是 MDP 和消息提供者之間的中介,負責注冊接收消息、資源擷取和釋放、異常轉換等。這讓您作為應用程式開發人員可以編寫與接收消息(并對其作出反應)相關的(可能很複雜)業務邏輯,并将樣闆 Redis 基礎設施問題委托給架構。

MessageListener

還可以實作

SubscriptionListener

以在訂閱/取消訂閱确認時接收通知。同步調用時,偵聽訂閱通知很有用。

此外,為了最大限度地減少應用程式占用空間,

RedisMessageListenerContainer即使多個偵聽器不共享訂閱,也可以讓它們共享一個連接配接和一個線程。是以,無論應用程式跟蹤多少個偵聽器或通道,運作時成本在其整個生命周期中都保持不變。此外,容器允許運作時配置更改,以便您可以在應用程式運作時添加或删除偵聽器,而無需重新啟動。此外,容器使用惰性訂閱方法,RedisConnection僅在需要時使用。如果所有偵聽器都取消訂閱,則自動執行清理,并釋放線程。

為了幫助處理消息的異步特性,容器需要一個

java.util.concurrent.Executor(或 Spring 的TaskExecutor)來分派消息。根據負載、偵聽器的數量或運作時環境,您應該更改或調整執行程式以更好地滿足您的需求。特别是在托管環境(例如應用伺服器)中,強烈建議選擇一個合适的TaskExecutor來利用其運作時。

MessageListenerAdapter

本MessageListenerAdapter類是Spring的異步支援消息的最後一個元件。簡而言之,它允許您将幾乎任何類公開為 MDP(盡管有一些限制)。

考慮以下接口定義:

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);

}

注意,雖然接口沒有擴充MessageListener接口,但通過使用MessageListenerAdapter類,它仍然可以用作MDP 。還要注意如何使用各種消息處理方法是根據強類型的内容不同的Message類型,他們可以接收和處理。此外,消息發送到的通道或模式可以作為 type 的第二個參數傳遞給方法String:

public class DefaultMessageDelegate implements MessageDelegate {

// implementation elided for clarity...

注意上面的MessageDelegate接口實作(上面的DefaultMessageDelegate類)完全沒有Redis 依賴。它确實是一個 POJO,我們使用以下配置将其制成 MDP:

<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

https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/redis

https://www.springframework.org/schema/redis/spring-redis.xsd">

<redis:listener-container>

<redis:listener ref="listener" method="handleMessage" topic="chatroom" />

</redis:listener-container>

...

偵聽器主題可以是頻道(例如,topic="chatroom")或模式(例如,topic="*room")

上面的例子使用Redis命名空間來聲明消息監聽容器并自動将POJO注冊為監聽器。完整的 bean 定義如下:

<bean class="redisexample.DefaultMessageDelegate"/>           
<map>
  <entry key-ref="messageListener">
    <bean class="org.springframework.data.redis.listener.ChannelTopic">
      <constructor-arg value="chatroom"/>
    </bean>
  </entry>
</map>           

每次接收到消息時,擴充卡都會自動透明地執行(使用配置的RedisSerializer)低級格式和所需對象類型之間的轉換。任何由方法調用引起的異常都會被容器捕獲并處理(預設情況下,異常會被記錄)。