我是靠谱客的博主 斯文香烟,最近开发中收集的这篇文章主要介绍redis生成订单号案例前言一、redis的相关工具类二、生成订单号相关方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、redis的相关工具类
  • 二、生成订单号相关方法


前言

项目开发中遇到了对订单号的修改,这里只是实现了利用redis的计数器功能来生成订单号,与要求的这个订单号需要与订单数相关联的需求还是有差距的,故此订单号这项功能暂时搁置。


提示:以下是本篇文章正文内容,下面案例可供参考

一、redis的相关工具类

/**
*redis的相关工具类
*/
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/***
* 根据key获取redis里面的值
*/
public Long get(String key) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long result = entityIdCounter.get();
return result;
}
/***
* 根据key和value赋值
*/
public void set(String key, Long value) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
entityIdCounter.set(value);
}
/***
* 递增,没有设置过期时间
*/
public Long getIncr(String key) {
return getIncr(key, 0L);
}
/***
* 递减,没有设置过期时间
*/
public Long getIndr(String key) {
return getIndr(key, 0L);
}
/***
* 递增并设置过期时间,毫秒数算的
*/
public Long getIncr(String key, long liveTime) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement();
if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS);//单位毫秒
}
return increment;
}
/***
* 递减,没有设置过期时间
*/
public Long getIndr(String key, long liveTime) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long indrement = entityIdCounter.getAndDecrement();
if ((null == indrement || indrement.longValue() == 0) && liveTime > 0) {//初始设置过期时间
entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS);//单位毫秒
}
return indrement;
}
/***
* 现在到今天结束的毫秒数
*/
public Long getCurrent2TodayEndMillisTime() {
Calendar todayEnd = Calendar.getInstance();
// Calendar.HOUR 12小时制
// HOUR_OF_DAY 24小时制
todayEnd.set(Calendar.HOUR_OF_DAY, 23);
todayEnd.set(Calendar.MINUTE, 59);
todayEnd.set(Calendar.SECOND, 59);
todayEnd.set(Calendar.MILLISECOND, 999);
return todayEnd.getTimeInMillis()-new Date().getTime();
}
}

二、生成订单号相关方法

	/**
* 生成订单号
* redis的key规则:YYYYMMDD+shopId,有效期24小时
* @param shopId
* @return YYYYMMDD(8)-[店铺ID]-[今日订单数从1开始累加]
*/
public String generateOrderNoTest(Long shopId, Long userId){
//从redis里面取值
String dateTime = sdf.format(new Date());
//拼接redis的key
String key = dateTime+shopId;
Long incr = redisUtil.getIncr(key);
if(incr==0) {
incr = redisUtil.getIncr(key, redisUtil.getCurrent2TodayEndMillisTime());//从001开始
}
DecimalFormat df=new DecimalFormat("00000");//三位序列号
String format = df.format(incr);
return dateTime+shopId+ format;
}

有过在多线程的情况下进行测试,并没有创建重复的订单号,并没有在更大的并发情况下进行测试.

最后

以上就是斯文香烟为你收集整理的redis生成订单号案例前言一、redis的相关工具类二、生成订单号相关方法的全部内容,希望文章能够帮你解决redis生成订单号案例前言一、redis的相关工具类二、生成订单号相关方法所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部