質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

1164閲覧

RUST Struct型をredisに入れたい。

I_am_

総合スコア23

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2022/01/23 08:58

前提・実現したいこと

こちらでも同じ質問をしました。
私はredisにstruct型をvalueとしてinsertしたいです。
aio::MultiplexedConnection.を使ってasyncでpipeを使用してinsertすることがゴールです。

発生している問題・エラーメッセージ

error

1error[E0698]: type inside `async fn` body must be known in this context 2 --> redis-lib/src/redis_helper.rs:28:14 3 | 428 | pipe.query_async(&mut con) 5 | ^^^^^^^^^^^ cannot infer type for type parameter `T` declared on the associated function `query_async` 6 | 7note: the type is part of the `async fn` body because of this `await` 8 --> redis-lib/src/redis_helper.rs:28:9 9 | 1028 | / pipe.query_async(&mut con) 1129 | | .await; 12 | |__________________^ 13 14For more information about this error, try `rustc --explain E0698`.

該当のソースコード

こちらは実際にstoreしたいstructです。

rust

1#[derive(Debug, Default, Clone)] 2pub struct MyData { 3 pub id: String, 4 pub value: BigDecimal, 5 pub retio: i64, 6}

以下はredisの部分のコードです。
こちらのpipe.query_async(&mut con) .await;でエラーが出ます。

rust

1use anyhow::Result; 2use redis::{aio::MultiplexedConnection, Client}; 3use super::data::{Data, MyData}; 4 5#[derive()] 6pub struct RedisHelper { 7 conn: MultiplexedConnection, 8} 9 10impl RedisHelper { 11 pub async fn setup_redis(&mut self, url: String) -> Result<()> { 12 let cli = Client::open(url)?; 13 14 self.conn = cli.get_multiplexed_async_connection().await?; 15 16 Ok(()) 17 } 18 19 pub async fn insert_hash(&self, data: &MyData) -> Result<()> { 20 let mut con = self.conn.clone(); 21 let mut pipe = redis::pipe(); 22 23 pipe.cmd("HSET") 24 .arg(data.id.clone()) 25 .arg(data) 26 .ignore(); 27 28 pipe.query_async(&mut con) 29 .await; 30 31 Ok(()) 32 } 33}

試したこと、わからないこと

  • おそらくこちらのT: FromRedisValueの実装が必要だと思ったのですがあってますでしょうか?

  • また、こちらはtrait境界?を定義すればいいのでしょうか?

  • try_intoのようなものでできるのかなと思って探してみたのですが、見つかりませんでした。

  • Struct型をredisにstoreする様な記事などをみなかったのですが、一般的にこの様な方法はしないのでしょうか?何かわかることが有ればぜひ、ご教授ください。

rust

1pub async fn query_async<C, T: FromRedisValue>(&self, con: &mut C) -> RedisResult<T> 2 where 3 C: crate::aio::ConnectionLike, 4 { 5 let v = if self.commands.is_empty() { 6 return from_redis_value(&Value::Bulk(vec![])); 7 } else if self.transaction_mode { 8 self.execute_transaction_async(con).await? 9 } else { 10 self.execute_pipelined_async(con).await? 11 }; 12 from_redis_value(&v) 13 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

当該のエラーに関して FromRedisValue は関係ありません。

エラーメッセージの cannot infer type for type parameter `T` declared on the associated function `query_async` がまさしく今回のエラーの原因を示しています。

query_async メソッドは SETGET などの結果を返す時のために戻り値の型がジェネリクスのパラメータになっており、 pipe.query_async(&mut con).await?; と書くだけではこの型が判明しません。
https://docs.rs/redis/0.21.5/redis/struct.Pipeline.html#method.query_async

今回は何も結果を使わないので、 let _: () = pipe.query_async(&mut con).await?; とすると、型推論により query_async の戻り値の型が RedisResult<()> であると判明し、コンパイルが通るようになります。

投稿2022/01/24 10:38

編集2022/01/24 10:43
yaito3014

総合スコア176

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

I_am_

2022/01/24 10:51

回答ありがとうございます。解決しました。 てっきり、Redisから帰ってくる返り値のバイナリを定義したstructにconvertする必要があるのかと勘違いしてました。 型推論の話だったのですね、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問