当前位置: 萬仟网 > IT编程>数据库>Redis > go+redis实现消息队列发布与订阅的详细过程

go+redis实现消息队列发布与订阅的详细过程

2022年09月18日 Redis 我要评论
在做项目过程中,实现websocket得时候,不知道哪里写的不太合适,客户端消息收到一定程度,剩下的消息收不到,修改了缓冲区大小,还是没有解决问题,后面因为项目结束期比较紧张,没有时间调试消息的时候,

在做项目过程中,实现websocket得时候,不知道哪里写的不太合适,客户端消息收到一定程度,剩下的消息收不到,修改了缓冲区大小,还是没有解决问题,后面因为项目结束期比较紧张,没有时间调试消息的时候,改用了redis队列去做了消息得暂存,客户端轮询去拿对应的消息。

1.生产者随机发布消息,用rpush发布。
2.消费者用lpop订阅消费,一旦没有消息,随机休眠。
redis做消息队列的缺点:没有持久化。一旦消息没有人消费,积累到一定程度后就会丢失

package main

import (
    "fmt"
    "time"
    "os"
    "strconv"
    "math/rand"
    "github.com/gomodule/redigo/redis"
)

const rmq string = "mqtest"

func producer() {
    redis_conn, err := redis.dial("tcp", "127.0.0.1:6379", redis.dialpassword("hdiot"))
    if err != nil {
        fmt.println(err)
        return
    }
    
    defer redis_conn.close()
    
    rand.seed(time.now().unixnano())

    var i = 1

    for {
        _,err = redis_conn.do("rpush", rmq, strconv.itoa(i))
        if(err!=nil) {
            fmt.println("produce error")
            continue
        }
        fmt.println("produce element:%d", i)
        time.sleep(time.duration(rand.intn(10))*time.second)
        i++
    }
}

func consumer() {
    redis_conn, err := redis.dial("tcp", "127.0.0.1:6379", redis.dialpassword("hdiot"))
    if err != nil {
        fmt.println(err)
        return
    }
    
    defer redis_conn.close()

    rand.seed(time.now().unixnano())

    for {
        ele,err := redis.string(redis_conn.do("lpop", rmq))
        if(err != nil) {
            fmt.println("no msg.sleep now")
            time.sleep(time.duration(rand.intn(10))*time.second)
        } else {
            fmt.println("cosume element:%s", ele)
        }
    }
}

func main() {
    list := os.args
    if(list[1] == "pro") {
        go producer()
    } else if (list[1] == "con") {
        go consumer()
    }
    for {
        time.sleep(time.duration(10000)*time.second)
    }
}

到此这篇关于go+redis实现消息队列发布与订阅的详细过程的文章就介绍到这了,更多相关go redis消息队列内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

(1)
打赏 微信扫一扫 微信扫一扫

相关文章:

  • Redis 如何清空所有数据

    Redis 如何清空所有数据

    redis 清空所有数据步骤总结1、打开cmd 命令窗口,切换至redis 安装目录下的bin文件夹2、在cmd 命令窗口,输入连接redis 指令:redis... [阅读全文]
  • redis如何实现清空缓存

    redis如何清空缓存如果你们的项目用到redis啦,虽然设置了过期时间,但有时候修改bug,仍然需要及时清空缓存,去读数据库的数据,所以这篇文章讲解如何在linux下清除redi…

    2022年08月27日 数据库
  • Redis的过期键删除策略原理说明

    redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用cpu时间和避免浪费内存空间之间取得平衡。惰性删除惰性删除策略对cpu…

    2022年08月27日 数据库
  • redis 设置生存和过期时间的原理分析

    在了解原理前 先来看使用方法通过expire命令或者pexpire命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定的秒数或者毫秒数之后,服务器就会自动删除…

    2022年08月27日 数据库
  • 关于redis的延迟双删策略总结

    关于redis的延迟双删策略总结

    redis延迟双删策略1、什么是延迟双删?延迟双删策略是分布式系统中数据库存储和缓存数据保持一致性的常用策略,但它不是强一致。其实不管哪种方案,都避免不了red... [阅读全文]
  • Redisson 主从一致性问题详解

    Redisson 主从一致性问题详解

    redisson 主从一致性我们先来说一下 redis 的主从模式,redis master(主节点)中处理所有发向 redis 的写操作(增删改),redis... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。

发表评论

验证码:
Copyright © 2017-2022  萬仟网 保留所有权利. 琼ICP备2022007597号