mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 11:06:50 +08:00
refactor(redis_interface): make the redis command for using scripts to write into redis Generic (#6965)
This commit is contained in:
@ -849,20 +849,23 @@ impl super::RedisConnectionPool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(level = "DEBUG", skip(self))]
|
#[instrument(level = "DEBUG", skip(self))]
|
||||||
pub async fn incr_keys_using_script<V>(
|
pub async fn evaluate_redis_script<V, T>(
|
||||||
&self,
|
&self,
|
||||||
lua_script: &'static str,
|
lua_script: &'static str,
|
||||||
key: Vec<String>,
|
key: Vec<String>,
|
||||||
values: V,
|
values: V,
|
||||||
) -> CustomResult<(), errors::RedisError>
|
) -> CustomResult<T, errors::RedisError>
|
||||||
where
|
where
|
||||||
V: TryInto<MultipleValues> + Debug + Send + Sync,
|
V: TryInto<MultipleValues> + Debug + Send + Sync,
|
||||||
V::Error: Into<fred::error::RedisError> + 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)
|
.eval(lua_script, key, values)
|
||||||
.await
|
.await
|
||||||
.change_context(errors::RedisError::IncrementHashFieldFailed)
|
.change_context(errors::RedisError::IncrementHashFieldFailed)?;
|
||||||
|
Ok(val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -955,11 +958,10 @@ mod tests {
|
|||||||
.await
|
.await
|
||||||
.expect("failed to create redis connection pool");
|
.expect("failed to create redis connection pool");
|
||||||
let lua_script = r#"
|
let lua_script = r#"
|
||||||
local results = {}
|
|
||||||
for i = 1, #KEYS do
|
for i = 1, #KEYS do
|
||||||
results[i] = redis.call("INCRBY", KEYS[i], ARGV[i])
|
redis.call("INCRBY", KEYS[i], ARGV[i])
|
||||||
end
|
end
|
||||||
return results
|
return
|
||||||
"#;
|
"#;
|
||||||
let mut keys_and_values = HashMap::new();
|
let mut keys_and_values = HashMap::new();
|
||||||
for i in 0..10 {
|
for i in 0..10 {
|
||||||
@ -973,7 +975,45 @@ mod tests {
|
|||||||
.collect::<Vec<String>>();
|
.collect::<Vec<String>>();
|
||||||
|
|
||||||
// Act
|
// 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
|
// Assert Setup
|
||||||
result.is_ok()
|
result.is_ok()
|
||||||
|
|||||||
Reference in New Issue
Block a user