我是靠谱客的博主 迷路河马,最近开发中收集的这篇文章主要介绍Redis 原子性生成序号/流水号/顺序值,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Redis 原子性生成序号/流水号/顺序值

直接贴代码

package com.example.demo1.redis;
import cn.hutool.core.date.DateUtil;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
@Component
public class OrderSnUtil {
@Resource
private RedissonClient redissonClient;
/**
* 获取订单编号
*
* @return 订单编号
*/
public String getOrderSn() {
// 时间戳随机数
String time = DateUtil.format(new Date(), "yyMMddHHmmss");
int random = (int) ((Math.random() * 9 + 1) * 100);
//设置key值 key值不同从头计算
RAtomicLong atomicLong = redissonClient.getAtomicLong("order_num");
long orderNum;
if (!atomicLong.isExists()) {
orderNum = atomicLong.incrementAndGet();
//设置失效时间
Date endOfDay = DateUtil.offsetHour(new Date(),1);
atomicLong.expireAt(endOfDay);
} else {
orderNum = atomicLong.incrementAndGet();
}
StringBuilder no = new StringBuilder(String.valueOf(orderNum));
//设置长度
if (no.length() > OrderSnPrefix.ORDER_SN_LENGTH) {
atomicLong.delete();
orderNum = atomicLong.incrementAndGet();
Date endOfDay = DateUtil.offsetHour(new Date(),1);
atomicLong.expireAt(endOfDay);
}
no = new StringBuilder(String.valueOf(orderNum));
//自动补0
while (no.length() < OrderSnPrefix.ORDER_SN_LENGTH) {
no.insert(0, "0");
}
return OrderSnPrefix.ORDER + time + random + no;
}
}

最后

以上就是迷路河马为你收集整理的Redis 原子性生成序号/流水号/顺序值的全部内容,希望文章能够帮你解决Redis 原子性生成序号/流水号/顺序值所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部