mycommon_utils/database/
redis_util.rs1use std::sync::Arc;
2use redis::{FromRedisValue, RedisResult, ToRedisArgs};
3use crate::database::config::{ REDIS_ASYNC_POOL};
4
5pub struct RedisAsync;
115
116impl RedisAsync {
117 fn pool() -> &'static Arc<deadpool_redis::Pool> {
118 REDIS_ASYNC_POOL.get().expect("Redis async pool not initialized")
119 }
120
121 pub async fn set<T: ToRedisArgs + Send + Sync>(key: &str, value: &T) -> RedisResult<()> {
123 let mut conn = Self::pool().get().await.map_err(|e| {
124 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
125 })?;
126 redis::cmd("SET").arg(key).arg(value).query_async(&mut *conn).await
127 }
128
129 pub async fn set_with_expiry<T: ToRedisArgs + Send + Sync>(key: &str, value: &T, expiry_seconds: u64) -> RedisResult<()> {
131 let mut conn = Self::pool().get().await.map_err(|e| {
132 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
133 })?;
134 redis::cmd("SET")
135 .arg(key)
136 .arg(value)
137 .arg("EX")
138 .arg(expiry_seconds)
139 .query_async(&mut *conn).await
140 }
141
142 pub async fn set_nx_ex<T: ToRedisArgs + Send + Sync>(key: &str, value: &T, expiry_seconds: u64) -> RedisResult<bool> {
144 let mut conn = Self::pool().get().await.map_err(|e| {
145 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
146 })?;
147 let result: Option<String> = redis::cmd("SET")
148 .arg(key)
149 .arg(value)
150 .arg("NX")
151 .arg("EX")
152 .arg(expiry_seconds)
153 .query_async(&mut *conn).await?;
154 Ok(result == Some("OK".to_string()))
155 }
156
157 pub async fn get<T: FromRedisValue + Send>(key: &str) -> RedisResult<Option<T>> {
159 let mut conn = Self::pool().get().await.map_err(|e| {
160 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
161 })?;
162 redis::cmd("GET").arg(key).query_async(&mut *conn).await
163 }
164
165 pub async fn expire(key: &str, expiry_seconds: i64) -> RedisResult<bool> {
167 let mut conn = Self::pool().get().await.map_err(|e| {
168 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
169 })?;
170 let result: i32 = redis::cmd("EXPIRE").arg(key).arg(expiry_seconds).query_async(&mut *conn).await?;
171 Ok(result == 1)
172 }
173
174 pub async fn exists(key: &str) -> RedisResult<bool> {
176 let mut conn = Self::pool().get().await.map_err(|e| {
177 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
178 })?;
179 let exists: i32 = redis::cmd("EXISTS").arg(key).query_async(&mut *conn).await?;
180 Ok(exists == 1)
181 }
182
183 pub async fn del(key: &str) -> RedisResult<i32> {
185 let mut conn = Self::pool().get().await.map_err(|e| {
186 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
187 })?;
188 redis::cmd("DEL").arg(key).query_async(&mut *conn).await
189 }
190
191 pub async fn del_vec(keys: &[&str]) -> RedisResult<i32> {
193 let mut conn = Self::pool().get().await.map_err(|e| {
194 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
195 })?;
196 redis::cmd("DEL").arg(keys).query_async(&mut *conn).await
197 }
198
199 pub async fn ttl(key: &str) -> RedisResult<i64> {
201 let mut conn = Self::pool().get().await.map_err(|e| {
202 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
203 })?;
204 redis::cmd("TTL").arg(key).query_async(&mut *conn).await
205 }
206
207 pub async fn incr(key: &str) -> RedisResult<i64> {
209 let mut conn = Self::pool().get().await.map_err(|e| {
210 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
211 })?;
212 redis::cmd("INCR").arg(key).query_async(&mut *conn).await
213 }
214
215 pub async fn decr(key: &str) -> RedisResult<i64> {
217 let mut conn = Self::pool().get().await.map_err(|e| {
218 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
219 })?;
220 redis::cmd("DECR").arg(key).query_async(&mut *conn).await
221 }
222
223 pub async fn hset<K: ToRedisArgs + Send + Sync, V: ToRedisArgs + Send + Sync>(key: &str, field: K, value: V) -> RedisResult<()> {
225 let mut conn = Self::pool().get().await.map_err(|e| {
226 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
227 })?;
228 redis::cmd("HSET").arg(key).arg(field).arg(value).query_async(&mut *conn).await
229 }
230
231 pub async fn hget<T: FromRedisValue + Send>(key: &str, field: &str) -> RedisResult<Option<T>> {
233 let mut conn = Self::pool().get().await.map_err(|e| {
234 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
235 })?;
236 redis::cmd("HGET").arg(key).arg(field).query_async(&mut *conn).await
237 }
238
239 pub async fn lpush<T: ToRedisArgs + Send + Sync>(key: &str, value: T) -> RedisResult<i32> {
241 let mut conn = Self::pool().get().await.map_err(|e| {
242 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
243 })?;
244 redis::cmd("LPUSH").arg(key).arg(value).query_async(&mut *conn).await
245 }
246
247 pub async fn rpop(key: &str) -> RedisResult<Option<String>> {
249 let mut conn = Self::pool().get().await.map_err(|e| {
250 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
251 })?;
252 redis::cmd("RPOP").arg(key).query_async(&mut *conn).await
253 }
254
255 pub async fn xadd_maxlen<K: ToRedisArgs + Send + Sync, V: ToRedisArgs + Send + Sync>(
257 key: &str,
258 maxlen: usize,
259 field: K,
260 value: V,
261 ) -> RedisResult<String> {
262 let mut conn = Self::pool().get().await.map_err(|e| {
263 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
264 })?;
265 redis::cmd("XADD")
266 .arg(key)
267 .arg("MAXLEN")
268 .arg("~")
269 .arg(maxlen)
270 .arg("*")
271 .arg(field)
272 .arg(value)
273 .query_async(&mut *conn)
274 .await
275 }
276 pub async fn xdel<ID: ToRedisArgs + Send + Sync>(key: &str, ids: &[&ID]) -> RedisResult<i32> {
278 let mut conn = Self::pool().get().await.map_err(|e| {
279 redis::RedisError::from((redis::ErrorKind::Io, "Pool error", format!("{:?}", e)))
280 })?;
281 redis::cmd("XDEL").arg(key).arg(ids).query_async(&mut *conn).await
282 }
283}