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

网友投稿 337 2022-08-17


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

部署redis

Windows下搭建Reids本地集群,可参考https://jb51.net/article/242520.htm

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条已经够用了,http://大家可以根据系统业务,自定义缩短或增加失效时间;


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Netty分布式ByteBuf使用page级别的内存分配解析
下一篇:Netty分布式ByteBuf使用命中缓存的分配解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~