Skip to content

a lightweight multi-data source management tool for redis

License

Notifications You must be signed in to change notification settings

codebaorg/redis-keeper

Repository files navigation

English | 简体中文

Redis keeper - Lightweight Redis Multi-datasource Management Tool

Maven Central License

Supported JDK: 1.8 ... 21

Supported Redisson: 3.15.5 ... 3.35.0

Supported Redis: 3.0 ... 7.2

Features

  • Based on redisson package, retain all the powerful features of redisson
  • Support for multiple data source configuration and real-time updates for redis
  • Support "read-only", "write-only", "read-write" and "skip" state switching for redis data sources
  • Excellent expandability and compatibility to meet all your needs

Quick start

Maven

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

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

Gradle

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

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

Sbt

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

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

Java

// 1. Create config object
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379").setPassword(yourPass);
// 2. Create datasource
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. Create datasource provider
CacheTemplateProvider<CacheTemplate> provider = new CacheTemplateProvider<>(dsMap, dssMap);
// 4. Get redis template
Optional<CacheTemplate> templateOptional = provider.getTemplate("ds1");
final CacheTemplate cacheTemplate = templateOptional.get();
cacheTemplate.set("foo", "bar");

// or get the read and write state of the cacheTemplate
Optional<CacheTemplate> templateOptionalRW = provider.getTemplate("ds1", CacheDatasourceStatus.RW);

// or get multiple cacheTemplates
Collection<CacheTemplate> cacheTemplates = provider.getTemplates("ds2");

// or load balanced polling to get cacheTemplate from multiple data sources
Optional<CacheTemplate> polledTemplate = provider.pollTemplate("ds2");

// or randomize cacheTemplate from multiple data sources
Optional<CacheTemplate> randomedTemplate = provider.randomTemplate("ds2");

Springboot

  1. Maven
<dependency>
	<groupId>org.codeba</groupId>
	<artifactId>redis-keeper-spring-boot-starter</artifactId>
	<version>2024.2.0</version>
</dependency>
  1. Example datasource configuration as follows:
redis-keeper:
  redis:
    datasource:
      ds1:
        host: localhost
        port: 6379
        password: yourPass
        invoke-params-print: true

    datasources:
      ds2:
        - host: localhost
          port: 6379
          database: 1
          password: yourPass
          invoke-params-print: true

        - host: localhost
          port: 6379
          database: 2
          password: yourPass
          invoke-params-print: true
  1. Examples of common methods:
@SpringBootTest
public class AppTest {

    @Autowired
    private CacheTemplateProvider<CacheTemplate> provider;

