在
上篇用純go在本機模擬了下分布式佇列的東西。這裡補上redis佇列部份。
用redis做佇列有下面三個問題需解決:
1. 佇列構建
使用redis的rpush/lpop來解決
2. 引數傳遞/解析
客戶端將josn引數存入redis,server端取出後解析還原。
3. 連線池
redigo支援redis連線池
下面**就是具體解決實現:
[cpp]view plain
copy
//redis做後台任務佇列
//將job放入佇列
r.enqueue()
//依次取出兩個job
r.getjob()
r.getjob()
} type redispool struct
func newredispool(server, password string) (*redispool, error)
pool := &redis.pool
if password != ""
} return c, err
},
testonborrow: func(c redis.conn, t time.time) error ,
} return &redispool, nil
} type job struct `json:"args"`
} //模擬客戶端
func (r *redispool) enqueue() error
j.class = "mail"
j2 := &job{}
j2.class = "log"
for _, v := range *job
_, err = c.do("rpush", "queue", b)
if err != nil
} fmt.println("[enqueue()] succeed!")
return nil
} //模擬job server
func (r *redispool) getjob() error
fmt.println("[getjob()] jobs count:", count)
c := r.pool.get()
defer c.close()
for i := 0; i
var j job
decoder := json.newdecoder(bytes.newreader(reply.(byte)))
if err := decoder.decode(&j); err != nil
fmt.println("[getjob()] ", j.class, " : ", j.args)
} return nil
} func (r *redispool) queuedjobcount() (int, error)
count, ok := lenqueue.(int64)
if !ok
return
int(count), nil
} /*
執行結果:
[enqueue()] succeed!
[getjob()] jobs count: 2
[getjob()] mail : [[email protected] body 2 true]
[getjob()] log : [ccc.log ddd.log [222 333]]
[root@xclos src]#
*/ 可以看到go已能取得引數。都是些最基礎的東西。
redis 佇列 redis 延時佇列
定時發公告 使用者下單30分鐘後未付款自動關閉訂單 使用者下單後延時簡訊提醒 延時關閉空閒客戶端連線 使用redis提供的有序資料結構zset,把過期時間戳作為score。public void produce string topic,string msg,date date 生產訊息 於 消費 ...
Redis訊息佇列
redis的訊息佇列使用簡單,沒有什麼配置,比activemq要輕量級太多,當然功能也比較簡單,如果只需要簡單的訂閱以及發布,可以考慮使用它。訂閱操作 命令為 subscribe channel channel 如 1 所示,即成功訂閱頻道 redis.blog 發布操作 命令為publish ch...
Redis 訊息佇列
訊息佇列,是在構建大型專案的時候 經常會用到的中間價系統,使用訊息佇列有很多好處,例如 1.實現各元件之間的松耦合。利用訊息系統可以使各個元件之間面向資料,而不是面向具體的介面。2.易於擴充套件。對於訊息系統而言,消費者和生產者都可以橫向擴充套件。提到佇列,很自然的就會想到redis的列表型別,可以...