SpringBoot-(二十四)SpringBoot简单整合操作Redis

本文最后更新于:February 11, 2023 pm

SpringBoot框架中有两个非常重要的策略:开箱即用和约定优于配置。其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

目录

SpringBoot整合Redis提供了RedisTemplate和StringRedisTemplate两个类,其中StringRedisTemplate是RedisTemplate的子类,两个用法基本一致,不同之处在于操作的数据类型不同,RedisTemplate中的Key和Value都是Object;而StringRedisTemplate的两个值均为String。

安装Redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装
sudo apt-get install redis-server -y

# 修改配置,找到 bind:127.0.0.1 ::1 将其注释,protected-mode 修改为no
vim /etc/redis/redis.conf

# 启动 redis 服务
service redis-server start

# 关闭 redis 服务
service redis-server stop

# 重启 redis 服务
service redis-server restart

# 查看 redis 状态
service redis-server status

# 进入redis
redis-cli

设置密码

默认情况下,Redis是没有设置密码的。所以需要进行密码的设置。

临时设置

⚠️注意:如果redis重启之后密码就会失效

  • 查看当前redis有没有设置密码:
1
config get requirepass

如果结果为下面,则表示没有密码:

1
2
1) "requirepass"
2) ""
  • 设置密码:
1
config set requirepass 个人密码
  • 再次查看当前redis是否具有密码就提示需要密码:
1
config get requirepass

然后结果为:

权限认证:若出现:(error) NOAUTH Authentication required。则表示没有授权(即没登录)。

  • 输入命令:
1
auth 个人密码

永久设置

去redis.conf的配置文件中找到requirepass这个参数,如下配置:

1
2
# requirepass foobared
requirepass 123 # 指定密码123

再保持重启Redis。

依赖

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

⚠️注意:如果配置文件没有MySQL、MyBatis相关的配置,则需要将对应的依赖删除。否则报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-09-05 19:27:49.236 ERROR 5314 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

配置

1
2
3
4
5
6
spring:
redis:
host: 111.11.11.95
password: 1111
port: 6379
database: 0

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.tothefor.demo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.Set;

@SpringBootTest
class DemoApplicationTests {

@Autowired
private StringRedisTemplate stringRedisTemplate;

@Test
void contextLoads() {
Set<String> keys = stringRedisTemplate.keys("*");
keys.forEach(System.out::println);
}

}

StringRedisTemplate

1
2
@Autowired
private StringRedisTemplate stringRedisTemplate;

操作keys

1
2
3
4
5
stringRedisTemplate.keys("*"); // 获取所有key
stringRedisTemplate.type("key"); // 获取类型
stringRedisTemplate.delete("key"); // 删除key
stringRedisTemplate.hasKey("key"); // 判断key是否存在
stringRedisTemplate.getExpire("key"); // 查看过期时间:-1代表永不过期,-2表示已过期

操作String

1
2
3
stringRedisTemplate.opsForValue().set("key","value"); // 设值
stringRedisTemplate.opsForValue().get("key"); // 取值
stringRedisTemplate.opsForValue().set("key","value",200, TimeUnit.SECONDS); // 设值并设过期时间

操作List

1
2
3
4
stringRedisTemplate.opsForList().leftPush("key","value"); // 给List集合中加值
stringRedisTemplate.opsForList().leftPushAll("key","value1","value2"); // 一次添加多个值
stringRedisTemplate.opsForList().leftPushAll("key",new ArrayList<String>()); // 添加一个集合
stringRedisTemplate.opsForList().range("key",0,-1); // 查询指定key集合中的所有值

操作Set

1
2
stringRedisTemplate.opsForSet().add("key","v1","v2"); // 插入多个值
stringRedisTemplate.opsForSet().members("key"); // 获取全部值

自定义Template

依赖

还需新增一个依赖:

1
2
3
4
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>

配置类

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
package com.tothefor.demo;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
//一般使用<String,Object>
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

//Json序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);

//String 序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

//key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
//hash的key采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value序列化采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
//hash的value序列化采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();

return template;
}
}

查看

如果在使用上述后,查看Redis依旧非中文,那么在打开redis命令行客户端时候添加:

1
redis-cli --raw