attachments-2021-07-cwLuoZzA60e3f935681a1.png

golang的redis端

要注意的是要先订阅回复,然后再发送请求。

package main
import (
"github.com/go-redis/redis"
)
var wait = make(chan interface{})
func main() {
client := redis.NewClient(&redis.Options{
Addr:     "xxxxxxxxx:6379",
Password: "", // no password set
DB:       0,  // use default DB
})
pubsub := client.Subscribe("sayhello_rsp")
defer pubsub.Close()
pubsub.Receive();
go func() {
ch := pubsub.Channel();
select {
case channel := <-ch:
println(channel.Payload)
wait <- 1
}
}()
println("hello rust")
client.Publish("sayhello_req", "hello rust")
<-wait
}

rust端

rust作为被调用端订阅请求,rust将订阅到消息通知和处理分开,并且做成多线程处理。

use std::sync::mpsc;
use std::thread;
use std::sync::Arc;
use std::sync::Mutex;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
    let client = redis::Client::open("redis://xxxxxxxx/")?;
    let mut con = client.get_connection()?;
    let mut pubsub = con.as_pubsub();
    pubsub.subscribe("sayhello_req")?;
    let (tx, rx) = mpsc::channel();
    let receiver = Arc::new(Mutex::new(rx));
    for _ in 1..10 {
        let con2 = client.get_connection()?;
        let rx_arc = Arc::clone(&receiver);
        thread::spawn(move || {
            loop {
                let message = rx_arc.lock().unwrap().recv().unwrap();
                println!("payload : {}", message);
                redis::cmd("PUBLISH").arg("sayhello_rsp").arg("hello go").execute(&con2);
            }
        });
    }
    loop {
        let msg = pubsub.get_message()?;
        let payload: String = msg.get_payload()?;
        tx.send(payload)?;
    }
}

当然反过来也一样,但是基本go做前端api业务,然后rust做具体的底层实现。

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-FCDoxMif62ad33d906bb5.jpeg