springboot集成redis并使用redis生成全局唯一索引ID
作者:这世界那么多上官婉儿 发布时间:2023-11-28 05:42:39
标签:springboot,redis,全局唯一索引ID
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成功;
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条已经够用了,大家可以根据系统业务,自定义缩短或增加失效时间;
来源:https://juejin.cn/post/7079954943574016007
0
投稿
猜你喜欢
- spring data jpa @query返回map踩坑记录最近用spring data jpa,网上看的一些教程,有的说是返回的Obje
- java 中newInstance()方法和new关键字的区别* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新
- 递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现:1.首先从菜单数据中获取所有根节点。2.
- 一、获取接口请求的数据可以在Interceptor的afterCompletion中实现但是要重写RequestWrapper代码记录如下:
- 一、简介Android的消息机制主要是指Handler的运行机制,那么什么是Handler的运行机制那?通俗的来讲就是,使用Handler将
- NDK部分1、下载ndk这里就一笔带过了。2、解压ndk不要解压,文件权限会出错。执行之,会自动解压,然后mv到想放的地方。我放到了”/us
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e
- Java Collection API提供了一些列的类和接口来帮助我们存储和管理对象集合。其实Java中的集合工作起来像是一个数组,不过集合
- 本节我们主要介绍 Ribbon 的一些常用配置和配置 Ribbon 的两种方式。常用配置1. 禁用 Eureka当我们在 RestTempl
- 先上图下拉刷新跟原生开发一样,下拉刷新在flutter里提供的有组件实现 RefreshIndicator一直不明白为啥组件中都提供下拉刷新
- Android 显示GIF图片实例详解gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以
- 在看别人的关于CopyOnWriteArrayList 这个类的时候,看到有人提出了关于:数组拷贝的方法Arrays.copyOf() 的问
- 多线程的创建,方式一:继承于Thread类1.创建一个继承于Thread类的子类2.重写Thread类的run()--->将此线程执行
- 在使用springmvc的时候,后台@RequestBody接受的是一个json格式的字符串,一定是一个字符串。我们可以通过@Request
- 最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧!添加jar包:<dependenc
- 最近有个需求,需要统计APP的在线人数,其实以前也统计过,采取的是上线发送一个请求$this->cache->incr()加1,
- 开放端口安全组没开放端口是原罪!!!导致好多BUG费时费力。Hbase悄悄 * 的用了好多端口,比如被我抓到的42239,直接搜索报错药不对症
- 五子棋游戏(Java),供大家参考,具体内容如下思路:1.首先创建一个棋盘,建立一个二维数组,此文中为一个15*15的二维数组,2.初始化棋
- 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java
- 话不多说,请看实例代码String ip = request.getHeader("x-forwarded-for");