每个用户处理一条消息

o0lyfsai  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(373)

我在redis中有一个用作队列的列表。我把元素推到左边,然后从右边弹出。来自不同用户的请求被推到队列中。我有一个goroutine池,它从队列(pop)中读取请求并处理它们。我希望一次只能处理每个用户ID的一个请求。我有一个readrequest()函数永远运行,它弹出一个有用户ID的请求。我需要每个用户的请求被处理的顺序,他们进来。我不知道该怎么实施。我需要每个用户ID的redis列表吗?如果是这样,我将如何循环处理所有列表中的请求?

for i:=0; i< 5; i++{
  wg.Add(1)
  go ReadRequest(&wg)

}

func ReadRequest(){

   for{

      //redis pop request off list
       request:=MyRedisPop()
       fmt.Println(request.UserId)

      // only call Process if no other goroutine is processing a request for this user
      Process(request)

 time.sleep(100000)
     }

wg.Done()

}
6ioyuze2

6ioyuze21#

以下是无需创建多个redis列表即可使用的伪代码:

// maintain a global map for all users
// if you see a new user, call NewPerUser() and add it to the list
// Then, send the request to the corresponding channel for processing
var userMap map[string]PerUser 

type PerUser struct {
    chan<- redis.Request // Whatever is the request type
    semaphore *semaphore.Weighted // Semaphore to limit concurrent processing
}

func NewPerUser() *PerUser {
    ch := make(chan redis.Request)
    s := semaphore.NewWeighted(1) // One 1 concurrent request is allowed
    go func(){
        for req := range ch {
            s.Acquire(context.Background(), 1)
            defer s.Release(1)
            // Process the request here
        }
    }()
}

请注意,这只是一个伪代码,我还没有测试它是否工作。

相关问题