Redis 定長佇列(支援redis集群)

2021-10-25 15:06:03 字數 2186 閱讀 4669

某些業務場景,需要實現原子性的,效能可靠的分布式定長佇列,它必須具備以下功能:

)// 定長list

type redislimitlist struct

func

newlimitlist

(expireseconds int

, maxlen int

, scheme int

) redislimitlist

}var beyonderr = errorx.

newserviceerror

("超出list最大長度限制",1

)// key list的key

// value 壓入的值

// maxlength 最大長度

func

(rll redislimitlist)

lpush

(conn redis.conn, key string

, value [

]byte)(

int,

error

)// key list的key

// value 壓入的值

// maxlength 最大長度

// list打滿後,將不再接受新的資料,除非隨後pop騰出了位置。

func

(rll redislimitlist)

lpushscheme1

(conn redis.conn, key string

, value [

]byte)(

int,

error

)if vint ==-3

return vint,

nil}

// key list的key

// value 壓入的值

// maxlength 最大長度

// list打滿後,將pop出最老的,再push進新資料

func

(rll redislimitlist)

lpushscheme2

(conn redis.conn, key string

, value [

]byte)(

int,

error

)return vint,

nil}

func

(rll redislimitlist)

llen

(conn redis.conn, key string

)int

return l

}func

(rll redislimitlist)

lrange

(conn redis.conn, key string

, start int

, stop int)(

byte

,error

)func

(rll redislimitlist)

rpop

(conn redis.conn, key string)(

byte

,error

)

package redistool

import

("fmt"

"testing"

)func

testlimitlist

(t *testing.t)

panic

(e)}

fmt.

println

(lenth)

rs, e := ll.

lrange

(conn,

"test_limit_list",0

,-1)

if e !=

nilfor

_, v :=

range rs

}

輸出

msg2

msg1

msg0

如果使用scheme2(彈出最早的,以插入最新的),則輸出

msg4

msg3

msg2

定長佇列的C實現

以後有空就寫個部落格,算是技術筆記。這個佇列實現暫且定位為 單生產者單消費者模型 在這個迴圈佇列裡,隊空 的條件是 隊頭索引 隊尾索引,隊滿 的條件是 隊尾索引加1等於隊頭索引 按照慣性思維,隊頭在左邊,隊尾在右邊,入隊是尾右移,索引值增加,出隊是隊頭右移,索引增加。include include ...

模板佇列 支援多執行緒

queue.h 用於快取資料報的佇列容器 pragma once define win32 lean and mean include include define defaultmaxsize 1000000 templateclass queue include queue.cpp queue....

利用redis實現定長的執行緒佇列

redis 首先就不做簡介啦,直接上 和功能 首先我們有乙個長度不定的佇列takslist用於接收所有的任務,然後有乙個定長的執行任務佇列runningtask用於控制正在執行的執行緒個數 3個 1 模擬乙個生產者程序,用於不斷地產生任務 redis生產者程序 yufeng on 2018 1 22...