SpringBoot集成Redis基本使用

前言

这两天做项目上也用到这块,自己在解决自己项目上问题时也用到,其中关于序列化和基本使用这块,重复犯了一些错误,耽误不少时间,所以记录下来

SpringBoot 版本:2.2.6
Redis 版本:5.0.8
已安装好了 Redis 于服务器上

基本配置使用

引入依赖

值得注意的是 springboot2.0使用依赖为spring-boot-starter-data-redis,后面依赖commons-pool2是使用lettuce需要的,使用之前的 jedis 来操作也是可以的,这里没有这么做

1
2
3
4
5
6
7
8
9
10
    <!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--redis lettuce-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>

配置文件

建议为 Redis 配置密码,防止被清数据,另外可以设置 Redis 自启

1
2
3
4
5
6
7
8
9
10
11
redis:
database: 0
password: 密码
host: IP
port: 端口
lettuce:
pool:
max-active: 100
max-idle: 10
max-wait: 3000
timeout: 5000

配置类

在这里设置了默认的序列化方式
如不设置,Redis 默认会使用JdkSerializationRedisSerializer来执行序列化,这种序列化方式的缺点在于被序列化的对象必须实现序列化接口,否则会报错

序列化

事实上它也支持序列化为 xml 格式,只是现如今基本不用该数据格式了,序列化为 JSON 格式,有使用 FastJSON 或者 Jackson 的,我本就是 Jackson 的忠实用户,自然是使用 Jackson 来序列化,所以使用GenericJackson2JsonRedisSerializer来序列化对象,但是听说 Jackson 不支持 JAVA8 的 LocalDate,我还没验证过
到目前为止,我还是认为StringRedisSerializer这种序列化方式是最方便的,即使是对象存入,我们只需要在存入之前将对象序列化,取出来后再反序列化就行了,一般的对象序列化,若存入 string 字符串,会在外层继续加上一个””,我们存入”string”,后面会变为””string””,导致难以阅读
我目前只用到了 string 和 HASH 两种数据结构,这里只有这两种~

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
@Configuration
public class RedisConfig {

/**
* TODO: 使用泛型接受
*
* @param connectionFactory connectionFactory
* @return RedisTemplate
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}

@Bean
public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory connectionFactory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
stringRedisTemplate.setHashKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setHashValueSerializer(new StringRedisSerializer());
stringRedisTemplate.setConnectionFactory(connectionFactory);
return stringRedisTemplate;
}
}

到这里我们已经可以使用上面的StringRedisTemplateRedisTemplate来存取数据了,但是为了简化操作,最好还是能对常用 redis 操作做一些封装,以下是我做项目中用到的一些基本操作

工具类

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
@Component
public class RedisUtil {

@Resource
private RedisTemplate<String, Object> redisTemplate;

@Resource
private RedisTemplate<String, String> stringStringRedisTemplate;

/**
* 删除key
*
* @param key key
*/
public void delete(String key) {
redisTemplate.delete(key);
}

/**
* 批量删除key
*
* @param keys keys
*/
public void delete(Collection<String> keys) {
redisTemplate.delete(keys);
}

/**
* 是否存在key
*
* @param key key
* @return Boolean
*/
public Boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}


/**
* 取值
*
* @param key key
* @return value
*/
public String get(String key){
return stringStringRedisTemplate.opsForValue().get(key);
}

/**
* 存入KEY并设置过期时间
*
* @param key key
* @param value value
* @param seconds 时间
* @param timeUnit 单位
*/
public void setKeyWithExpired(String key, String value, int seconds, TimeUnit timeUnit){
stringStringRedisTemplate.opsForValue().set(key, value, seconds, timeUnit);
}

/**
* 存入HASH 并设置key value
*
* @param hash hash
* @param hKey hKey
* @param hValue hValue
*/
public void hashPutKey(String hash, String hKey, String hValue){
redisTemplate.opsForHash().put(hash, hKey, hValue);
}

/**
* 获取指定hash下指定key的value
* @param hash hash
* @param hKey hKey
* @return obj
*/
public Object hashGetKey(String hash, String hKey){
return redisTemplate.opsForHash().get(hash, hKey);
}

/**
* 存入HASH 并设置key value
*
* @param hash hash
* @return Map<Object, Object>
*/
public Map<Object, Object> hashEntries(String hash){
return stringStringRedisTemplate.opsForHash().entries(hash);
}
}
作者

孙博文

发布于

2020-05-25

更新于

2021-07-18

许可协议

评论