diff --git a/crane4j-extension/crane4j-extension-redisson/pom.xml b/crane4j-extension/crane4j-extension-redisson/pom.xml
new file mode 100644
index 00000000..1025476f
--- /dev/null
+++ b/crane4j-extension/crane4j-extension-redisson/pom.xml
@@ -0,0 +1,34 @@
+
+
+ 4.0.0
+
+ cn.crane4j
+ crane4j
+ 2.8.0
+ ../../pom.xml
+
+
+ crane4j-extension-redisson
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+ cn.crane4j
+ crane4j-core
+ 2.8.0
+ compile
+
+
+ org.redisson
+ redisson-spring-boot-starter
+ 3.15.6
+
+
+
+
\ No newline at end of file
diff --git a/crane4j-extension/crane4j-extension-redisson/src/main/java/cn/crane4j/extension/redisson/StringKeyRedissonCacheManger.java b/crane4j-extension/crane4j-extension-redisson/src/main/java/cn/crane4j/extension/redisson/StringKeyRedissonCacheManger.java
new file mode 100644
index 00000000..f168e05a
--- /dev/null
+++ b/crane4j-extension/crane4j-extension-redisson/src/main/java/cn/crane4j/extension/redisson/StringKeyRedissonCacheManger.java
@@ -0,0 +1,243 @@
+package cn.crane4j.extension.redisson;
+import cn.crane4j.core.cache.AbstractCacheManager;
+import lombok.NonNull;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.nullness.qual.Nullable;
+import org.redisson.api.RBatch;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+@Setter
+@Slf4j
+public class StringKeyRedissonCacheManger extends AbstractCacheManager {
+ /**
+ * Global prefix for all cache keys
+ */
+ @NonNull
+ private String globalPrefix = "crane4j:cache:";
+ @NonNull
+ private RedissonClient redissonClient;
+ private boolean enableClearCache = false;
+ public StringKeyRedissonCacheManger(@NonNull RedissonClient redisson) {
+ this.redissonClient = redisson;
+ }
+
+ /**
+ * Create cache instance.
+ */
+ @NonNull
+ @Override
+ protected RedissonCacheObject doCreateCache(String name,Long expireTime, TimeUnit timeUnit){
+ return new RedissonCacheObject(name,expireTime,timeUnit);
+ }
+
+ /**
+ * Get the cache key which is used to store value in redisson.
+ */
+ protected String resolveCacheKey(String cacheName,String key){
+ return globalPrefix + ":" + cacheName + ":" + key;
+ }
+
+ /**
+ * Resolve cache value.
+ * @param value cache value
+ * @return cache value
+ */
+ protected Object resolveCacheValue(Object value){return value;}
+
+ /**
+ * Clean all cache value for a specified cache object.
+ */
+ protected void cleanCache(String cacheName) {
+ if (enableClearCache) {
+ String prefix = globalPrefix + ":" + cacheName + ":*";
+
+ long deletedCount = 0;
+ for (String key : redissonClient.getKeys().getKeysByPattern(prefix)) {
+ RBucket