Rumah  >  Artikel  >  pangkalan data  >  Cara springboot menyepadukan redis dan menjana ID indeks unik di seluruh dunia

Cara springboot menyepadukan redis dan menjana ID indeks unik di seluruh dunia

PHPz
PHPzke hadapan
2023-05-30 23:01:071541semak imbas

springboot menyepadukan redis

fail pom

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

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

Pengesahan ujian

Panggil antara muka ini dan kembalikan 22, kemudian integrasikan semula Kejayaan;

Cara springboot menyepadukan redis dan menjana ID indeks unik di seluruh dunia

redis menjana ID indeks unik di peringkat global

Menggunakan RedisAtomicLong redis boleh menjana nilai ID peningkatan automatik yang diedarkan terus ke kod:

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

Memandangkan kelas alat ini perlu diletakkan dalam pakej biasa, MybatisPlusConfig ditambahkan pada sistem panggilan Apabila projek dimulakan, kacang (stringRedisTemplate) dihantar ke CustomIdGenerator (begini cara saya memahaminya. , tetapi mungkin tidak dijelaskan dengan cara ini)

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

Pengesahan ujian

Mulakan 10 utas dan jalankan 1000 kali:

Cara springboot menyepadukan redis dan menjana ID indeks unik di seluruh dunia

Hasilnya adalah seperti berikut, anda boleh menjalankan 1000 utas dalam 2 saat seperti biasa Cuba tukar nilai berulang

Cara springboot menyepadukan redis dan menjana ID indeks unik di seluruh dunia

kepada 10000, dan ia masih mencapai 10000. Ternyata selepas setiap satu. benang masuk, gunakan pembilang kod ini.expire(KEY_EXPIRE_TIME, TimeUnit.SECONDS); perniagaan sistem;

Atas ialah kandungan terperinci Cara springboot menyepadukan redis dan menjana ID indeks unik di seluruh dunia. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam