用于数字的生菜 RedisCodec

use*_*636 7 java redis lettuce

第一次使用 Lettuce 5 作为 Redis 客户端,我发现简单地创建一个RedisCommands<String, Long>用于获取/设置 Redis 值作为 Long 的对象相当混乱。

我有点不清楚我如何才能做到这一点。据我所知,最简单的方法是使用带有and的RedisClient重载构造函数,但似乎我还需要实现编解码器解码/编码方法?RedisCodecRedisURI

由于存储数字是 Redis 的一个相当常见的用例,我发现这种方法相当臃肿,而且我很惊讶没有预定义的整数/长编解码器。鉴于此,我怀疑可能有一个我没有遇到过的更简单的替代方案。有替代方法吗?

Lau*_*ent 2

我遇到了类似的需求,最终编写了以下编解码器:

import io.lettuce.core.codec.RedisCodec;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.StandardCharsets;

public class StringLongRedisCodec implements RedisCodec<String, Long> {

    @Override
    public String decodeKey(final ByteBuffer bytes) {
        return StandardCharsets.US_ASCII.decode(bytes).toString();
    }

    @Override
    public Long decodeValue(final ByteBuffer bytes) {
        final CharBuffer charSequence = StandardCharsets.US_ASCII.decode(bytes);
        return Long.parseLong(charSequence, 0, charSequence.length(), 10);
    }

    @Override
    public ByteBuffer encodeKey(final String key) {
        return StandardCharsets.US_ASCII.encode(key);
    }

    @Override
    public ByteBuffer encodeValue(final Long value) {
        return ByteBuffer.wrap(Long.toString(value).getBytes());
    }

}
Run Code Online (Sandbox Code Playgroud)