redis处理数据问题

我对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缓存里。

例如:

            // 伪代码
 
            Queue<string> snQueue = null; // 订单号Sn队列
            string sn = Redis.Get("OrderSn");
            string curSn = string.Empty;
            if(String.IsNullOrWhiteSpace(sn)){

                snQueue = new Queue<string>();
                for (int i = 0; i < 30000; i++) // 假定 双11,每秒3万订单
                {
                    // 提前分配好订单Sn号   入队
                    snQueue.Enqueue(DateTime.Now.ToString("yyyMMdd") + i);
                }
                curSn = snQueue.Dequeue(); // 出队
                Redis.Set("OrderSn", JsonConvert.SerializeObject(snQueue));
            }
            else
            {
              snQueue=JsonConvert.DeserializeObject<Queue<string>>(sn);
              curSn = snQueue.Dequeue(); // 出队
              Redis.Set("OrderSn", JsonConvert.SerializeObject(snQueue));// 重新放入Redis缓存
            }

追问

你这个应该是.net程序。
我看到你是入队了之后,然后就出对了,然后再把订单号放入redis中缓存。(为什么要这种呢?)
你这个是入队了之后就生成了订单号?
我理解的是:如果生成一个订单号,应该是在入队成功之后生成一个,再来个就排队,生成完之后就出队。

追答

上面只是演示, 上面的业务流程是假设的,它是这样假设的:
先提前生成一批Sn并按顺序入队,然后存储在Redis,当客户端下订单时,就从队列里出队一个Sn,然后剩下的就放回去。

追问

我理解的是:如果生成一个订单号,应该是在入队成功之后生成一个,再来个就排队,生成完之后就出队。

你觉得这种思路可以不?

追答

这种思路不

我会这样做,首先我认为Sn它仅仅是订单里的一个流水号,为提高订单量然后做一个消息中间件,大致思路如下:


第1步,在数据库里建立一个序列Sequence作为Sn;

第2步,客户端(就是Web前端)页面,客户下订单时所有订单信息插入到Redis集群缓存从服务器(这里根据客户所在地,例如,客户在广州,就插入到广州子结点缓存服务器,深圳就插入到深圳结点缓存服务器)。

第3步,建立订单处理中心,专门负责将Redis缓存里订单作统一插入到数据库(此时是从Redis集群缓存主服务器读取)在批量处理时根据下单时间逐一调用Sequence序列作为Sn赋值给每张订单。


以上是我的思路。

温馨提示:答案为网友推荐,仅供参考
相似回答