SpringBoot基础之集成使用Redis

SpringBoot基础之集成使用Redis,第1张

SpringBoot基础之集成使用Redis 前言

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

集成 添加Maven包

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

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


   org.springframework.boot
   spring-boot-starter-data-redis


复制代码

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


    com.alibaba
    fastjson
    1.2.70

复制代码
application.yml配置
spring:
  redis:
    database: 0 #选择第一个数据库,可选0-15
    host: 127.0.0.1
    port: 6379
    password:   #无密码留空 ,有密码则设置密码
复制代码
添加配置类
@Configuration
public class MyRedisConfig {

    
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){

        RedisTemplate 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.

在业务中注入方式为

@Autowired
private RedisTemplate redisTemplate;
复制代码

其中部分可以根据序号更换为其他类型

测试使用

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

单线程 存储 100000 数据测试 : 取第二次测试结果耗时 17834 ms
@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
    @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
@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);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5583579.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存