使用Spring Data Redis 實現訂閱/釋出

wtopps發表於2017-06-08

Redis

Redis是一個key-value的儲存系統,提供的key-value的資料介面,其效能非常的出色,一般常用作快取使用,但是其除了可以作為快取之外,自身也提供了一套訂閱/釋出的系統。

Spring Data Redis

Spring Data Redis是Spring的一套框架,提供了Redis 的各種操作,可以讓我們便捷的操作Redis,本文介紹一下基於Spring Data Redis實現的訂閱/釋出(pub/sub)系統。

PUB/SUB

Spring Data Redis中對Redis的操作是通過Spring封裝的一個redisTemplate實現的,在spring的配置檔案中進行一些相關的Redis配置資訊即可使用。

Spring配置:

<!-- 定義Spring Redis連線工廠 -->
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="${redis.url}" />
    <property name="port" value="${redis.port}" />
    <property name="password" value="${redis.password}" />
    <property name="database" value="0" />
    <property name="usePool" value="true" />
</bean>

<!-- 定義Spring RedisTemplate -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
          p:connectionFactory-ref="redisConnectionFactory"/>

<bean id="redisService" class="com.test.redis.impl.RedisServicempl">
    <property name="redisTemplate" ref="redisTemplate" />
</bean>

<!-- 定義Spring Redis的序列化器 -->
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />

<bean id="jsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />

<!-- 定義Redis 監聽類 -->
<bean id="dataSyncEventListener" class="com.test.redis.DataSyncEventListener" />

<!-- 註冊Redis訊息訂閱的監聽器 -->
<redis:listener-container>
        <redis:listener ref="dataSyncEventListener" serializer="jsonRedisSerializer" method="onMessage" topic="topic" />
</redis:listener-container>

在這裡,需要一點注意,訂閱訊息的監聽類,可以實現MessageListener介面或MessageDelegateListener介面,如何不想實現任何介面,則需要在method指定“handleMessage”方法名,並自己實現handleMessage方法。

Redis操作類:

public class RedisServiceImpl implements RedisService {

    @AutoWired
    private RedisTemplate<String, Object> redisTemplate;

    @Override
    public void sendMessage(String channel, Serializable message) {
        redisTemplate.convertAndSend(channel, message);
    }
}

可以看到,通過這個 sendMessage方法,可以把一條可序列化的訊息傳送到channel頻道,訂閱者只要訂閱了這個channel,他就會接收發布者釋出的訊息.。

訊息監聽類:

public class DataSyncEventListener implements MessageListener {
    @Autowired
    private RedisSerializer<String> stringRedisSerializer;

    @Autowired
    private RedisSerializer<Object> jsonRedisSerializer;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String channel = stringRedisSerializer.deserialize(message.getChannel());
        Object object = jsonRedisSerializer.deserialize(message.getBody());
        System.out.println("channel is :" + channel);
        System.out.println("message is :" + object.toString);
    }
}

當然有了釋出訊息的sendMessage,也得有個接收訊息的Listener,用於接收訂閱到的訊息。

這樣,Redis的PUB/SUB訂閱釋出系統就配置完成了。

相關文章