springboot集成redis并使用redis生成全局唯一索引ID

作者:这世界那么多上官婉儿 时间:2023-11-28 05:42:39 

springboot集成 redis

pom文件

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yaml文件

spring:
 #redis 缓存
 redis:
    connect-timeout: 180000 #连接超时时间
   lettuce:
     pool:
       #连接池最大连接数
       max-active: 8
       #最大阻塞等待时间(负数表示没限制)
       max-wait: 1
       #连接池最大空闲连接
       max-idle: 5
       #连接池最小空闲连接
       min-idle: 0
   #单机模式
#    database: 0 # 集群模式该参数不生效
#    host: 127.0.0.1
#    port: 6379
   #集群模式开启
   cluster:
     nodes: 127.0.0.1:6379,127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005
     max-redirects: 3
   password:

测试验证

调用该接口,返回 22,则集成redis成功;

springboot集成redis并使用redis生成全局唯一索引ID

redis生成全局唯一索引ID

使用redis的RedisAtomicLong可以生成分布式自增的ID值;直接上代码:

import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.wd.basic.common.support.component.CustomIdGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.annotation.Resource;
/**
* mybatis 配置
*
* @author 上官婉儿
* @date 2022/03/21
*/
@Slf4j
@Configuration
public class MybatisPlusConfig {
@Resource
   private StringRedisTemplate stringRedisTemplate;
@Bean
   public IdentifierGenerator idGenerator() {
       return new CustomIdGenerator(stringRedisTemplate);
   }
}

由于此工具类需要放在 common包,所以在调用系统上新增 MybatisPlusConfig,在项目启动时候,将bean(stringRedisTemplate)送进到CustomIdGenerator中(我是这样理解的,可能不能这么解释)

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.wd.basic.common.exception.BasicException;
import com.wd.basic.common.exception.enums.IDGeneratorExceptionEnum;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import java.util.Date;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* 自定义id发电机
*
* @author 上官婉儿
* @date 2022/03/21
*/
public class CustomIdGenerator {
private static final String I_KEY_PREFIX = "IKey:generator";
public static final int KEY_EXPIRE_TIME = 2;
private final StringRedisTemplate stringRedisTemplate;
public CustomIdGenerator(StringRedisTemplate stringRedisTemplate) {
       this.stringRedisTemplate = stringRedisTemplate;
   }
/**
    * 年月日时分秒 +6位 redis返回的自增序列(如000001、000002、000003...)
    * redis返回的自增序列 规则:
    * 根据传入的 key(相当于字段名)生成自增的序列,2s后重新自增;
    * 由于redis的incr原子性,也能保证每次返回的结果不会出现相同的值,
    */
   @Override
   public String nextUUID(Object entity) {
       String bizKey = entity.getClass().getName();
       String dateStr = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_FORMATTER);
       RedisAtomicLong counter = new RedisAtomicLong(I_KEY_PREFIX + bizKey, Objects.requireNonNull(stringRedisTemplate.getConnectionFactory()));
       counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS);
       long redisId = counter.incrementAndGet();
       String redisIdStr = StrUtil.fillBefore(String.valueOf(redisId), '0',6);
       return dateStr + redisIdStr;
   }
}

测试验证

开始10个线程,跑1000次:

springboot集成redis并使用redis生成全局唯一索引ID

结果如下,2s可以照常跑1000条完无重复值

springboot集成redis并使用redis生成全局唯一索引ID

改成10000试试, 还是跑到了 10000,原来是 每一条线程进去后,走这个代码 counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS);将这个key的失效时间重新设置了一下,不过2s生成100000条已经够用了,大家可以根据系统业务,自定义缩短或增加失效时间;

来源:https://juejin.cn/post/7079954943574016007

标签:springboot,redis,全局唯一索引ID
0
投稿

猜你喜欢

  • Java 8新增的方法参数反射实例分析

    2021-11-20 05:55:30
  • Android中自定义ImageView添加文字说明详解

    2022-10-23 18:39:27
  • Java中的异常和处理机制实例详解

    2022-08-10 06:03:19
  • Android 检测键盘显示或隐藏键盘的实现代码

    2022-09-08 09:14:05
  • C#日期格式字符串的相互转换操作实例分析

    2021-09-01 10:06:56
  • 详解Flutter网络图片本地缓存的实现

    2023-08-18 19:44:43
  • C# 通过 oledb 操作Excel实例代码

    2022-12-22 04:27:49
  • C# 邮件发送和接收实现代码

    2021-11-23 03:32:36
  • C#中调用VB中Inputbox类的实现方法

    2023-09-06 18:12:57
  • Android自定义View实现炫酷进度条

    2023-09-22 00:16:07
  • Spring框架应用的权限控制系统详解

    2023-11-11 14:17:11
  • java多线程创建及线程安全详解

    2022-12-02 18:58:51
  • java实现在线聊天系统

    2021-07-30 08:20:54
  • IDEA基于支付宝小程序搭建springboot项目的详细步骤

    2021-10-30 22:44:46
  • Android混合开发教程之WebView的使用方法总结

    2023-03-11 21:27:03
  • springmvc参数为对象,数组的操作

    2022-04-20 07:38:03
  • 简单谈谈Struts动态表单(DynamicForm)

    2022-10-07 07:24:29
  • springboot整合websocket最基础入门使用教程详解

    2023-11-30 00:20:24
  • C#中String StringBuilder StringBuffer类的用法

    2023-05-21 02:35:50
  • java实现操作系统的短进程作业调度示例分享

    2022-05-30 21:02:19
  • asp之家 软件编程 m.aspxhome.com