Skip to content

Commit

Permalink
refactor(redis_interface): make the redis command for using scripts t…
Browse files Browse the repository at this point in the history
…o write into redis Generic (#6965)
  • Loading branch information
Aprabhat19 authored Jan 16, 2025
1 parent 17eeda4 commit 3434651
Showing 1 changed file with 48 additions and 8 deletions.
56 changes: 48 additions & 8 deletions crates/redis_interface/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -849,20 +849,23 @@ impl super::RedisConnectionPool {
}

#[instrument(level = "DEBUG", skip(self))]
pub async fn incr_keys_using_script<V>(
pub async fn evaluate_redis_script<V, T>(
&self,
lua_script: &'static str,
key: Vec<String>,
values: V,
) -> CustomResult<(), errors::RedisError>
) -> CustomResult<T, errors::RedisError>
where
V: TryInto<MultipleValues> + Debug + Send + Sync,
V::Error: Into<fred::error::RedisError> + Send + Sync,
T: serde::de::DeserializeOwned + FromRedis,
{
self.pool
let val: T = self
.pool
.eval(lua_script, key, values)
.await
.change_context(errors::RedisError::IncrementHashFieldFailed)
.change_context(errors::RedisError::IncrementHashFieldFailed)?;
Ok(val)
}
}

Expand Down Expand Up @@ -955,11 +958,10 @@ mod tests {
.await
.expect("failed to create redis connection pool");
let lua_script = r#"
local results = {}
for i = 1, #KEYS do
results[i] = redis.call("INCRBY", KEYS[i], ARGV[i])
redis.call("INCRBY", KEYS[i], ARGV[i])
end
return results
return
"#;
let mut keys_and_values = HashMap::new();
for i in 0..10 {
Expand All @@ -973,7 +975,45 @@ mod tests {
.collect::<Vec<String>>();

// Act
let result = pool.incr_keys_using_script(lua_script, key, values).await;
let result = pool
.evaluate_redis_script::<_, ()>(lua_script, key, values)
.await;

// Assert Setup
result.is_ok()
})
})
.await
.expect("Spawn block failure");

assert!(is_success);
}
#[tokio::test]
async fn test_getting_keys_using_scripts() {
let is_success = tokio::task::spawn_blocking(move || {
futures::executor::block_on(async {
// Arrange
let pool = RedisConnectionPool::new(&RedisSettings::default())
.await
.expect("failed to create redis connection pool");
let lua_script = r#"
local results = {}
for i = 1, #KEYS do
results[i] = redis.call("GET", KEYS[i])
end
return results
"#;
let mut keys_and_values = HashMap::new();
for i in 0..10 {
keys_and_values.insert(format!("key{}", i), i);
}

let key = keys_and_values.keys().cloned().collect::<Vec<_>>();

// Act
let result = pool
.evaluate_redis_script::<_, String>(lua_script, key, 0)
.await;

// Assert Setup
result.is_ok()
Expand Down

0 comments on commit 3434651

Please sign in to comment.