@@ -10,6 +10,19 @@ import (
1010 "github.com/redis/go-redis/v9"
1111)
1212
13+ func batchSlice (n int ) [][]int {
14+ const size = 1000
15+ var batches [][]int
16+ for i := 0 ; i < n ; i += size {
17+ j := i + size
18+ if j > n {
19+ j = n
20+ }
21+ batches = append (batches , []int {i , j })
22+ }
23+ return batches
24+ }
25+
1326type redisQueue struct {
1427 client redis.UniversalClient
1528
@@ -170,6 +183,16 @@ func (q *redisQueue) Enqueue(job *Job, opt *EnqueueOptions) error {
170183}
171184
172185func (q * redisQueue ) BulkEnqueue (jobs []* Job , opt * EnqueueOptions ) error {
186+ for _ , batch := range batchSlice (len (jobs )) {
187+ err := q .bulkEnqueueSmallBatch (jobs [batch [0 ]:batch [1 ]], opt )
188+ if err != nil {
189+ return err
190+ }
191+ }
192+ return nil
193+ }
194+
195+ func (q * redisQueue ) bulkEnqueueSmallBatch (jobs []* Job , opt * EnqueueOptions ) error {
173196 err := opt .Validate ()
174197 if err != nil {
175198 return err
@@ -201,6 +224,18 @@ func (q *redisQueue) Dequeue(opt *DequeueOptions) (*Job, error) {
201224}
202225
203226func (q * redisQueue ) BulkDequeue (count int64 , opt * DequeueOptions ) ([]* Job , error ) {
227+ var jobs []* Job
228+ for _ , batch := range batchSlice (int (count )) {
229+ foundJobs , err := q .bulkDequeueSmallBatch (int64 (batch [1 ]- batch [0 ]), opt )
230+ if err != nil {
231+ return nil , err
232+ }
233+ jobs = append (jobs , foundJobs ... )
234+ }
235+ return jobs , nil
236+ }
237+
238+ func (q * redisQueue ) bulkDequeueSmallBatch (count int64 , opt * DequeueOptions ) ([]* Job , error ) {
204239 err := opt .Validate ()
205240 if err != nil {
206241 return nil , err
@@ -236,6 +271,16 @@ func (q *redisQueue) Ack(job *Job, opt *AckOptions) error {
236271}
237272
238273func (q * redisQueue ) BulkAck (jobs []* Job , opt * AckOptions ) error {
274+ for _ , batch := range batchSlice (len (jobs )) {
275+ err := q .bulkAckSmallBatch (jobs [batch [0 ]:batch [1 ]], opt )
276+ if err != nil {
277+ return err
278+ }
279+ }
280+ return nil
281+ }
282+
283+ func (q * redisQueue ) bulkAckSmallBatch (jobs []* Job , opt * AckOptions ) error {
239284 err := opt .Validate ()
240285 if err != nil {
241286 return err
@@ -253,6 +298,18 @@ func (q *redisQueue) BulkAck(jobs []*Job, opt *AckOptions) error {
253298}
254299
255300func (q * redisQueue ) BulkFind (jobIDs []string , opt * FindOptions ) ([]* Job , error ) {
301+ var jobs []* Job
302+ for _ , batch := range batchSlice (len (jobIDs )) {
303+ foundJobs , err := q .bulkFindSmallBatch (jobIDs [batch [0 ]:batch [1 ]], opt )
304+ if err != nil {
305+ return nil , err
306+ }
307+ jobs = append (jobs , foundJobs ... )
308+ }
309+ return jobs , nil
310+ }
311+
312+ func (q * redisQueue ) bulkFindSmallBatch (jobIDs []string , opt * FindOptions ) ([]* Job , error ) {
256313 err := opt .Validate ()
257314 if err != nil {
258315 return nil , err
0 commit comments