java - 用于数字的生菜 RedisCodec
问题描述
第一次使用 Lettuce 5 作为 Redis 客户端,我发现简单地创建一个RedisCommands<String, Long>
用于获取/设置 Redis 值的 Long 相当令人困惑。
我有点不清楚如何做到这一点。据我所知,最简单的方法是使用带有and的RedisClient
重载构造函数,但似乎我还需要实现编解码器解码/编码方法?RedisCodec
RedisURI
由于使用 Redis 存储数字是一个相当常见的用例,我发现这种方法相当臃肿,我很惊讶没有预定义的整数/长编解码器。鉴于此,我怀疑可能有一个我没有遇到过的更简单的替代方案。有替代方法吗?
解决方案
我遇到了类似的需求,最终编写了以下编解码器:
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());
}
}
推荐阅读
- android - NavController 添加片段而不是替换而不使用 Dialog
- css - 如何让子 div 填充父 div 在 CSS 中保持父填充?
- flutter - Flutter futurebuilder嵌套期货返回null
- javascript - 无法直接在子组件中访问道具
- sql - 当有些人没有中间名时,在 SQL 中连接名字、中间名和姓氏
- javascript - 正则表达式查找 XML 标记之外的任何符号
- swiftui - SwiftUI 2.0 防止在每次正文刷新时重新加载静态图像
- swiftui - 当 Enum 中的值随 SwiftUI 发生变化时如何更新视图?
- scala - 在scala中有两个变量的for循环
- tensorflow - TFRecordDataset 和 FixedLengthRecordDataset 有什么区别?