golang通过redis调用rust
Posted 吴冬冬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang通过redis调用rust相关的知识,希望对你有一定的参考价值。
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做具体的底层实现。
以上是关于golang通过redis调用rust的主要内容,如果未能解决你的问题,请参考以下文章
Rust + Go 双剑合璧:WebAssembly 领域应用