激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(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集成Redis的兩種方式

詳解Spring集成Redis的兩種方式

2022-01-22 16:33程序員阿牛 Java教程

在工作中,我們用到分布式緩存的時(shí)候,第一選擇就是Redis,今天介紹一下SpringBoot如何集成Redis的,具有一定的參考價(jià)值,感興趣的可以了解一下

在工作中,我們用到分布式緩存的時(shí)候,第一選擇就是Redis,今天介紹一下SpringBoot如何集成Redis的,分別使用Jedis和Spring-data-redis兩種方式。

 

一、使用Jedis方式集成

1、增加依賴

<!-- spring-boot-starter-web不是必須的,這里是為了測(cè)試-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
</dependency>
<dependency>
<!-- fastjson不是必須的,這里是為了測(cè)試-->
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.73</version>
</dependency>

2、配置項(xiàng)

redis.host=localhost
redis.maxTotal=5
redis.maxIdle=5
redis.testOnBorrow=true
#以下方式也可以,SpringBoot同樣能將其解析注入到JedisPoolConfig中
#redis.max-total=3
#redis.max-idle=3
#redis.test-on-borrow=true

3、配置連接池

/**
* @author 公-眾-號(hào):程序員阿牛
* 由于Jedis實(shí)例本身不非線程安全的,因此我們用JedisPool
*/
@Configuration
public class CommonConfig {
  @Bean
  @ConfigurationProperties("redis")
  public JedisPoolConfig jedisPoolConfig() {
      return new JedisPoolConfig();
  }

  @Bean(destroyMethod = "close")
  public JedisPool jedisPool(@Value("${redis.host}") String host) {
      return new JedisPool(jedisPoolConfig(), host);
  }
}

4、測(cè)試

/**
* @author 公-眾-號(hào):程序員阿牛
*/
@RestController
public class JedisController {
  @Autowired
  private JedisPool jedisPool;

  @RequestMapping("getUser")
  public String getUserFromRedis(){
      UserInfo userInfo = new UserInfo();
      userInfo.setUserId("A0001");
      userInfo.setUserName("張三豐");
      userInfo.setAddress("武當(dāng)山");
      jedisPool.getResource().set("userInfo", JSON.toJSONString(userInfo));
      UserInfo userInfo1 = JSON.parseObject(jedisPool.getResource().get("userInfo"),UserInfo.class);
      return userInfo1.toString();
  }
}

運(yùn)行結(jié)果如下:

詳解Spring集成Redis的兩種方式

我們可以自己包裝一個(gè)RedisClient,來(lái)簡(jiǎn)化我們的操作

 

使用spring-data-redis

1、引入依賴

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

2、配置項(xiàng)

在application.properties中增加配置

spring.redis.host=localhost
spring.redis.port=6379

3、使用

/**
* @author 公-眾-號(hào):程序員阿牛
*/
@RestController
public class RedisController {
  @Autowired
  private RedisTemplate redisTemplate;

  @RequestMapping("getUser2")
  public String getUserFromRedis(){
      UserInfo userInfo = new UserInfo();
      userInfo.setUserId("A0001");
      userInfo.setUserName("張三豐");
      userInfo.setAddress("武當(dāng)山");
      redisTemplate.opsForValue().set("userInfo", userInfo);
      UserInfo userInfo1 = (UserInfo) redisTemplate.opsForValue().get("userInfo");
      return userInfo1.toString();
  }
}

是的,你只需要引入依賴、加入配置就可以使用Redis了,不要高興的太早,這里面會(huì)有一些坑

4、可能會(huì)遇到的坑

詳解Spring集成Redis的兩種方式

使用工具查看我們剛才set的內(nèi)容,發(fā)現(xiàn)key前面多了一串字符,value也是不可見(jiàn)的

原因

使用springdataredis,默認(rèn)情況下是使用org.springframework.data.redis.serializer.JdkSerializationRedisSerializer這個(gè)類(lèi)來(lái)做序列化
具體我們看一下RedisTemplate 代碼如何實(shí)現(xiàn)的

/**
*在初始化的時(shí)候,默認(rèn)的序列化類(lèi)是JdkSerializationRedisSerializer
*/
public void afterPropertiesSet() {
      super.afterPropertiesSet();
      boolean defaultUsed = false;
      if (this.defaultSerializer == null) {
          this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
      }
 ...省略無(wú)關(guān)代碼
}

如何解決

很簡(jiǎn)單,自己定義RedisTemplate并指定序列化類(lèi)即可

/**
* @author 公-眾-號(hào):程序員阿牛
*/
@Configuration
public class RedisConfig {
  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
      RedisTemplate<String, Object> template = new RedisTemplate<>();
      template.setConnectionFactory(connectionFactory);
      template.setValueSerializer(jackson2JsonRedisSerializer());
      //使用StringRedisSerializer來(lái)序列化和反序列化redis的key值
      template.setKeySerializer(new StringRedisSerializer());
      template.setHashKeySerializer(new StringRedisSerializer());
      template.setHashValueSerializer(jackson2JsonRedisSerializer());
      template.afterPropertiesSet();
      return template;
  }

  @Bean
  public RedisSerializer<Object> jackson2JsonRedisSerializer() {
      //使用Jackson2JsonRedisSerializer來(lái)序列化和反序列化redis的value值
      Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
      ObjectMapper mapper = new ObjectMapper();
      mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
      mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
      serializer.setObjectMapper(mapper);
      return serializer;
  }

}/**
* @author 公-眾-號(hào):程序員阿牛
*/
@Configuration
public class RedisConfig {
  @Bean
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
      RedisTemplate<String, Object> template = new RedisTemplate<>();
      template.setConnectionFactory(connectionFactory);
      template.setValueSerializer(jackson2JsonRedisSerializer());
      //使用StringRedisSerializer來(lái)序列化和反序列化redis的key值
      template.setKeySerializer(new StringRedisSerializer());
      template.setHashKeySerializer(new StringRedisSerializer());
      template.setHashValueSerializer(jackson2JsonRedisSerializer());
      template.afterPropertiesSet();
      return template;
  }

  @Bean
  public RedisSerializer<Object> jackson2JsonRedisSerializer() {
      //使用Jackson2JsonRedisSerializer來(lái)序列化和反序列化redis的value值
      Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
      ObjectMapper mapper = new ObjectMapper();
      mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
      mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
      serializer.setObjectMapper(mapper);
      return serializer;
  }
}

