网站首页 > java教程 正文
在工作中,我们用到分布式缓存的时候,第一选择就是Redis,今天介绍一下SpringBoot如何集成Redis的,分别使用Jedis和Spring-data-redis两种方式。
一、使用Jedis方式集成#
1、增加依赖
Copy Line-numbers language-xml<!-- spring-boot-starter-web不是必须的,这里是为了测试-->
<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不是必须的,这里是为了测试-->
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
2、配置项
Copy Line-numbers language-noneredis.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、配置连接池
Copy Line-numbers language-java/**
* @author 公-众-号:程序员阿牛
* 由于Jedis实例本身不非线程安全的,因此我们用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、测试
Copy Line-numbers language-java/**
* @author 公-众-号:程序员阿牛
*/
@RestController
public class JedisController {
@Autowired
private JedisPool jedisPool;
@RequestMapping("getUser")
public String getUserFromRedis(){
UserInfo userInfo = new UserInfo();
userInfo.setUserId("A0001");
userInfo.setUserName("张三丰");
userInfo.setAddress("武当山");
jedisPool.getResource().set("userInfo", JSON.toJSONString(userInfo));
UserInfo userInfo1 = JSON.parseObject(jedisPool.getResource().get("userInfo"),UserInfo.class);
return userInfo1.toString();
}
}
运行结果如下:
我们可以自己包装一个RedisClient,来简化我们的操作
使用spring-data-redis#
1、引入依赖
Copy Line-numbers language-xml <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置项
在application.properties中增加配置
Copy Line-numbers language-nonespring.redis.host=localhost
spring.redis.port=6379
3、使用
Copy Line-numbers language-java/**
* @author 公-众-号:程序员阿牛
*/
@RestController
public class RedisController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("getUser2")
public String getUserFromRedis(){
UserInfo userInfo = new UserInfo();
userInfo.setUserId("A0001");
userInfo.setUserName("张三丰");
userInfo.setAddress("武当山");
redisTemplate.opsForValue().set("userInfo", userInfo);
UserInfo userInfo1 = (UserInfo) redisTemplate.opsForValue().get("userInfo");
return userInfo1.toString();
}
}
是的,你只需要引入依赖、加入配置就可以使用Redis了,不要高兴得太早,这里面会有一些坑
4、可能会遇到的坑
使用工具查看我们刚才set的内容,发现key前面多了一串字符,value也是不可见的
原因
使用springdataredis,默认情况下是使用
org.springframework.data.redis.serializer.JdkSerializationRedisSerializer这个类来做序列化
具体我们看一下RedisTemplate 代码如何实现的
Copy Line-numbers language-java/**
*在初始化的时候,默认的序列化类是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());
}
...省略无关代码
}
如何解决
很简单,自己定义RedisTemplate并指定序列化类即可
Copy Line-numbers language-java/**
* @author 公-众-号:程序员阿牛
*/
@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来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jackson2JsonRedisSerializer());
template.afterPropertiesSet();
return template;
}
@Bean
public RedisSerializer<Object> jackson2JsonRedisSerializer() {
//使用Jackson2JsonRedisSerializer来序列化和反序列化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;
}
}
查看运行结果:
哨兵和集群#
只需要改一下配置项即可
Copy Line-numbers language-none# 哨兵
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
总结:#
以上两种方式都可以,但是还是建议你使用Spring-data-redis,因为Spring经过多年的发展,尤其是Springboot的日渐成熟,已经为我们简化了很多操作。
- 上一篇: Django连接Redis集群问题排查思路和总结
- 下一篇: 安装Redis
猜你喜欢
- 2025-05-16 SpringBoot整合Redis实现常用功能
- 2025-05-16 基于Redis实现简单的延时消息队列
- 2025-05-16 安装Redis
- 2025-05-16 Django连接Redis集群问题排查思路和总结
- 2025-05-16 只需5分钟,完成Redis所有命令操作~
- 2025-05-16 熟练使用 Redis 的 5 大数据结构:Java 实战教程
- 2025-05-16 Redis 常见业务场景及实例(Java)
- 2025-05-16 Spring Boot3整合Redis的使用场景全解析
- 2025-05-16 使用canal解决Mysql和Redis数据同步(TCP)
- 2025-05-16 Redis在Java项目中的典型应用场景
你 发表评论:
欢迎- 05-16SpringBoot整合Redis实现常用功能
- 05-16基于Redis实现简单的延时消息队列
- 05-16安装Redis
- 05-16Spring系列之Redis的两种集成方式
- 05-16Django连接Redis集群问题排查思路和总结
- 05-16只需5分钟,完成Redis所有命令操作~
- 05-16熟练使用 Redis 的 5 大数据结构:Java 实战教程
- 05-16Redis 常见业务场景及实例(Java)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)