号利用Redis生成订单号的算法实现(用redis怎么产生订单)
**订单号的生成与Redis算法实现**
订单号在订单系统中一直是绕不开的话题,服务端业务处理非常依赖它。不仅如此,订单号还需要具备可读性,并且必须保证唯一性。从需求以及人性化两个角度讲,订单号一般由订单日期、业务类型、用户ID等三个字段组成。像这样的订单号算法有哪些呢?
[如果使用UUID作为订单号](https://blog.csdn.net/dejunmin/article/detls/81137219),则可以保证唯一性。但由于UUID的长度比较短,在页面中展示时会不太方便,特别是通过UUID精确查询时,搜索起来也不太容易,而且在多实例的分布式系统,也不太能够保证实时的唯一性,因此这种订单号生成算法不是很理想。
[另一种常见的算法是使用计数器](https://www.aliyun.com/jiaocheng/1415402.html),由于其占用空间少和查询方便,因此被广泛使用,但是这种方式也有几个问题,对于分布式系统来说,各节点数据库状态及时同步是一个比较难于解决的问题;由于使用计数器,订单号丢失会造成无法恢复,因此有必要保证计数器的状态是可恢复的;计数器的可靠性是一个问题,需要考虑计数器的原子性等。
[Redis算法可以满足订单号生成](https://www.cnblogs.com/fflXPZ/p/11797115.html)的多方面需求。Redis应用既能够满足订单号唯一性,又能够保证多主机订单号同步很容易,而且可以应用连接池提高集群部署环境下的性能和可用性。具体采取的措施不仅可以使用使用Redis的`incr`命令,也可以使用`setnx`命令。下面给出一个使用`setnx`完成订单号生成的示例代码:
public class Procuder {
private static final String ORDER_KEY = "ORDER_NO";
// 设置Redis唯一值,如果key的值 不存在,则设置key的值 ,并返回true public static long createOrderNo() {
long orderNo = System.currentTimeMillis(); System.out.println(orderNo);
String key = ORDER_KEY + orderNo; Jedis jedis = JedisPoolUtil.getJedis();
Long id = jedis.setnx(key, orderNo + ""); JedisPoolUlt.close(jedis);
if (id == 1) { return orderNo;
} return createOrderNo();
}
public static void mn(String[] args) { System.out.println(createOrderNo());
}}
本文主要给出了利用Redis生成订单号的算法实现方式,可以看出,使用Redis来生成订单号有很多优点:高效、无并发竞争等。希望这篇关于Redis生成订单号的算法实现的文章对读者有所帮助。