mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-01 02:57:02 +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
	 Amisha Prabhat
					Amisha Prabhat