SpringBoot基础之集成使用Redis

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

前言

Redis是比较著名的NoSql数据库,主要用于存放KV型数据等非关系行数据,但随着Redis的发展,它所能做的功能越来越多,能够实现的场景包括但不限于:缓存,配置,排行榜,计数,分布式锁,限流,消息队列等等,当然我们提到他最多的时候是应用在缓存场景,因为redis是为缓存而生.

集成

添加Maven包

这里使用了spring-boot-starter-data-redis,它自带的客户端连接工具是lettuce.

当然你也可以使用redisson或者jedis,不过需要先排除lettuce,再引入对应的包

1
2
3
4
xml复制代码<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果使用FastJson序列化 也需要引入fastjson ,你喜欢Jackson的话,不想写😂

1
2
3
4
5
xml复制代码<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>

application.yml配置

1
2
3
4
5
6
yaml复制代码spring:
redis:
database: 0 #选择第一个数据库,可选0-15
host: 127.0.0.1
port: 6379
password: #无密码留空 ,有密码则设置密码

添加配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
arduino复制代码
@Configuration
public class MyRedisConfig {

/**
* 指定FastJson序列化
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){

RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
GenericFastJsonRedisSerializer jsonRedisSerializer = new GenericFastJsonRedisSerializer();
template.setDefaultSerializer(jsonRedisSerializer);
template.setKeySerializer(jsonRedisSerializer);
template.setValueSerializer(jsonRedisSerializer);
return template;
}
}

这里使用的是FastJson序列化,并指定默认序列化方式,Key序列化方式和Value序列化方式都是FastJson.

在业务中注入方式为

1
2
typescript复制代码@Autowired
private RedisTemplate<String,Object> redisTemplate;

其中<String,Object>部分可以根据序号更换为其他类型

测试使用

一定要测试呀,我同事项目组,项目上线之后发现redis配置有问题,线程不释放,用上一段时间就卡死…

单线程 存储 100000 数据测试 : 取第二次测试结果耗时 17834 ms

1
2
3
4
5
6
7
8
9
10
ini复制代码@GetMapping("/string1")
public R string1() {
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
String uuid = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(uuid, uuid);
}
long end = System.currentTimeMillis();
return R.success("redisTemplate单线程,存储 100000 key:需要时间", end - start);
}

100线程 并发 存储 100000 数据测试 :取第二次测试结果耗时 2795 ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ini复制代码    @GetMapping("/string100")
public ResultVo string100() throws InterruptedException {
redisTemplate.hasKey("123");

CountDownLatch countDownLatch = new CountDownLatch(100000);
ExecutorService pool = Executors.newFixedThreadPool(100);

long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
pool.execute(() -> {
String uuid = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(uuid, uuid);
countDownLatch.countDown();
});
}
countDownLatch.await();
long end = System.currentTimeMillis();

return ResultVo.success("redisTemplate 100线程 并发,存储 100000 Key 需要时间", end - start);
}

管道 存储 100000 数据测试 :取第二次测试结果耗时 2071 ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ini复制代码@GetMapping("/stringPipe")
public ResultVo stringPipe() throws InterruptedException {

long start = System.currentTimeMillis();
redisTemplate.executePipelined((RedisCallback) redisConnection ->{
for (int i = 0; i < 100000; i++) {
byte[] uuid = UUID.randomUUID().toString().getBytes();
redisConnection.set(uuid, uuid);
}
return null;
}, redisTemplate.getDefaultSerializer());

long end = System.currentTimeMillis();
return ResultVo.success("redisTemplate 管道 ,存储 100000 Key 需要时间", end - start);
}
1
2
3
4
arduino复制代码    作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%