Spring-data-redis操作redis知識(shí)總結(jié)
什么是spring-data-redis
spring-data-redis是spring-data模塊的一部分,專(zhuān)門(mén)用來(lái)支持在spring管理項(xiàng)目對(duì)redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都屬于redis的java客戶(hù)端,他們之間是無(wú)法兼容的,如果你在一個(gè)項(xiàng)目中使用了jedis,然后后來(lái)決定棄用掉改用jdbc-redis就比較麻煩了,spring-data-redis提供了redis的java客戶(hù)端的抽象,在開(kāi)發(fā)中可以忽略掉切換具體的客戶(hù)端所帶來(lái)的影響,而且他本身就屬于spring的一部分,比起單純的使用jedis,更加穩(wěn)定.管理起來(lái)更加自動(dòng)化.(當(dāng)然jedis的缺點(diǎn)不止以上).
spring-data-redis的特性
1.自動(dòng)管理連接池,提供了一個(gè)高度封裝的RedisTemplate類(lèi)
2.針對(duì)jedis客戶(hù)端的大量api進(jìn)行了歸類(lèi)封裝,把同一類(lèi)型的操作封裝成了Operation接口.支持redis中的五種數(shù)據(jù)類(lèi)型的操作.
3.針對(duì)數(shù)據(jù)的"序列化與反序列化",提供了多種可以選擇的策略(RedisSerializer)
JdkSerializationRedisSerializer:當(dāng)需要存儲(chǔ)java對(duì)象時(shí)使用.
StringRedisSerializer:當(dāng)需要存儲(chǔ)string類(lèi)型的字符串時(shí)使用.
JacksonJsonRedisSerializer:將對(duì)象序列化成json的格式存儲(chǔ)在redis中,需要jackson-json工具的支持,(目前我還沒(méi)使用過(guò),不了解)
Operations
redisTemplate有兩個(gè)方法經(jīng)常用到,一個(gè)是opsForXXX一個(gè)是boundXXXOps,XXX是value的類(lèi)型,前者獲取到一個(gè)Opercation,但是沒(méi)有指定操作的key,可以在一個(gè)連接(事務(wù))內(nèi)操作多個(gè)key以及對(duì)應(yīng)的value;后者會(huì)獲取到一個(gè)指定了key的operation,在一個(gè)連接內(nèi)只操作這個(gè)key對(duì)應(yīng)的value.
ValueOperation和BoundValueOperation
ValueOperations valueOperations = redisTemplate.opsForValue(); BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps("key");
ValueOperation可以緩存Integer,String,java對(duì)象等類(lèi)型.使用.set(key,value)方法進(jìn)行設(shè)置,get(key)方法用來(lái)獲取.
同樣的方式可以獲取ListOperations對(duì)象,可以用來(lái)緩存List,此外還有SetOperation,HashOperation
在spring+springmvc項(xiàng)目中使用spring-data-redis
1.maven配置,添加pom依賴(lài)
<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 連接池參數(shù)配置--> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--最大空閑實(shí)例數(shù)--> <property name="maxIdle" value="300" /> <!--最大活躍實(shí)例數(shù)--> <property name="maxTotal" value="600" /> <!--創(chuàng)建實(shí)例時(shí)最長(zhǎng)等待時(shí)間--> <property name="maxWaitMillis" value="1000" /> <!--創(chuàng)建實(shí)例時(shí)是否驗(yàn)證--> <property name="testOnBorrow" value="true" /> </bean> <!--JedisConnectionFactory 跟配置數(shù)據(jù)庫(kù)連接池類(lèi)似,需要配置JedisConnectionFactory來(lái)通過(guò)服務(wù)器或者連接池的方式獲取redis服務(wù)器的連接--> <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提供了一個(gè)基礎(chǔ)的泛型RedisTemplate封裝了基礎(chǔ)的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了,為了演示一下具體的使用,這里接著寫(xiě)一個(gè)簡(jiǎn)單地demo.
3.創(chuàng)建實(shí)體類(lèi)User
public class User implements Serializable { private static final long serialVersionUID = 1L; /** 用戶(hù)ID */ private Long id; /** 用戶(hù)名 */ private String name; /** 用戶(hù)年齡 */ private Integer age; }
注意:如果需要向redis內(nèi)存儲(chǔ)pojo對(duì)象,那么該對(duì)象必須要實(shí)現(xiàn)Serializable接口,因?yàn)樵趓edis中存儲(chǔ)pojo類(lèi)仍然存儲(chǔ)的是string,它會(huì)把數(shù)據(jù)轉(zhuǎn)化成byte[]數(shù)組的形式,在存取的時(shí)候就要對(duì)數(shù)據(jù)格式進(jìn)行轉(zhuǎn)化,就涉及到了序列化與反序列化.
4.創(chuàng)建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對(duì)象存儲(chǔ)到redis中,再讀出來(lái),運(yùn)行項(xiàng)目,測(cè)試這個(gè)接口,就可以在瀏覽器中看到j(luò)son格式的user對(duì)象.
常見(jiàn)報(bào)錯(cuò)及解決方案
最開(kāi)始我測(cè)試spring-data-redis的功能是從一個(gè)空項(xiàng)目一點(diǎn)點(diǎn)配置的,啟動(dòng)時(shí)報(bào)了很多異常,下面一個(gè)一個(gè)來(lái).
1.啟動(dòng)tomcat報(bào)錯(cuò)
Caused by: java.lang.VerifyError: (class: org/springframework/data/redis/connection/jedis/JedisConnectionFactory,
method: afterPropertiesSet signature: ()V) Incompatible argument to function
原因及解決方案:
在pom中我最開(kāi)始配置的jedis版本是2.7.3,spring-data-redis版本是1.1.1,網(wǎng)上搜索了一翻,發(fā)現(xiàn)有一個(gè)說(shuō)法是jedis-2.7.3.jar 和 spring-data-redis-1.1.1.RELEASE.jar 無(wú)法搭配使用,于是我把spring-data-redis的版本設(shè)成比較高的1.3.4,重新部署,果然此問(wèn)題解決,緊接著問(wèn)題又來(lái)了.
2.啟動(dòng)tomcat報(bào)錯(cuò)
Caused by: Java.lang.NoSuchMethodError: redis.clients.jedis.JedisShardInfo.setTimeout(I)V
原因及解決方案:同樣是版本的問(wèn)題(沒(méi)錯(cuò),都被我撞上了),jedis版本是2.7.3,太高了,改成2.4.3以后,問(wèn)題解決.
3.啟動(dòng)tomcat報(bào)錯(cuò)
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
原因及解決方案:這個(gè)GenericObjectPool使用到了commons-pool.jar中的類(lèi),我們的依賴(lài)中沒(méi)有這個(gè)jar,所以添加commons-pool的dependency即可.
4.運(yùn)行接口報(bào)錯(cuò)
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"的配置,因?yàn)榇鎯?chǔ)在redis的value是user對(duì)象,需要使用JdkSerializationRedisSerializer對(duì)象進(jìn)行對(duì)象的序列化操作,解決方案就是配置成上面spring-redis.xml的方式.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決spring項(xiàng)目找不到Aspect依賴(lài)注解的問(wèn)題
這篇文章主要介紹了解決spring項(xiàng)目找不到Aspect依賴(lài)注解的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Spring和SpringMVC父子容器關(guān)系初窺(小結(jié))
這篇文章主要介紹了Spring和SpringMVC父子容器關(guān)系初窺(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Java多線程讀寫(xiě)鎖ReentrantReadWriteLock類(lèi)詳解
本文詳細(xì)講解了Java多線程讀寫(xiě)鎖ReentrantReadWriteLock類(lèi),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12SpringBoot整合Flink CDC實(shí)現(xiàn)實(shí)時(shí)追蹤mysql數(shù)據(jù)變動(dòng)
我們將整合Spring Boot和Apache Flink CDC(Change Data Capture)來(lái)實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)追蹤,下面是一個(gè)基本的實(shí)踐流程代碼,包括搭建Spring Boot項(xiàng)目、整合Flink CDC以及實(shí)現(xiàn)數(shù)據(jù)變動(dòng)的實(shí)時(shí)追蹤,需要的朋友可以參考下2024-07-07MyBatis-Plus自定義SQL和復(fù)雜查詢(xún)的實(shí)現(xiàn)
MyBatis-Plus增強(qiáng)了MyBatis的功能,提供注解和XML兩種自定義SQL方式,支持復(fù)雜查詢(xún)?nèi)缍啾黻P(guān)聯(lián)、動(dòng)態(tài)分頁(yè)等,通過(guò)注解如@Select、@Insert、@Update、@Delete實(shí)現(xiàn)CRUD操作,本文就來(lái)介紹一下,感興趣的可以了解一下2024-10-10Shiro + JWT + SpringBoot應(yīng)用示例代碼詳解
這篇文章主要介紹了Shiro (Shiro + JWT + SpringBoot應(yīng)用),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06利用github搭建個(gè)人maven倉(cāng)庫(kù)的方法步驟
這篇文章主要介紹了利用github搭建個(gè)人maven倉(cāng)庫(kù)的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12idea中定時(shí)及多數(shù)據(jù)源配置方法
因項(xiàng)目要求,需要定時(shí)從達(dá)夢(mèng)數(shù)據(jù)庫(kù)中取數(shù)據(jù),并插入或更新到ORACLE數(shù)據(jù)庫(kù)中,這篇文章主要介紹了idea中定時(shí)及多數(shù)據(jù)源配置方法,需要的朋友可以參考下2023-12-12