Skip to content

Latest commit

 

History

History
411 lines (304 loc) · 11.2 KB

README_zh.md

File metadata and controls

411 lines (304 loc) · 11.2 KB

English | 简体中文

Redis keeper - 一个轻量级的 redis 多数据源管理工具

Maven Central License

支持 JDK: 1.8 ... 21

支持 Redisson: 3.15.5 ... 3.27.0

支持 Redis: 3.0 ... 7.2

特征

  • 基于redisson封装,保留redisson所有强大功能
  • 支持redis的多数据源配置和实时更新
  • 支持redis数据源的“只读”、“只写”、“读写”、“跳过”的状态切换
  • 具有优秀的拓展性和兼容性

快速开始

Maven

<dependency>
   <groupId>org.codeba</groupId>
   <artifactId>redis-keeper-core</artifactId>
   <version>2024.0.0</version>
</dependency> 

<dependency>
   <groupId>org.codeba</groupId>
   <artifactId>redis-keeper-support</artifactId>
   <version>2024.0.0</version>
</dependency>

Gradle

implementation group: 'org.codeba', name: 'redis-keeper-core', version: '2024.0.0'

implementation group: 'org.codeba', name: 'redis-keeper-support', version: '2024.0.0'

Sbt

libraryDependencies += "org.codeba" % "redis-keeper-core" % "2024.0.0"

libraryDependencies += "org.codeba" % "redis-keeper-support" % "2024.0.0"

Java

// 1. 创建配置类
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379").setPassword(yourPass);
// 2. 创建数据源
DefaultCacheDatasource datasource = new DefaultCacheDatasource();

Map<String, CacheTemplate> dsMap = datasource.initialize(new HashMap<String, CacheKeeperConfig>() {{
    put("ds1", new CacheKeeperConfig(config));
}});

Map<String, List<CacheTemplate>> dssMap = datasource.initializeMulti(new HashMap<String, List<CacheKeeperConfig>>() {{
    put("ds2", Collections.singletonList(new CacheKeeperConfig(config)));
}});
// 3. 创建数据源提供者
CacheTemplateProvider<CacheTemplate> provider = new CacheTemplateProvider<>(dsMap, dssMap);
// 4. 获取CacheTemplate
Optional<CacheTemplate> templateOptional = provider.getTemplate("ds1");
final CacheTemplate cacheTemplate = templateOptional.get();
cacheTemplate.set("foo", "bar");

// 或者获取“读写”状态的CacheTemplate
Optional<CacheTemplate> templateOptionalRW = provider.getTemplate("ds1", CacheDatasourceStatus.RW);

// 或者获取多个相同用途的CacheTemplate
Collection<CacheTemplate> cacheTemplates = provider.getTemplates("ds2");

// 或者从多个相同用途的CacheTemplate中轮询获取一个(负载均衡)
Optional<CacheTemplate> polledTemplate = provider.pollTemplate("ds2");

// 或者从多个相同用途的CacheTemplate中随机获取一个
Optional<CacheTemplate> randomedTemplate = provider.randomTemplate("ds2");

更多示例

  1. Redis-Keeper only
  2. Redis-Keeper with Spring boot
  3. Redis-Keeper with Spring cloud

配置说明

redis-keeper全部的可配置项完全兼容Spring Data Redis和Redisson的配置。示例如下:

redis-keeper:
  redis:
    datasource:
    #.....
    datasources:
    #.....
  redisson:
    datasource:
    #.....
    datasources:
    #.....

redis.datasource

  • 类型:Map<String,RedisKeeperProperties>
  • 默认值:null

示例如下:

redis-keeper:
    redis:
        datasource:
          ds1:
              host: xx
              port: xx
              database: xx
              password: xx
          ds2:
              host: xx
              port: xx
              database: xx
              password: xx
          ds3:
              host: xx
              port: xx
              database: xx
              password: xx

redis.datasources

  • 类型:Map<String, List<RedisKeeperProperties>
  • 默认值:null
redis-keeper:
    redis:
        datasources:
            ds1:
                - host: xx
                  port: xx
                  database: xx
                  password: xx
                - host: xx
                  port: xx
                  database: xx
                  password: xx
            ds2:
                - host: xx
                  port: xx
                  database: xx
                  password: xx
                - host: xx
                  port: xx
                  database: xx
                  password: xx
            ds3:
                - host: xx
                  port: xx
                  database: xx
                  password: xx
                - host: xx
                  port: xx
                  database: xx
                  password: xx

RedisKeeperProperties

配置 类型 默认值 取值范围
status string RW RO、WO、RW、SKIP
invoke-params-print boolean false true、false
host string localhost -
port number 6379 -
database number 0 -
password string null -

