diff --git a/app/server/pom.xml b/app/server/pom.xml
index ec07573846..ff23f42546 100644
--- a/app/server/pom.xml
+++ b/app/server/pom.xml
@@ -72,6 +72,7 @@
appsmith-plugins
appsmith-server
appsmith-git
+ reactive-caching
diff --git a/app/server/reactive-caching/pom.xml b/app/server/reactive-caching/pom.xml
new file mode 100644
index 0000000000..b3ad052fb5
--- /dev/null
+++ b/app/server/reactive-caching/pom.xml
@@ -0,0 +1,125 @@
+
+
+
+
+ com.appsmith
+ integrated
+ 1.0-SNAPSHOT
+
+
+ 4.0.0
+ com.appsmith
+ reactiveCaching
+ 1.0-SNAPSHOT
+
+ reactiveCaching
+
+
+ UTF-8
+ 11
+ 3.4.1
+ 1.18.22
+ 1.17.2
+ 7.2.5.RELEASE
+ 2.22.0
+
+
+
+
+ org.pf4j
+ pf4j
+ ${org.pf4j.version}
+
+
+
+ io.projectreactor
+ reactor-core
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis-reactive
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ junit
+ junit
+
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+ org.projectlombok
+ lombok
+ ${org.projectlombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+
+ org.testcontainers
+ junit-jupiter
+ ${org.testcontainers.junit-jupiter.version}
+ test
+
+
+
+ uk.co.jemos.podam
+ podam
+ ${uk.co.jemos.podam.podam.version}
+ test
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+
+
+
diff --git a/app/server/reactive-caching/src/main/java/com/appsmith/caching/annotations/Cache.java b/app/server/reactive-caching/src/main/java/com/appsmith/caching/annotations/Cache.java
new file mode 100644
index 0000000000..4ac132a03d
--- /dev/null
+++ b/app/server/reactive-caching/src/main/java/com/appsmith/caching/annotations/Cache.java
@@ -0,0 +1,26 @@
+package com.appsmith.caching.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to mark a method to cache the result of a method call.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Cache {
+
+ /*
+ * This is the name of the cache.
+ */
+ String cacheName();
+
+ /**
+ * SPEL expression used to generate the key for the method call
+ * All method arguments can be used in the expression
+ */
+ String key() default "";
+
+}
diff --git a/app/server/reactive-caching/src/main/java/com/appsmith/caching/annotations/CacheEvict.java b/app/server/reactive-caching/src/main/java/com/appsmith/caching/annotations/CacheEvict.java
new file mode 100644
index 0000000000..99cc9a7e9a
--- /dev/null
+++ b/app/server/reactive-caching/src/main/java/com/appsmith/caching/annotations/CacheEvict.java
@@ -0,0 +1,31 @@
+package com.appsmith.caching.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to mark a method as a reactive cache evictor.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface CacheEvict {
+
+ /*
+ * This is the name of the cache.
+ */
+ String cacheName();
+
+ /**
+ * SPEL expression used to generate the key for the method call
+ * All method arguments can be used in the expression
+ */
+ String key() default "";
+
+ /**
+ * Whether to evict all keys for a given cache name.
+ */
+ boolean all() default false;
+
+}
diff --git a/app/server/reactive-caching/src/main/java/com/appsmith/caching/aspects/CacheAspect.java b/app/server/reactive-caching/src/main/java/com/appsmith/caching/aspects/CacheAspect.java
new file mode 100644
index 0000000000..3e66dbf43f
--- /dev/null
+++ b/app/server/reactive-caching/src/main/java/com/appsmith/caching/aspects/CacheAspect.java
@@ -0,0 +1,204 @@
+package com.appsmith.caching.aspects;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.interceptor.SimpleKey;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.expression.EvaluationContext;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+
+import com.appsmith.caching.annotations.CacheEvict;
+import com.appsmith.caching.annotations.Cache;
+import com.appsmith.caching.components.CacheManager;
+
+import lombok.extern.slf4j.Slf4j;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+/**
+ * CacheAspect is an aspect that is used to cache the results of a method call annotated with Cache.
+ * It is also possible to evict the cached result by annotating method with CacheEvict.
+ */
+@Aspect
+@Configuration
+@Slf4j
+public class CacheAspect {
+
+ private final CacheManager cacheManager;
+
+ public static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
+
+ @Autowired
+ public CacheAspect(CacheManager cacheManager) {
+ this.cacheManager = cacheManager;
+ }
+
+ /**
+ * This method is used to call original Mono returning method and return the the result after caching it with CacheManager
+ * @param joinPoint The join point of the method call
+ * @param cacheName The name of the cache
+ * @param key The key to be used for caching
+ * @return The result of the method call
+ */
+ private Mono