一文讀懂Spring整合Redis

技術小能手發表於2018-11-05

前言

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

Spring Data Redis 介紹

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

快速搭建 Spring Data Redis

直接可以參照官方地址進行配置,以往的 Spring的文件都寫著預計閱讀時間,這個沒有寫你就知道有多簡單啦。你可以直接點選檢視官方文件,或者往下閱讀。

Maven直接引入如下依賴:


  1. <dependencies>

  2. <dependency>

  3. <groupId>org.springframework.data</groupId>

  4. <artifactId>spring-data-redis</artifactId>

  5. <version>1.8.8.RELEASE</version>

  6. </dependency>

  7. </dependencies><repositories>

  8. <repository>

  9. <id>spring-libs-release</id>

  10. <name>Spring Releases</name>

  11. <url>https://repo.spring.io/libs-release</url>

  12. <snapshots>

  13. <enabled>false</enabled>

  14. </snapshots>

  15. </repository>

  16. </repositories>

然後直接在 Spring的配置檔案裡面定義 bean就可以了,官方沒有說怎麼配置 hostname等等,但是點選 JedisConnectionFactory裡面一看就知道了,直接新增一行 p:host-name=”172.10.23.234″即可。


  1. <bean id="jedisConnFactory"

  2. class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"

  3. p:use-pool="true"

  4. p:host-name="172.10.23.234"

  5. />

  6. <!-- redis template definition -->

  7. <bean id="redisTemplate"

  8. class="org.springframework.data.redis.core.RedisTemplate"

  9. p:connection-factory-ref="jedisConnFactory"/>

最後直接引入 bean使用:


  1. public class Example {

  2. // inject the actual template

  3. @Autowired

  4. private RedisTemplate<String, String> template;

  5. // inject the template as ListOperations

  6. // can also inject as Value, Set, ZSet, and HashOperations

  7. @Resource(name="redisTemplate")

  8. private ListOperations<String, String> listOps;

  9. public void addLink(String userId, URL url) {

  10. listOps.leftPush(userId, url.toExternalForm());

  11. // or use template directly

  12. redisTemplate.boundListOps(userId).leftPush(url.toExternalForm());

  13. }

  14. }

如上,根據 Spring的官方文件已經全部完成,是不是非常簡單?那麼接下來我們執行一下試一試。

這時候出現了第一個異常。

NoClassDefFoundError 問題解決


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

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


  1. <dependency>

  2. <groupId>org.apache.commons</groupId>

  3. <artifactId>commons-pool2</artifactId>

  4. <optional>true</optional>

  5. </dependency>

那麼這個問題就迎刃而解了,因為在 spring-data-redis裡面宣告的 commons-pool2是 optional的,根據 Maven的規則如果A專案依賴配置為optional的,那麼依賴A專案的B專案如果不手動引入A裡面optional的依賴B專案是不會自動引入依賴的的。說起來有點繞,反正就是導致我們必須手動新增下面的依賴。詳情可以參照 Maven的官方網文件。點選檢視官方文件。


  1. <dependency>

  2. <groupId>org.apache.commons</groupId>

  3. <artifactId>commons-pool2</artifactId>

  4. <version>2.2</version>

  5. </dependency>

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


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

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


  1. <dependency>

  2. <groupId>redis.clients</groupId>

  3. <artifactId>jedis</artifactId>

  4. <version>2.9.0</version>

  5. </dependency>

這時候我們再次執行專案可以正常執行啦,然而有出現了一個奇怪的問題,存入 Redis裡面的 Key有一個看起來像是亂碼的字首 xacxedx00x05tx00:

xacxedx00x05tx00 到底是啥

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

原文釋出時間為:2018-11-5

本文作者:碼匠筆記

本文來自雲棲社群合作伙伴“Web專案聚集地”,瞭解相關資訊可以關注“Web專案聚集地”。


相關文章