4
回答
如何将请求放入redis队列中
开发十年,就只剩下这套Java开发体系了   

现有个需求,为了避免高并发问题,controller获取请求后要放入redis队列中。

刚刚网上大致了解了下redis的队列,发现是使用Redis中list的操作BLPOP或BRPOP,或者Pub/Sub。

我这里有不明白的地方,将请求放入redis队列中是什么操作。难道是放url进去?放参数倒是能明白。

举报
Tomdwannn
发帖于6天前 4回/319阅
共有4个答案 最后回答: 3天前

你说的队列其实就是redis存储数据结构的一种方式,类似于c的链表,存址.

至于订阅模式,就好比广播,你说一句话,听众们都能听到你在说什么.

--- 共有 1 条评论 ---
Tomdwannn谢谢你的回答,之前我接触过点rabbit,明白点消息队列是通过channel。 看来我所说的将请求放入redis队列,其实就是一个queue的结构对吗?通过redis中list的操作lpush和rpop对吗? 那请问将请求放入redis是怎么理解 6天前 回复

controller原本是接收请求、处理业务、返回响应的……但是高并发情况下,controller只做:接收请求、把request对象加入到redis的list里面、告诉用户:OK了……然后有单独的进程专门从redis中取出请求、处理后再放入到redis中……然后一个专门的轮询接口,负责查询 到底处理好了没

--- 共有 2 条评论 ---
bingtel 回复 @Tomdwannn : 1. 根据实际情况,可以是参数、设置可以是序列化的http request对象 2. 返回或者推送都行: 如果系统支持websocket,可以推; 也可以把结果还放回redis 然后有接口轮询 6天前 回复
Tomdwannn谢谢你的回答,听你这么说,感觉是我要的东西了。 有几点不理解的地方。 1.把request对象加入到redis的list中,其实,其实这里的request对象,是发过来请求的参数才对吧?而并非是请求url对吗? 2.放入list,以queue的形式存取,去执行对应的service业务。直接将结果返回吗?还是推送出去?因为我理解成消费者和生产者了。 6天前 回复

1,从解决高并发的角度上讲,你不一定要把请求放到redis中,可以放到内存的异步线程池中,把每次请求封装成一牙runnable任务,丢到线程池中去执行就可以了。而且springmvc本身是支持异步返回的。

2,另外一个解决高并发的问题方案是分流,可以使用nigx负载请求。

3,如果是存redis,你需要把请求的参数你要解析出来,封装成对象,然后再序列化为json存到redis中,另一个线程不停的从redis按顺序读取存的数据,再反序列化成对象操作。这样效率会慢,中间增加了序列化,反序列化,和网络io操作。不如采用上面两种方式。

顶部