Maison  >  Article  >  base de données  >  Comment Springboot intègre Redis et génère un ID d'index unique au monde

Comment Springboot intègre Redis et génère un ID d'index unique au monde

PHPz
PHPzavant
2023-05-30 23:01:071533parcourir

springboot intégré redis

fichier pom

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

application.yaml file

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:

vérification du test

call Si cette interface renvoie 22, l'intégration de redis est réussie ; Générez une valeur d'ID distribuée auto-croissante, entrez directement le code :

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);
    }
}

Puisque cette classe d'outils doit être placée dans le package commun, ajoutez MybatisPlusConfig sur le système appelant, et lorsque le projet démarre, ajouter le bean (stringRedisTemplate ) est envoyé au CustomIdGenerator (c'est comme ça que je le comprends, mais cela ne peut pas être expliqué de cette façon) Comment Springboot intègre Redis et génère un ID dindex unique au monde

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), &#39;0&#39;,6);
        return dateStr + redisIdStr;
    }
}

Test vérification

Démarrez 10 fils de discussion et exécutez 1000 fois :

Les résultats sont les suivants, 1000 entrées peuvent être exécutées comme d'habitude en 2 secondes sans valeurs en double

Comment Springboot intègre Redis et génère un ID dindex unique au mondeChange J'ai essayé de le régler sur 10 000, mais il a quand même atteint 10 000. Il s'avère qu'après chaque entrée de fil, utilisez. ce code counter.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS) ; pour réinitialiser le délai d'expiration de cette clé, mais 2 secondes suffisent pour générer 100 000 entrées. Après l'avoir utilisé, vous pouvez personnaliser le raccourcissement ou l'augmentation du délai d'expiration en fonction du système. affaires

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer