springboot集成redis并生成全局唯一索引ID的方法
springboot集成redispom文件org.springframework.bootspring-boot-starter-data-redisapplication.yaml文件spring:#redis缓存redis:connect-timeout:180000#连接超时时间lettuce:pool:#连接池最大连接数max-active:8#最大阻塞等待时间(负数表示没限制)max-wait:1#连接池最大空闲连接max-idle:5#连接池最小空闲连接min-idle:0#单机模式#dat
springboot集成 redis
pom文件
org.springframework.boot spring-boot-starter-data-redis
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成功;

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次:

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

改成10000试试, 还是跑到了 10000,原来是 每一条线程进去后,走这个代码 counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS);将这个key的失效时间重新设置了一下,不过2s生成100000条已经够用了,大家可以根据系统业务,自定义缩短或增加失效时间;
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