    @Test
    public void test() {
        String key = "foo";
        String value = "bar";

        final CacheTemplate cacheTemplate = provider.getTemplate("ds1").get();
        // set
        cacheTemplate.set(key, value);
        cacheTemplate.setObject(key, value);
        // get
        cacheTemplate.get(key);
        cacheTemplate.getObject(key);
        cacheTemplate.getLong(key);
        cacheTemplate.getDouble(key);
        // incr
        cacheTemplate.incr(key);
        // set get bit
        cacheTemplate.setBit(key, 7, true);
        cacheTemplate.getBit(key, 7);
        // del exists expire ttl unlink
        cacheTemplate.del(key);
        cacheTemplate.exists(key);
        cacheTemplate.expire(key, 10, TimeUnit.SECONDS);
        cacheTemplate.expireAt(key, System.currentTimeMillis());
        cacheTemplate.ttl(key);
        cacheTemplate.unlink(key);
        // geo
        cacheTemplate.geoAdd(key, 13.361389, 38.115556, "Sicily");
        cacheTemplate.geoAdd(key, 15.087269, 37.502669, "Palermo");
        cacheTemplate.geoDist(key, "Sicily", "Palermo", "km");
        // hash
        cacheTemplate.hSet(key, "field1", value);
        cacheTemplate.hGet(key, "field1");
        // hyberloglog
        cacheTemplate.pfAdd(key, Arrays.asList("a"));
        cacheTemplate.pfCount(key);
        // list
        cacheTemplate.rPush(key, "world", "hello");
        cacheTemplate.lRange(key, 0, -1);
        // set
        cacheTemplate.sAdd(key, "hello");
        cacheTemplate.sAdd(key, "world");
        cacheTemplate.sAdd(key, "world");
        cacheTemplate.sMembers(key);
        // zset
        cacheTemplate.zAdd(key, 1, "one");
        cacheTemplate.zAdd(key, 2, "two");
        cacheTemplate.zAdd(key, 3, "three");
        cacheTemplate.zRange(key, 0, -1);
        // bloom filter
        cacheTemplate.bfReserve(key, 1000, 0.01);
        cacheTemplate.bfAdd(key, "item1");
        cacheTemplate.bfAdd(key, "item1");
        cacheTemplate.bfExists(key, "item2");
        // lock
        cacheTemplate.tryLock(key, 3, TimeUnit.SECONDS);
        cacheTemplate.unlock(key);
        cacheTemplate.forceUnlock(key);
        // rate limiter
        cacheTemplate.trySetRateLimiter(key, 100, 1);
        cacheTemplate.tryAcquire(key);
        cacheTemplate.tryAcquire(key, 10);
        // pipeline execute
        cacheTemplate.pipeline(kBatch -> {
            kBatch.getString().setAsync(key, "bar");
            kBatch.getGeo().geoAddAsync(key, 13.361389, 38.115556, "Sicily");
            kBatch.getList().llenAsync(key);
        });
        // pipeline execute and get response
        final List<?> responses = cacheTemplate.pipelineWithResponses(kBatch -> {
            kBatch.getString().setAsync(key, "bar");
            kBatch.getGeo().geoAddAsync(key, 13.361389, 38.115556, "Sicily");
            kBatch.getList().llenAsync(key);
        });
        // pipeline execute async
        final CompletableFuture<Void> voidCompletableFuture = cacheTemplate.pipelineAsync(kBatch -> {
            kBatch.getString().setAsync(key, "bar");
            kBatch.getGeo().geoAddAsync(key, 13.361389, 38.115556, "Sicily");
            kBatch.getList().llenAsync(key);
        });
        // pipeline execute and get response async
        final CompletableFuture<List<?>> listCompletableFuture = cacheTemplate.pipelineWithResponsesAsync(kBatch -> {
            kBatch.getString().setAsync(key, "bar");
            kBatch.getGeo().geoAddAsync(key, 13.361389, 38.115556, "Sicily");
            kBatch.getList().llenAsync(key);
        });
    }

}

Unlimited Expansion

CacheTemplate adds new custom methods

  1. Maven
<dependency>
	<groupId>org.codeba</groupId>
	<artifactId>redis-keeper-spring-boot-starter</artifactId>
	<version>2024.2.0</version>
</dependency>
  1. CacheTemplate adds new custom methods

MyCacheTemplate.java

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

public class MyCacheTemplate extends DefaultRedissonTemplate implements CacheTemplate {

    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);
    }

}

Enabling the new 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. Enabling the new 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 custom redisson configuration

  1. Maven
<dependency>
	<groupId>org.codeba</groupId>
	<artifactId>redis-keeper-spring-boot-starter</artifactId>
	<version>2024.2.0</version>
</dependency>
  1. For example, custom setting the encoding of redisson serialization and deserialization while enabling the new CacheDatasource.
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<CacheTemplate> cacheDatasource() {
        return new DefaultCacheDatasource(){
            @Override
            public Consumer<CacheKeeperConfig> configPostProcessor(Consumer<CacheKeeperConfig> consumer) {
                return v -> v.getConfig().setCodec(new JsonJacksonCodec());
            }
        };
    }

}

More Samples

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

Star History

Star History Chart