一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring-data-redis操作redis知識(shí)總結(jié)

Spring-data-redis操作redis知識(shí)總結(jié)

2020-09-11 10:20醉眼識(shí)朦朧 Java教程

這篇文章主要介紹了Spring-data-redis操作redis知識(shí)總結(jié),spring-data-redis是spring-data模塊的一部分,專門用來(lái)支持在spring管理項(xiàng)目對(duì)redis的操作。

什么是spring-data-redis

spring-data-redis是spring-data模塊的一部分,專門用來(lái)支持在spring管理項(xiàng)目對(duì)redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都屬于redis的java客戶端,他們之間是無(wú)法兼容的,如果你在一個(gè)項(xiàng)目中使用了jedis,然后后來(lái)決定棄用掉改用jdbc-redis就比較麻煩了,spring-data-redis提供了redis的java客戶端的抽象,在開發(fā)中可以忽略掉切換具體的客戶端所帶來(lái)的影響,而且他本身就屬于spring的一部分,比起單純的使用jedis,更加穩(wěn)定.管理起來(lái)更加自動(dòng)化.(當(dāng)然jedis的缺點(diǎn)不止以上).

spring-data-redis的特性

1.自動(dòng)管理連接池,提供了一個(gè)高度封裝的RedisTemplate類

2.針對(duì)jedis客戶端的大量api進(jìn)行了歸類封裝,把同一類型的操作封裝成了Operation接口.支持redis中的五種數(shù)據(jù)類型的操作.

3.針對(duì)數(shù)據(jù)的"序列化與反序列化",提供了多種可以選擇的策略(RedisSerializer)

JdkSerializationRedisSerializer:當(dāng)需要存儲(chǔ)java對(duì)象時(shí)使用.

StringRedisSerializer:當(dāng)需要存儲(chǔ)string類型的字符串時(shí)使用.

JacksonJsonRedisSerializer:將對(duì)象序列化成json的格式存儲(chǔ)在redis中,需要jackson-json工具的支持,(目前我還沒使用過,不了解)

Operations

redisTemplate有兩個(gè)方法經(jīng)常用到,一個(gè)是opsForXXX一個(gè)是boundXXXOps,XXX是value的類型,前者獲取到一個(gè)Opercation,但是沒有指定操作的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

?
1
2
3
ValueOperations valueOperations = redisTemplate.opsForValue();
 
BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps("key");

ValueOperation可以緩存Integer,String,java對(duì)象等類型.使用.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依賴

?
1
2
3
4
5
6
7
8
9
10
11
<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配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!--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ù)連接池類似,需要配置JedisConnectionFactory來(lái)通過服務(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了,為了演示一下具體的使用,這里接著寫一個(gè)簡(jiǎn)單地demo.

3.創(chuàng)建實(shí)體類User

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class User implements Serializable {
 
 private static final long serialVersionUID = 1L;
 
 /** 用戶ID */
 private Long id;
 
 /** 用戶名 */
 private String name;
 
 /** 用戶年齡 */
 private Integer age;
}

注意:如果需要向redis內(nèi)存儲(chǔ)pojo對(duì)象,那么該對(duì)象必須要實(shí)現(xiàn)Serializable接口,因?yàn)樵趓edis中存儲(chǔ)pojo類仍然存儲(chǔ)的是string,它會(huì)把數(shù)據(jù)轉(zhuǎn)化成byte[]數(shù)組的形式,在存取的時(shí)候就要對(duì)數(shù)據(jù)格式進(jìn)行轉(zhuǎn)化,就涉及到了序列化與反序列化.

4.創(chuàng)建UserCcontroller

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@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ì)象.

常見報(bào)錯(cuò)及解決方案

最開始我測(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ò)

 

復(fù)制代碼 代碼如下:

 

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,網(wǎng)上搜索了一翻,發(fā)現(xiàn)有一個(gè)說法是jedis-2.7.3.jar 和 spring-data-redis-1.1.1.RELEASE.jar 無(wú)法搭配使用,于是我把spring-data-redis的版本設(shè)成比較高的1.3.4,重新部署,果然此問題解決,緊接著問題又來(lái)了.

2.啟動(dòng)tomcat報(bào)錯(cuò)

 

復(fù)制代碼 代碼如下:

 

Caused by: Java.lang.NoSuchMethodError: redis.clients.jedis.JedisShardInfo.setTimeout(I)V

 

 

原因及解決方案:同樣是版本的問題(沒錯(cuò),都被我撞上了),jedis版本是2.7.3,太高了,改成2.4.3以后,問題解決.

3.啟動(dòng)tomcat報(bào)錯(cuò)

 

復(fù)制代碼 代碼如下:

 

java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

 

 

原因及解決方案:這個(gè)GenericObjectPool使用到了commons-pool.jar中的類,我們的依賴中沒有這個(gè)jar,所以添加commons-pool的dependency即可.

4.運(yùn)行接口報(bào)錯(cuò)

 

復(fù)制代碼 代碼如下:

 

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í)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/fingerboy/p/6704812.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产亚洲一级精品久久 | 亚州男人天堂 | 亚洲福利一区二区 | 秋霞午夜视频在线观看 | 色网免费观看 | 免费免费啪视频在线观播放 | 亚洲男人的天堂网 | 午夜想想爱 | 男人狂擦女人的下面视频 | 朝鲜女人free性hu | 色综合综合| 1024免费观看完整版在线播放 | 免费看又黄又爽又猛的视频软件- | 婷婷久久精品 | 国产自拍偷拍自拍 | 色欲麻豆国产福利精品 | 国产香蕉视频在线观看 | 国产一级毛片潘金莲的奶头 | 国产成人综合精品一区 | 天堂8在线天堂资源bt | 亚洲人成网站在线观看妞妞网 | 精品国产欧美一区二区五十路 | 色亚州| 动漫jk美女被爆羞羞漫画 | 国产精品视频久 | 三年片韩国在线 | 欧美一级久久久久久久大片 | 天天做天天爱天天综合网 | 成人国产一区二区 | 亚洲国产剧情中文视频在线 | 五月天在线视频观看 | 色综合网天天综合色中文男男 | 69pao强力打造免费高速 | 调教校花浣肠开菊 | 爽好舒服使劲添高h视频 | 亚洲老头老太hd | 成人人免费夜夜视频观看 | 王的视频vk | 五花大绑esebdsm国产 | 毛片视频网站 | 亚洲国产精品热久久 |