use redis::{AsyncCommands, Cmd, FromRedisValue, ToRedisArgs, ToSingleRedisArg}; use crate::error::{CacheError, CacheResult}; use crate::kv::Cache; impl Cache { pub async fn sadd( &self, key: &str, member: V, ) -> CacheResult { let mut conn = self.conn().clone(); conn.sadd(key, member).await.map_err(CacheError::from) } pub async fn sadd_many( &self, key: &str, members: Vec, ) -> CacheResult { let mut conn = self.conn().clone(); conn.sadd(key, members).await.map_err(CacheError::from) } pub async fn srem( &self, key: &str, members: V, ) -> CacheResult { let mut conn = self.conn().clone(); conn.srem(key, members).await.map_err(CacheError::from) } pub async fn smove( &self, source: &str, destination: &str, member: V, ) -> CacheResult { let mut cmd = Cmd::new(); cmd.arg("SMOVE").arg(source).arg(destination).arg(member); self.exec(&cmd).await } pub async fn sismember( &self, key: &str, member: M, ) -> CacheResult { let mut conn = self.conn().clone(); conn.sismember(key, member).await.map_err(CacheError::from) } pub async fn smembers(&self, key: &str) -> CacheResult> { let mut conn = self.conn().clone(); conn.smembers(key).await.map_err(CacheError::from) } pub async fn scard(&self, key: &str) -> CacheResult { let mut conn = self.conn().clone(); conn.scard(key).await.map_err(CacheError::from) } pub async fn sinter( &self, keys: K, ) -> CacheResult> { let mut conn = self.conn().clone(); conn.sinter(keys).await.map_err(CacheError::from) } pub async fn sunion( &self, keys: K, ) -> CacheResult> { let mut conn = self.conn().clone(); conn.sunion(keys).await.map_err(CacheError::from) } pub async fn sdiff( &self, keys: K, ) -> CacheResult> { let mut conn = self.conn().clone(); conn.sdiff(keys).await.map_err(CacheError::from) } pub async fn spop(&self, key: &str) -> CacheResult> { let mut conn = self.conn().clone(); conn.spop(key).await.map_err(CacheError::from) } pub async fn spop_many( &self, key: &str, count: usize, ) -> CacheResult> { let mut cmd = Cmd::new(); cmd.arg("SPOP").arg(key).arg(count); self.exec(&cmd).await } }