某些業務場景,需要實現原子性的,效能可靠的分布式定長佇列,它必須具備以下功能:
)// 定長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...