一文讀懂 Spring 集成 Redis

前言

關於 Redis已然是爛大街的技術了,但是近日新起了一個項目需要集成 Redis,看了一下之前的封裝實在是不怎麼優雅,於是查了一下發現了一個非常簡單的解決方案,那就是 Spring家族的 SpringDataRedis。話不多說直接“上碼”:

Spring Data Redis 介紹

Spring Data Redis是Spring Data系列的一部分,它可以輕鬆地使得Spring應用程序配置和訪問Redis。

快速搭建 Spring Data Redis

直接可以參照官方地址進行配置,以往的 Spring的文檔都寫着預計閱讀時間,這個沒有寫你就知道有多簡單啦。你可以直接點擊查看官方文檔,或者往下閱讀。 Maven直接引入如下依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.8.8.RELEASE</version>
    </dependency>
</dependencies><repositories>
    <repository>
        <id>spring-libs-release</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/libs-release</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

然後直接在 Spring的配置文件裏面定義 bean就可以了,官方沒有說怎麼配置 hostname等等,但是點擊 JedisConnectionFactory裏面一看就知道了,直接添加一行 p:host-name="172.10.23.234"即可。

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

<!-- redis template definition -->
<bean id="redisTemplate" 
    class="org.springframework.data.redis.core.RedisTemplate" 
    p:connection-factory-ref="jedisConnFactory"/>

最後直接引入 bean使用:

public class Example {

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

    // inject the template as ListOperations
    // can also inject as Value, Set, ZSet, and HashOperations
    @Resource(name="redisTemplate")
    private ListOperations<String, String> listOps;

    public void addLink(String userId, URL url) {
        listOps.leftPush(userId, url.toExternalForm());
        // or use template directly
        redisTemplate.boundListOps(userId).leftPush(url.toExternalForm());
    }
}

如上,根據 Spring的官方文檔已經全部完成,是不是非常簡單?那麼接下來我們運行一下試一試。 這時候出現了第一個異常。

NoClassDefFoundError 問題解決

nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig

很明顯是沒有引入這個包嘛,我們直接從 spring-data-redis的 pom.xml裏面可以看到多了一個 optional屬性。

<dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <optional>true</optional>
    </dependency>

那麼這個問題就迎刃而解了,因爲在 spring-data-redis裏面聲明的 commons-pool2是 optional的,根據 Maven的規則如果A項目依賴配置爲optional的,那麼依賴A項目的B項目如果不手動引入A裏面optional的依賴B項目是不會自動引入依賴的的。說起來有點繞,反正就是導致我們必須手動添加下面的依賴。詳情可以參照 Maven的官方網文檔。點擊查看官方文檔。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.2</version>
</dependency>

再次運行的時候我們發現了另一個問題

nested exception is java.lang.NoClassDefFoundError: redis/clients/jedis/JedisPoolConfig

這問題就顯而易見了,直接添加如下到 pom.xml中即可。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

這時候我們再次運行項目可以正常運行啦,然而有出現了一個奇怪的問題,存入 Redis裏面的 Key有一個看起來像是亂碼的前綴 \xac\xed\x00\x05t\x00:

\xac\xed\x00\x05t\x00 到底是啥

出現這個問題的原因是因爲其使用的默認是RedisTemplate,它使用的是Java的Serialization方式,所以會在前面有一段類似亂碼的東西。如果是String作爲key的話可以直接修改爲StringRedisTemplate這個問題就修改了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章