查看運(yùn)行結(jié)果:

詳解Spring集成Redis的兩種方式

 

哨兵和集群

只需要改一下配置項(xiàng)即可

# 哨兵
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381

#集群
spring.redis.cluster.max-redirects=100
spring.redis.cluster.nodes=127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384

 

總結(jié):

以上兩種方式都可以,但是還是建議你使用Spring-data-redis,因?yàn)镾pring經(jīng)過(guò)多年的發(fā)展,尤其是Springboot的日漸成熟,已經(jīng)為我們簡(jiǎn)化了很多操作。

到此這篇關(guān)于詳解Spring集成Redis的兩種方式的文章就介紹到這了,更多相關(guān)Spring集成Redis 內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/coderaniu/p/15347479.html

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫(xiě)文件寫(xiě)不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開(kāi)發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒(méi)有升過(guò)級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: 日本欧美一区二区三区视频麻豆 | 久久久久一区二区三区 | 日韩精品中文字幕一区二区 | 成人在线视频一区 | 中国美女一级黄色片 | 欧美一级高清片_欧美高清aa | 国产一级在线观看视频 | 成人在线网站 | 欧美中文在线 | 免费国产成人高清在线看软件 | 中文字幕极速在线观看 | 国产精品美女久久久免费 | 狠狠干夜夜操 | 国产成人羞羞视频在线 | 蜜桃网在线 | 九艹在线 | 性片久久 | 黑人一级片视频 | 视频一区二区不卡 | 一级黄色毛片子 | 国产艳妇av视国产精选av一区 | 国产亚洲黑人性受xxxx精品 | 久久久久亚洲视频 | 久久靖品| 久草在线资源观看 | 中文字幕爱爱视频 | 亚洲影视综合网 | 欧美一级特黄aaaaaa在线看首页 | 国产自在自线午夜精品视频在 | 日本在线高清 | 中文在线国产 | 欧美一级h | 免费毛片免费看 | 成人精品视频在线 | 欧美性色黄大片www 成人免费网站在线观看 | 亚洲一区二区国产 | 亚洲一二区视频 | 媚药按摩痉挛w中文字幕 | av在线中文 | 国产一区二区欧美 | 国产精品久久久久久久久久久久久久久久 |