關於 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這個問題就修改了