疯狂的狮子Li
2024-12-12 06a8ab0ab2a0751ed172800296e020cb1a968325
!608 add 新增 基于Redisson的发号器工具
Merge pull request !608 from 秋辞未寒/dev
已添加1个文件
165 ■■■■■ 文件已修改
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,165 @@
package org.dromara.common.redis.utils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.redisson.api.RIdGenerator;
import org.redisson.api.RedissonClient;
import java.time.Duration;
/**
 * å‘号器工具类
 *
 * @author ç§‹è¾žæœªå¯’
 * @date 2024-12-10
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SequenceUtils {
    /**
     * é»˜è®¤åˆå§‹å€¼
     */
    public static final Long DEFAULT_INIT_VALUE = 1L;
    /**
     * é»˜è®¤æ­¥é•¿
     */
    public static final Long DEFAULT_STEP_VALUE = 1L;
    /**
     * é»˜è®¤è¿‡æœŸæ—¶é—´-天
     */
    public static final Duration DEFAULT_EXPIRE_TIME_DAY = Duration.ofDays(1);
    /**
     * é»˜è®¤è¿‡æœŸæ—¶é—´-分钟
     */
    public static final Duration DEFAULT_EXPIRE_TIME_MINUTE = Duration.ofMinutes(1);
    /**
     * èŽ·å–Redisson客户端实例
     */
    private static final RedissonClient REDISSON_CLIENT = SpringUtils.getBean(RedissonClient.class);
    /**
     * èŽ·å–ID生成器
     *
     * @param key        ä¸šåŠ¡key
     * @param expireTime è¿‡æœŸæ—¶é—´
     * @param initValue  ID初始值
     * @param stepValue  ID步长
     * @return ID生成器
     */
    private static RIdGenerator getIdGenerator(String key, Duration expireTime, Long initValue, Long stepValue) {
        if (initValue == null || initValue <= 0) {
            initValue = DEFAULT_INIT_VALUE;
        }
        if (stepValue == null || stepValue <= 0) {
            stepValue = DEFAULT_STEP_VALUE;
        }
        RIdGenerator idGenerator = REDISSON_CLIENT.getIdGenerator(key);
        // è®¾ç½®è¿‡æœŸæ—¶é—´
        idGenerator.expire(expireTime);
        // è®¾ç½®åˆå§‹å€¼å’Œæ­¥é•¿
        idGenerator.tryInit(initValue, stepValue);
        return idGenerator;
    }
    /**
     * èŽ·å–æŒ‡å®šä¸šåŠ¡key的唯一id
     *
     * @param key        ä¸šåŠ¡key
     * @param expireTime è¿‡æœŸæ—¶é—´
     * @param initValue  ID初始值
     * @param stepValue  ID步长
     * @return å”¯ä¸€id
     */
    public static long nextId(String key, Duration expireTime, Long initValue, Long stepValue) {
        return getIdGenerator(key, expireTime, initValue, stepValue).nextId();
    }
    /**
     * èŽ·å–æŒ‡å®šä¸šåŠ¡key的唯一id字符串
     *
     * @param key        ä¸šåŠ¡key
     * @param expireTime è¿‡æœŸæ—¶é—´
     * @param initValue  ID初始值
     * @param stepValue  ID步长
     * @return å”¯ä¸€id
     */
    public static String nextIdStr(String key, Duration expireTime, Long initValue, Long stepValue) {
        return String.valueOf(nextId(key, expireTime, initValue, stepValue));
    }
    /**
     * èŽ·å–æŒ‡å®šä¸šåŠ¡key的唯一id (ID初始值=1,ID步长=1)
     *
     * @param key        ä¸šåŠ¡key
     * @param expireTime è¿‡æœŸæ—¶é—´
     * @return å”¯ä¸€id
     */
    public static long nextId(String key, Duration expireTime) {
        return getIdGenerator(key, expireTime, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
    }
    /**
     * èŽ·å–æŒ‡å®šä¸šåŠ¡key的唯一id字符串 (ID初始值=1,ID步长=1)
     *
     * @param key        ä¸šåŠ¡key
     * @param expireTime è¿‡æœŸæ—¶é—´
     * @return å”¯ä¸€id
     */
    public static String nextIdStr(String key, Duration expireTime) {
        return String.valueOf(nextId(key, expireTime));
    }
    /**
     * èŽ·å– yyyyMMdd å¼€å¤´çš„唯一id
     *
     * @return å”¯ä¸€id
     */
    public static String nextIdDate() {
        return nextIdDate("");
    }
    /**
     * èŽ·å– prefix + yyyyMMdd å¼€å¤´çš„唯一id
     *
     * @param prefix ä¸šåŠ¡å‰ç¼€
     * @return å”¯ä¸€id
     */
    public static String nextIdDate(String prefix) {
        // å‰ç¼€+日期 æž„建 prefixKey
        String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_FORMATTER));
        // èŽ·å–ä¸‹ä¸€ä¸ªid
        long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_DAY, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
        // è¿”回完整id
        return StringUtils.format("{}{}", prefixKey, nextId);
    }
    /**
     * èŽ·å– yyyyMMddHHmmss å¼€å¤´çš„唯一id
     *
     * @return å”¯ä¸€id
     */
    public static String nextIdDateTime() {
        return nextIdDateTime("");
    }
    /**
     * èŽ·å– prefix + yyyyMMddHHmmss å¼€å¤´çš„唯一id
     *
     * @param prefix ä¸šåŠ¡å‰ç¼€
     * @return å”¯ä¸€id
     */
    public static String nextIdDateTime(String prefix) {
        // å‰ç¼€+日期时间 æž„建 prefixKey
        String prefixKey = StringUtils.format("{}{}", StringUtils.blankToDefault(prefix, ""), DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_FORMATTER));
        // èŽ·å–ä¸‹ä¸€ä¸ªid
        long nextId = getIdGenerator(prefixKey, DEFAULT_EXPIRE_TIME_MINUTE, DEFAULT_INIT_VALUE, DEFAULT_STEP_VALUE).nextId();
        // è¿”回完整id
        return StringUtils.format("{}{}", prefixKey, nextId);
    }
}