您好,登錄后才能下訂單哦!
什么是spring-data-redis
spring-data-redis是spring-data模塊的一部分,專門用來支持在spring管理項目對redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都屬于redis的java客戶端,他們之間是無法兼容的,如果你在一個項目中使用了jedis,然后后來決定棄用掉改用jdbc-redis就比較麻煩了,spring-data-redis提供了redis的java客戶端的抽象,在開發中可以忽略掉切換具體的客戶端所帶來的影響,而且他本身就屬于spring的一部分,比起單純的使用jedis,更加穩定.管理起來更加自動化.(當然jedis的缺點不止以上).
spring-data-redis的特性
1.自動管理連接池,提供了一個高度封裝的RedisTemplate類
2.針對jedis客戶端的大量api進行了歸類封裝,把同一類型的操作封裝成了Operation接口.支持redis中的五種數據類型的操作.
3.針對數據的"序列化與反序列化",提供了多種可以選擇的策略(RedisSerializer)
JdkSerializationRedisSerializer:當需要存儲java對象時使用.
StringRedisSerializer:當需要存儲string類型的字符串時使用.
JacksonJsonRedisSerializer:將對象序列化成json的格式存儲在redis中,需要jackson-json工具的支持,(目前我還沒使用過,不了解)
Operations
redisTemplate有兩個方法經常用到,一個是opsForXXX一個是boundXXXOps,XXX是value的類型,前者獲取到一個Opercation,但是沒有指定操作的key,可以在一個連接(事務)內操作多個key以及對應的value;后者會獲取到一個指定了key的operation,在一個連接內只操作這個key對應的value.
ValueOperation和BoundValueOperation
ValueOperations valueOperations = redisTemplate.opsForValue(); BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps("key");
ValueOperation可以緩存Integer,String,java對象等類型.使用.set(key,value)方法進行設置,get(key)方法用來獲取.
同樣的方式可以獲取ListOperations對象,可以用來緩存List,此外還有SetOperation,HashOperation
在spring+springmvc項目中使用spring-data-redis
1.maven配置,添加pom依賴
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.3.4.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.4.2</version> </dependency>
2.spring-redis.xml配置:
<!--JedisPoolConfig 連接池參數配置--> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--最大空閑實例數--> <property name="maxIdle" value="300" /> <!--最大活躍實例數--> <property name="maxTotal" value="600" /> <!--創建實例時最長等待時間--> <property name="maxWaitMillis" value="1000" /> <!--創建實例時是否驗證--> <property name="testOnBorrow" value="true" /> </bean> <!--JedisConnectionFactory 跟配置數據庫連接池類似,需要配置JedisConnectionFactory來通過服務器或者連接池的方式獲取redis服務器的連接--> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="127.0.0.1"/> <property name="port" value="6379"/> <property name="usePool" value="true"/> <property name="poolConfig" ref="poolConfig"/> </bean> <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/> <bean id="valueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> <!-- redis模板配置 spring-data-redis提供了一個基礎的泛型RedisTemplate封裝了基礎的crud操作--> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <property name="defaultSerializer" ref="stringRedisSerializer"/> <property name="keySerializer" ref="stringRedisSerializer"/> <property name="valueSerializer" ref="valueSerializer"/> </bean>
以上配置完成后,就可以使用spring-data-redis了,為了演示一下具體的使用,這里接著寫一個簡單地demo.
3.創建實體類User
public class User implements Serializable { private static final long serialVersionUID = 1L; /** 用戶ID */ private Long id; /** 用戶名 */ private String name; /** 用戶年齡 */ private Integer age; }
注意:如果需要向redis內存儲pojo對象,那么該對象必須要實現Serializable接口,因為在redis中存儲pojo類仍然存儲的是string,它會把數據轉化成byte[]數組的形式,在存取的時候就要對數據格式進行轉化,就涉及到了序列化與反序列化.
4.創建UserCcontroller
@Controller public class UserController extends BaseController { @Autowired private IUserService userService; @Autowired private RedisTemplate<String,User> redisTemplate; @ResponseBody @RequestMapping("/redis") public Object redis() { User u1=new User(); u1.setId(1L); u1.setName("wang"); u1.setAge(22); redisTemplate.opsForValue().set("user:wang",u1); User u2=redisTemplate.opsForValue().get("user:wang"); return u2; } }
這里我們將user對象存儲到redis中,再讀出來,運行項目,測試這個接口,就可以在瀏覽器中看到json格式的user對象.
常見報錯及解決方案
最開始我測試spring-data-redis的功能是從一個空項目一點點配置的,啟動時報了很多異常,下面一個一個來.
1.啟動tomcat報錯
Caused by: java.lang.VerifyError: (class: org/springframework/data/redis/connection/jedis/JedisConnectionFactory,
method: afterPropertiesSet signature: ()V) Incompatible argument to function
原因及解決方案:
在pom中我最開始配置的jedis版本是2.7.3,spring-data-redis版本是1.1.1,網上搜索了一翻,發現有一個說法是jedis-2.7.3.jar 和 spring-data-redis-1.1.1.RELEASE.jar 無法搭配使用,于是我把spring-data-redis的版本設成比較高的1.3.4,重新部署,果然此問題解決,緊接著問題又來了.
2.啟動tomcat報錯
Caused by: Java.lang.NoSuchMethodError: redis.clients.jedis.JedisShardInfo.setTimeout(I)V
原因及解決方案:同樣是版本的問題(沒錯,都被我撞上了),jedis版本是2.7.3,太高了,改成2.4.3以后,問題解決.
3.啟動tomcat報錯
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
原因及解決方案:這個GenericObjectPool使用到了commons-pool.jar中的類,我們的依賴中沒有這個jar,所以添加commons-pool的dependency即可.
4.運行接口報錯
HTTP Status 500 - Request processing failed; nested exception is java.lang.ClassCastException: com.baomidou.springmvc.model.system.User cannot be cast to java.lang.String
原因及解決方案:在spring-redis配置文件中的redisTemplate的property中缺少name="valueSerializer"的配置,因為存儲在redis的value是user對象,需要使用JdkSerializationRedisSerializer對象進行對象的序列化操作,解決方案就是配置成上面spring-redis.xml的方式.
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。