SpringBoot整合Redis

项目介绍

最近在写一个秒杀的项目,是跟着慕课网的一个教程学习的。其中用到了redis进行session共享等等功能,现如今做到的步骤是使用redis将用户信息存入redis中,并且同时将用户的唯一token值存入cookie中(cookie的有效期和redis键值的有效期一样),当我们用户跳转到某个页面的时候,先查询cookie中是否存在键值为user的cookie,如果存在就获取到cookieValue(token值),然后通过这个token作为键去查询redis中查找对应token的用户信息。

五一玩了几天,这几天没怎么进食新东西,今天趁着假期学校不熄灯,继续写一篇博客。

引入依赖和配置变量

首先是pom.xml的依赖

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>

然后我们需要在application.yaml文件中写入redis的配置环境

1
2
3
redis:
host: 119.82.123.134
port: 6379

配置类的编写

编写RedisConfig配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  @Configuration
public class RedisConfig {
//这里是引入刚刚yaml文件的配置变量
private @Value("${redis.host}") String host;
private @Value("${redis.port}") int port;

//引入JedisConnection工厂,主要负责的是redis的连接
//其中要设置地址和端口号
@Bean
public JedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}

//配置redis模板,这个主要是进行一些redis的操作,就像jdbc的模板类一样
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
}

相关操作的编写

关于redis的操作有很多,我也学的不是很好,这里面只写了最简单的set和get

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  /**
* @author Lin
* @date 2019-04-18 23:23
**/
@Component
public class RedisUtil {
//引入刚刚我们设置的redis模板
@Resource
RedisTemplate<String,Object> redisTemplate;

//这是redis单独印出来的string的模板——因为对于redis的操作大部分都是以String类型为基础的,这里没有用到
@Autowired
StringRedisTemplate stringRedisTemplate;

/**
* 往redis中缓存数据,这里使用T模板更加灵活
* @param key
*/
public <T> void set(String key,T value){
//将value对象转换为json字符串
String jsonString=beanToString(value);
//valueOperations用来set和get 它是由redisTemplate产生的
ValueOperations<String,Object> valueOperations=redisTemplate.opsForValue();
//这里是将value对象转换为jsonString,因为项目中User是一个java对象
valueOperations.set(key,jsonString);
}



/**
* 往redis中缓存数据并加上过期时间
* @param key
* @param time 过期时间,秒
*/
public <T> void set(String key,T value,long time){
//这个方法跟上面差不多,多加了一个设置过期时间,为的是与项目需求设置redis过期时间和cookie相等
String jsonString=beanToString(value);
ValueOperations<String,Object> valueOperations=redisTemplate.opsForValue();
valueOperations.set(key, jsonString, time,TimeUnit.SECONDS);
}


/**
* 从redis1中获取数据
* @param key
* @return
*/
public <T> T get(String key,Class<T> clazz){
ValueOperations<String,Object> valueOperations=redisTemplate.opsForValue();
//这里其实获取的是存在redis中对象的json字符串
Object object=valueOperations.get(key);
//如果获取的不为空,那么就像这个json字符串转换为java对象
if (object!=null){
return stringToBean(object.toString(),clazz);
}
//获取为空就return null
return null;
}


/**
* 将对象转换为json
* @param value 对象
* @param <T> 泛型
* @return json数据
*/
private <T> String beanToString(T value){
if (value==null){
return null;
}
Class<?> clazz=value.getClass();
//如果value是int类型或者Integer类型的直接返回
if (clazz==int.class||clazz==Integer.class){
return ""+value;
}else if(clazz==String.class){
return (String)value;
}else if (clazz==long.class||clazz==Long.class){
return ""+value;
}else {
return JSON.toJSONString(value);
}
}

/**
* 将jsonString转换为java的对象
* @param jsonString json字符串
* @param clazz 类
* @param <T> 泛型
* @return java对象
*/
@SuppressWarnings("unchecked")
private <T> T stringToBean(String jsonString,Class<T> clazz){
if (jsonString==null||jsonString.length()<=0||clazz==null){
return null;
}
if(clazz == int.class || clazz == Integer.class) {
return (T)Integer.valueOf(jsonString);
}else if(clazz == String.class) {
return (T)jsonString;
}else if(clazz == long.class || clazz == Long.class) {
return (T)Long.valueOf(jsonString);
}else {
return JSON.toJavaObject(JSON.parseObject(jsonString), clazz);
}
}

}

上述代码使用了阿里巴巴的fastJson作为json和java对象转换的工具,具体的pom依赖为:

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>

总结

对于这个SpringBoot整合Redis虽然是跟着视频写的,但是也踩了很多坑,因为版本更新非常快,我使用的SpringBoot和Redis都是最新版的,很多地方配置和代码书写都和视频中和网上绝大数整合教程不相同,我也是查看很多资料才写好这个整合的,对于英文文档不感冒是真的吃亏,所以英语能力一定要提高!!!

还有就是在整合redis的时候,如果连接的是远程服务器中的redis的话一定要更改服务器上的redis.conf文件,最重要的两点就是将bind后面的地址修改或者直接注释掉bind那一行配置,还有就是将protected-mode更改为no,不然远程电脑连接不上。

当然还有很多细节问题都需要注意,留下这篇文章作为踩坑记录,希望下面敲代码的日子会越来越顺利。

-------------本文结束感谢阅读-------------