#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;