我对redis的认识,知道redis需要进队列,出队列概念。如果我现在要做用redis做生成订单号,用来避免高并发问题。那思路是怎么样的呢?
我先说一下我的理解:
$redisValue = 1000;
1.向redis添加一个key:
$this->_redisInfo->set("sn",$redisValue);
2.进入队列
$this->_redisInfo->push("orderSn",$redisValue)
3.进入成功之后,对key=sn自增加1
$redisValue = $this->_redisInfo->increment("sn");
4.出对列
$this->_redisInfo->pop("sn");
我运行了代码,但是不行,$redisValue自动加1失败(也就是进入队列失败了),我想知道为什么?求大神,我该如何做?
我印象中Redis的众多数据类型中,并没有队列(Queue)的数据类型,Redis的数据类型有:string(字符串),Hash(哈希),List(列表),Set(集合),有序集合(Sorted Set)。
如果你仅仅想生成订单号(OrderSn),可以提前生成好Sn号并入队,然后存储在Redis缓存里。
例如:
// 伪代码你这个应该是.net程序。
我看到你是入队了之后,然后就出对了,然后再把订单号放入redis中缓存。(为什么要这种呢?)
你这个是入队了之后就生成了订单号?
我理解的是:如果生成一个订单号,应该是在入队成功之后生成一个,再来个就排队,生成完之后就出队。
上面只是演示, 上面的业务流程是假设的,它是这样假设的:
先提前生成一批Sn并按顺序入队,然后存储在Redis,当客户端下订单时,就从队列里出队一个Sn,然后剩下的就放回去。
我理解的是:如果生成一个订单号,应该是在入队成功之后生成一个,再来个就排队,生成完之后就出队。
你觉得这种思路可以不?
这种思路不
我会这样做,首先我认为Sn它仅仅是订单里的一个流水号,为提高订单量然后做一个消息中间件,大致思路如下:
第1步,在数据库里建立一个序列Sequence作为Sn;
第2步,客户端(就是Web前端)页面,客户下订单时所有订单信息插入到Redis集群缓存从服务器(这里根据客户所在地,例如,客户在广州,就插入到广州子结点缓存服务器,深圳就插入到深圳结点缓存服务器)。
第3步,建立订单处理中心,专门负责将Redis缓存里订单作统一插入到数据库(此时是从Redis集群缓存主服务器读取)在批量处理时根据下单时间逐一调用Sequence序列作为Sn赋值给每张订单。
以上是我的思路。