Как повторно использовать соединение redis?

#rust #redis

Вопрос:

Я пытаюсь подключиться к redis. Вот как выглядит мой код:

 #[get("/v1.1/playlist/detail/lt;req_playlist_idgt;")] pub async fn playlist_detail_attr(req_playlist_id: i64, loginUserInfo: LoginUserInfo) -gt; content::Jsonlt;Stringgt; {  let playlistKey = "music:playlist:";  let keyResult = format!("{}{}", playlistKey, loginUserInfo.userId);  const REDIS_CON_STRING: amp;str = "redis://AoGTmVy3U7@cruise-redis-master.reddwarf-cache.svc.cluster.local:6379";  let redis_client = redis::Client::open(REDIS_CON_STRING).expect("can create redis client");  let mut redis_conn = get_con(redis_client);  let cached_playlist = get_str(amp;mut redis_conn.as_ref().unwrap(), amp;keyResult).await;  return if cached_playlist.as_ref().unwrap().is_empty() {  let playlistDetail = query_playlist_detail(req_playlist_id).await;  let res = ApiResponse {  result: playlistDetail,  ..Default::default()  };  let response_json = serde_json::to_string(amp;res).unwrap();  set_str(amp;mut redis_conn.unwrap(), amp;keyResult, amp;response_json, 60*60*24*7);  content::Json(response_json)  } else {  content::Json(cached_playlist.unwrap())  } }  

Я хочу повторно redis_conn использовать операцию redis в запросе и установить операцию redis, если кэшированный ключ равен нулю. Когда я компилирую этот код, он показывает ошибку:

 error[E0596]: cannot borrow data in a `amp;` reference as mutable  --gt; src/biz/music/playlist_controller.rs:21:35  | 21 | let cached_playlist = get_str(amp;mut redis_conn.as_ref().unwrap(), amp;keyResult).await;  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable  

Комментарии:

1. Неясно, что это за тип redis_conn , но если это Option или Result , возможно, вы хотите .as_mut() вместо .as_ref() этого ?

Ответ №1:

Я не думаю as_ref() , as_mut() что это необходимо, так как вы указали изменяемое заимствование, с amp;mut , для redis_conn при передаче его в качестве параметра функции get_str . Кроме того, добавление unwrap() в конец get_con сохранит вызовы ‘unwrap()’ против redis_conn в тех местах, где используется redis_conn. Тем не менее, изменения, как показано ниже. Дай ему попробовать.

 let mut redis_conn = get_con(redis_client).unwrap(); let cached_playlist = get_str(amp;mut redis_conn, amp;keyResult).await;