概述
java jfinal和redis作为后台。
具体流程是:
app端:
app有信息展示,用户选择一条信息进入详细,然后点击抢单按钮,这时携带2个id参数发送给后台
后台:
根据2个id,修改订单表的状态和用户的接单数
现在考虑高并发的问题,该怎么使用redis的队列呢?
我试过使用redis 在创建订单时把订单id存入redis
@ActionKey("/order/create")
public void order_create(){
Order order = Order.dao.order_create(map);
JSONObject jsonObject = new JSONObject();
jsonObject.put("rs", order.result);
jsonObject.put("msg", StateDict.dataBaseMsg(order.result));
Cache c = Redis.use("order");
c.rpush("orderlist", order.id);
renderJson(jsonObject);
}
然后在app点击抢单按钮时读取redis
@ActionKey("/order/take")
public void order_take(){
Integer id = getParaToInt(0);
Integer uid = getParaToInt(1);
Cache orderCache = Redis.use("order");
Object orderlist = orderCache.lpop("orderlist");
JSONObject json = new JSONObject();
if(orderlist!=null){
int rs = Order.dao.order_take(id,uid);
json.put("rs", rs);
json.put("msg", StateDict.dataBaseMsg(rs));
}else{
int rs = StateDict.ORDER_TAKEN;
json.put("rs", rs);
json.put("msg", StateDict.dataBaseMsg(rs));
}
renderJson(json);
}
但是我模拟多并发时,同一个用户可以接多次单,也就是用户的接单数不是1次而是多次,
求高手看看 我该怎么写,
我对redis也不是太熟 刚开始使用
这时操作数据库的代码
public int order_take(int id,int uid){
int state = Db.queryInt("SELECT t.state FROM t_order t WHERE t.id=?", id);
//多个请求同时进来的时候state都是0,所以都会进入if条件
if(state==0){
int rs1 = Db.update("UPDATE t_order SET taketime=?,takeuserid=?,state=? WHERE id=?", User.dao.getSysTime(),uid,1,id);
if(rs1>0){
int rs2 = Db.update("UPDATE t_user SET takecount=takecount+1 WHERE id=?",uid);
if(rs2>0){
return StateDict.DATABASE_SUCCESS;
}else{
return StateDict.DATABASE_FAIL;
}
}else{
return StateDict.DATABASE_FAIL;
}
}else{
return StateDict.ORDER_TAKEN;
}
}
最后
以上就是安详鸡翅为你收集整理的java redis订单_java redis做app后台 怎么实现多人抢单的全部内容,希望文章能够帮你解决java redis订单_java redis做app后台 怎么实现多人抢单所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复