SpringBoot与Redis多线程入门——多线程redis存取数据

  1. SpringBoot Redis yml 配置

此处省略密码

spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    timeout: 3000
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
  1. RedisCofig.java 配置类代码
@EnableCaching
@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.database}")
    private Integer database;
    @Value("${spring.redis.port}")
    private Integer port;

    @Primary
    @Bean(name = "jedisPoolConfig")
    @ConfigurationProperties(prefix = "spring.redis.pool")
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxWaitMillis(10000);
        return jedisPoolConfig;
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setDatabase(database);
        // redisStandaloneConfiguration.setPassword(pwd);
        redisStandaloneConfiguration.setPort(port);
        JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
        jpcb.poolConfig(jedisPoolConfig);
        JedisClientConfiguration jedisClientConfiguration = jpcb.build();
        return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
    }

    /**
     * 配置redisTemplate针对不同key和value场景下不同序列化的方式
     * 此处针对key为String,value为CustomerVo对象的序列化方式
     * @param factory Redis连接工厂
     * @return
     */
    @Primary
    @Bean(name = "customerRedisTemplate")
    public RedisTemplate customerRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
                // 这里是关键,注意替换为自己的类
        Jackson2JsonRedisSerializer redisSerializer = new Jackson2JsonRedisSerializer<>(CustomerVo.class);
        template.setValueSerializer(redisSerializer);
        template.setHashValueSerializer(redisSerializer);
        template.afterPropertiesSet();
        return template;
    }

    @Bean(name = "doctorRedisTemplate")
    public RedisTemplate doctorRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        Jackson2JsonRedisSerializer redisSerializer = new Jackson2JsonRedisSerializer<>(DoctorVo.class);
        template.setValueSerializer(redisSerializer);
        template.setHashValueSerializer(redisSerializer);
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}
  1. Vo类和Service类代码

CustomerVo.java

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CustomerVo {
    private Integer customerId;
    private String queueSeq;
    private String customerName;
    private String customerSex;

    @Override
    public String toString() {
        return "CustomerVo{" +
                "queueSeq='" + queueSeq + '\'' +
                ", customerName='" + customerName + '\'' +
                ", customerSex='" + customerSex + '\'' +
                '}';
    }
}

Service

@Slf4j
@Service
public class RedisLookupService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Async("taskExecutor")
    public CompletableFuture enqueueCustomer(CustomerVo customer) {
        Long result = redisTemplate.opsForList().rightPush("queue", customer);
        log.info("{} 入队..", customer);
        return CompletableFuture.completedFuture(result);
    }

    @Async("taskExecutor")
    public CompletableFuture dequeueCustomer() {
        if (Objects.requireNonNull(redisTemplate.opsForList().size("queue")) < 1) {
            return CompletableFuture.completedFuture(null);
        }
        CustomerVo vo = redisTemplate.opsForList().leftPop("queue");
        log.info("{} 出队...", vo);
        return CompletableFuture.completedFuture(vo);
    }

}

AsyncConfig.java 配置类

因为用到了SpringBoot的多线程,所以要加一下这个配置类

@Configuration
@EnableAsync  // 启用异步任务
public class AsyncConfig {

    // 声明一个线程池(并指定线程池的名字)
    @Bean("taskExecutor")
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程数5:线程池创建时候初始化的线程数
        executor.setCorePoolSize(5);
        //最大线程数5:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(5);
        //缓冲队列500:用来缓冲执行任务的队列
        executor.setQueueCapacity(500);
        //允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        executor.setKeepAliveSeconds(60);
        //线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
        executor.setThreadNamePrefix("RaviAsync-");
        executor.initialize();
        return executor;
    }
}
  1. Controller 测试代码
@Slf4j
@RestController
public class TestController {
    @Autowired
    private RedisLookupService service;

    @GetMapping("/en")
    public String enqueueTry() throws InterruptedException {
        long start = System.currentTimeMillis();
        CustomerVo c1 = new CustomerVo(1, "A031", "马哲", "男");
        CustomerVo c2 = new CustomerVo(2, "A039", "马王", "男");
        CustomerVo c3 = new CustomerVo(3, "A040", "马丽", "女");
        CompletableFuture future1 = service.enqueueCustomer(c1);
        CompletableFuture future2 = service.enqueueCustomer(c3);
        CompletableFuture future3 = service.enqueueCustomer(c2);
        CompletableFuture.allOf(future1, future2, future3).join();
        long end = System.currentTimeMillis();
        log.info("complete test: {}s",(float)(end - start) / 1000);
        return "ok";
    }

    @GetMapping("/qn")
    public String dequeueTry() {
        long start = System.currentTimeMillis();
        CompletableFuture customer1 = service.dequeueCustomer();
        CompletableFuture customer2 = service.dequeueCustomer();
        CompletableFuture customer3 = service.dequeueCustomer();
        CompletableFuture.allOf(customer1, customer2, customer3).join();
        long end = System.currentTimeMillis();
        log.info("complete test: {}s",(float)(end - start) / 1000);
        return "ok";
    }
}

/en的测试结果:
图1

SpringBoot与Redis多线程入门——多线程redis存取数据
图2
SpringBoot与Redis多线程入门——多线程redis存取数据