更多的配置请查看Spring Data Redis的配置类: spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisProperties.java at main · spring-projects/spring-boot (github.com)

redisson.datasource

  • 类型:Map<String,RedissonKeeperProperties>
  • 默认值:null

示例如下:

redis-keeper:
  redisson:
    datasource:
      ds1:
        invoke-params-print: true
        status: RW
        config: |
          singleServerConfig:
            address: redis://xxx:6379
            database: 0
            password: xxx

redisson.datasources

  • 类型:Map<String, List<RedissonKeeperProperties>
  • 默认值:null

示例如下:

redis-keeper:
  redisson:
    datasources:
      ds2:
        - invoke-params-print: true
          status: RW
          config: |
            singleServerConfig:
            address: redis://xxx:6379
            database: 0
            password: xxx

        - invoke-params-print: true
          status: RW
          config: |
            singleServerConfig:
            address: redis://xxx:6379
            database: 0
            password: xxx

RedissonKeeperProperties

配置 类型 默认值 取值范围
status string RW RO、WO、RW、SKIP
invoke-params-print boolean false true、false
config string null -
file string null -

更多的配置请查看Redisson的配置类: redisson/redisson-spring-boot-starter/src/main/java/org/redisson/spring/starter/RedissonProperties.java at master · redisson/redisson (github.com)

扩展

CacheTemplate新增自定义方法

  1. Maven依赖
<dependency>
	<groupId>org.codeba</groupId>
	<artifactId>redis-keeper-spring-boot-starter</artifactId>
	<version>2024.0.0</version>
</dependency>
  1. CacheTemplate新增自定义的方法

自定义 MyCacheTemplate.java

import org.codeba.redis.keeper.support.CacheKeeperConfig;
import org.codeba.redis.keeper.support.DefaultRedissonTemplate;

public class MyCacheTemplate extends DefaultRedissonTemplate {

    public MyCacheTemplate(CacheKeeperConfig cacheKeeperConfig) {
        super(cacheKeeperConfig);
    }

    public void test() {
	final RedissonClient redissonClient = getDataSource();
        redissonClient.someMehotd();
        System.out.println("hello world");
    }

}

自定义 MyCacheDatasource.java

import org.codeba.redis.keeper.support.CacheDatasource;
import org.codeba.redis.keeper.support.CacheKeeperConfig;

public class MyCacheDatasource implements CacheDatasource<MyCacheTemplate> {

    @Override
    public MyCacheTemplate instantTemplate(CacheKeeperConfig config) {
        return new MyCacheTemplate(config);
    }

}

使新的MyCacheDatasource生效

import org.codeba.redis.keeper.support.CacheDatasource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration {

    @Bean
    public CacheDatasource<MyCacheTemplate> cacheDatasource() {
        return new MyCacheDatasource();
    }

}
  1. 使用新的CacheTemplate
@SpringBootTest
public class AppTest {

    @Autowired
    private CacheTemplateProvider<MyCacheTemplate> myProvider;

    @Test
    public void testMyProvider() {
        final Optional<MyCacheTemplate> templateOptional = myProvider.getTemplate("ds1");

        if (templateOptional.isPresent()) {
            final MyCacheTemplate cacheTemplate = templateOptional.get();

            // Custom Methods
            cacheTemplate.test();

        }
    }

}

CacheDatasource自定义redisson配置

  1. Maven依赖
<dependency>
	<groupId>org.codeba</groupId>
	<artifactId>redis-keeper-spring-boot-starter</artifactId>
	<version>2024.0.0</version>
</dependency>
  1. 自定义 MyCacheDatasource.java,比如自定义设置redisson序列化和反序列化的编码方式。
import org.codeba.redis.keeper.support.CacheDatasource;
import org.codeba.redis.keeper.support.CacheKeeperConfig;

public class MyCacheDatasource implements CacheDatasource<MyCacheTemplate> {

    @Override
    public Consumer<CacheKeeperConfig> configPostProcessor(Consumer<CacheKeeperConfig> consumer) {
        return v -> v.getConfig().setCodec(new JsonJacksonCodec());
    }

}
  1. 使新的MyCacheDatasource生效
import org.codeba.redis.keeper.support.CacheDatasource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration {

    @Bean
    public CacheDatasource<MyCacheTemplate> cacheDatasource() {
        return new MyCacheDatasource();
    }

}

常见问题

  1. Fix: JsonJacksonCodec fails to serialize Throwable on Java17 by tomj-vm · Pull Request ​#5436 · redisson/redisson (github.com)#

  2. Redisson.getBlockingDeque:java.lang.NoClassDefFoundError: java/util/SequencedCollection · Issue #5402 · redisson/redisson (github.com) redisson的3.24.3 版本 有bug