最近发现数据量特别多的话,更新任务比较繁琐(之前的逻辑是创建一个任务表把需要更新的数据先写入的任务表,然后根据写入的任务数据进行更新=>成功了就修改任务表的状态,失败则状态不更新,下次运行还会执行任务表数据)所以要频繁读写数据库一条一个Update,(可以用redis>进行数据读写操作 毕竟 Redis能读的速度是110000次/s,写的速度是81000次/s)
后续使用rabbitMq
demo ——> 因为redis没有ack(即消息确认机制)概念,只能使用代码进行约束
-> 参考地址 :https://juejin.cn/post/7058699128284381221#heading-10
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
"log"
"math/rand"
"time"
)
var rdb *redis.Pool
func main() {
conn := RedisPool().Get()
//conn := rdb.Get()
fmt.Println(`conn`, conn)
defer rdb.Get().Close()
ProducerMessageList()
ConsumerMessageList()
//str, err := redis.String(conn.Do(`get`, `ceList3`))
//if err != nil {
// log.Panic(`出错了`, err.Error())
// return
//}
//fmt.Println(`conn`, str)
}
// 连接字符串
func RedisPool() *redis.Pool {
rdb = &redis.Pool{
MaxIdle: 5, //最大空闲数
MaxActive: 100, //最大活跃数
IdleTimeout: 240 * time.Second, //最大的空闲连接等待时间,超过此时间后,空闲连接将被关闭
Dial: func() (redis.Conn, error) {
//此处对应redis ip及端口号
pwd := redis.DialPassword(`******`) // 密码
setDb := redis.DialDatabase(0)
conn, err := redis.Dial("tcp", "********:6379", setDb, pwd)
if err != nil {
return nil, err
}
return conn, err
},
}
return rdb
}
//生产一条消息
func ProducerMessageList() {
rand.Seed(time.Now().UnixNano())
log.Println("开启生产者。。。。")
for i := 1; i <= 5; i++ {
score := time.Now().Unix()
log.Println("正在生产一条消息...", score, i)
params := fmt.Sprintf(`11%d`, i)
fmt.Println(`当前param`, params)
_, err := rdb.Get().Do(`lpush`, "ceList2", params)
if err != nil {
log.Println(err)
}
time.Sleep(time.Duration(rand.Intn(3)) * time.Second)
}
}
// 使用list格式消费消息
func ConsumerMessageList() {
for {
// 设置一个5秒的超时时间
value, err := redis.String(rdb.Get().Do(`lpop`,"ceList2"))
//value, err := rdb.BRPop(5 *time.Second,"queue:list").Result()
if err == redis.ErrNil{
// 查询不到数据
time.Sleep(1 * time.Second)
break
}
if err != nil {
// 查询出错
time.Sleep(1 * time.Second)
continue
}
log.Println("消费到数据:", value, "当前时间是:", time.Now().Unix())
time.Sleep(time.Second)
}
}