/qn的测试结果:

SpringBoot与Redis多线程入门——多线程redis存取数据
由此可以发现,多线程已经启动。
  1. 日志设置

yml配置

logging:
  config: classpath:logback.xml
  level:
    com.ravi.mapper: trace

xml配置


            %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

            ${LOG_HOME}/Slf4j_%d{yyyy-MM-dd}.log

            30

            %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

            10MB

参考文章大数据从业者

Original: https://www.cnblogs.com/ceeSomething8/p/15934142.html
Author: cee_nil
Title: SpringBoot与Redis多线程入门——多线程redis存取数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621594/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Hash 哈希表和算法思路详解

    哈希表是一种可以满足快速查找数据结构,时间复杂度接近O(1)。 哈希函数是无限集到有限集的映射。 处理数据量大,查找效率要求高时推荐使用hash容器。 hash不一定优于数组查找,…

    数据结构和算法 2023年6月8日
    075
  • 网络流 1

    「codeforces – 1592F2」Alice and Recoloring 2:妙妙题,显然只会操作 ((1, 1)) 和 ((n, m)),分别记作操作 1 …

    数据结构和算法 2023年6月12日
    096
  • 大前端算法篇之背包问题

    简述:背包问题是动态规划算法中的一个经典问题,分为01背包和完全背包,01背包就是不能放入同一件物品,完全背包是可以放入同一个物品 下面将要讲的是01背包问题 动态规划中最重要的是…

    数据结构和算法 2023年6月7日
    094
  • 【面试要点】判断企业基本信息——新型骗局“招聘转培训”

    核心保护 请一定要对个人的身份证与银行卡留有心眼,不要给任何人有中途拿取的操作。 手机不要离手,且一定要设置安全级别较高的密码。 时刻都要保持录音,无论是不是在签合同。 不允许签了…

    数据结构和算法 2023年6月8日
    0100
  • 源代码管理工具介绍

    源代码管理工具介绍 作者:Oto_G 源代码管理工具介绍 前言 工具介绍 网页面板 首页 项目页 使用流程 项目初始 创建一个项目 进入本地开发平台 项目中期 进入本地开发平台 总…

    数据结构和算法 2023年6月12日
    0112
  • 图像质量评估IQAtriq和hyperIQA个人理解

    Junyong You1, Jari Korhonen2 作者单位:1. 挪威研究中心; 2. 中国深圳深圳大学 解决问题:transformer或者Vit不可以输入不同尺度的图像…

    数据结构和算法 2023年6月12日
    083
  • 特殊字符HTML/markdown

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月7日
    091
  • DFS/01-数的全排列【深度优先搜索】

    数如一个数 n, 输出 1~n 的全排列。 如输入 输出: 1 2 31 3 22 1 32 3 13 1 23 2 1 基本框架: // DFS/01-1 #include us…

    数据结构和算法 2023年6月8日
    050
  • win10下apache superset的使用

    一、环境准备 安装python3即3.4以上版本 二、python创建一个虚拟环境用来作为superset的容器 创建虚拟环境:-(1)virtualenv env_superse…

    数据结构和算法 2023年6月8日
    064
  • Java学习笔记

    1. Java语言介绍 在需要运行Java应用程序的操作系统中,安装一个与操作系统对应的Java虚拟机即可。Java虚拟机(JVM)就像一个翻译一样,将java语言程序翻译成各种操…

    数据结构和算法 2023年6月12日
    080
  • LongStream对象转化为List对象

    场景 使用Random类获取伪随机数时,发现longs方法获得了LongStream对象,而我想将其转换为List对象,因为不熟悉流式编程所以特此记录。 语法与说明 R colle…

    数据结构和算法 2023年6月16日
    067
  • 人不如故

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月8日
    060
  • 【题解】洛谷P1001 A+B Problem

    第一篇博客,献给2020年的残夏。静听8月的热情与安宁,在竞赛中的时光如白驹过隙。也不惧未知的风雨,努力向着既往的通途。 题目地址https://www.luogu.com.cn/…

    数据结构和算法 2023年6月7日
    073
  • 利用逻辑回归进行简单的人群分类解决广告推荐问题

    一、什么是逻辑回归? 逻辑回归又称对数几率回归是离散选择法模型之一,逻辑回归是一种用于解决监督学习问题的学习算法,进行逻辑回归的目的是使训练数据的标签值与预测出来的值之间的误差最小…

    数据结构和算法 2023年6月8日
    085
  • POJ 1064 Cable master(浮点数二分 精度处理)

    题目: ​ 给出n棵木头,现在要求将木头裁成k个长度相同的小木头,请问这k个小木头的最大长度是多少。裁出来后不支持拼接。所有长度都是小数点后两位,要求输出答案也是小数点后两位。 思…

    数据结构和算法 2023年6月12日
    075
  • [总结]2022-2-10

    今天超长发挥,状态回升了。两个组混战Rank11。 P1心路历程 赛时 看到T1,觉得就是模拟。如果是其他,也不知道怎么写(事实证明,真的是这样,正解是:平衡树/27棵线段树/27…

    数据结构和算法 2023年6月8日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球