暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

protobuf 在 java redis 如何使用

纯洁的明依 2020-12-24
2327

接着上一篇文章 本篇主要介绍 protobuf Redis 集成使用.

关于为什么要使用protobuf 作为序列化 框架使用不再赘述。

下面首先介绍在idea 中 使用插件 根据.proto 文件生成 .java 文件

1. 首先在此module 中编写一个.proto 文件

 


2 pom 引用插件

<plugin>  <groupId>org.xolstice.maven.plugins</groupId>  <artifactId>protobuf-maven-plugin</artifactId>  <version>0.5.0</version>  <configuration>    <protocArtifact>      com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}    </protocArtifact>    <pluginId>grpc-java</pluginId>    <pluginArtifact>      io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}    </pluginArtifact>  </configuration>  <executions>    <execution>      <goals>        <goal>compile</goal>      </goals>    </execution>  </executions></plugin>

 

 


 

点击 protobuf:complie

在项目target文件下 会生成一个 Java文件

 


将此文件复制到你项目源码目录即可使用。完毕后 pom 插件 注释掉。防止每次编译都会生成Java文件 导致项目报错。

 

2 关于spring Boot 如何集成redis 不再赘述 直接上关于RedisSerializer

类编写

我们现在要使用protobuf 作为redis 存储 序列化 工具。

需要编写一个RedisSerializer 实现类:

为了通用,故定义成泛型:

@Slf4jpublic class ProtobufRedisSerializer<T extends MessageLite> implements RedisSerializer<T> {  private MessageLite messageLite;  private Class<T> type;  public ProtobufRedisSerializer(T messageLite, Class<T> type) {    this.messageLite = messageLite;    this.type = type;  }  @Override  public byte[] serialize(T t) throws SerializationException {    return t.toByteArray();  }  @Override  public T deserialize(byte[] bytes) throws SerializationException {    try {      if (Objects.isNull(bytes) || bytes.length == 0) {        return null;      }      MessageLite messageLite = this.messageLite.getParserForType().parseFrom(bytes);      return type.cast(messageLite);    } catch (InvalidProtocolBufferException e) {      log.error("ProtobufRedisSerializer error", e);    }    return null;  }}

 

核心代码如上:

 

附上RedisTenplateConfig

@Beanpublic RedisTemplate<String, DynamicRecord> recordRedisTemplate(    RedisConnectionFactory connectionFactory) {  RedisTemplate<String, DynamicRecord> recordRedisTemplate = new RedisTemplate<>();  recordRedisTemplate.setConnectionFactory(connectionFactory);  ProtobufRedisSerializer<DynamicRecord> protobufRedisSerializer = new ProtobufRedisSerializer<>(      DynamicRecord.getDefaultInstance(), DynamicRecord.class);  recordRedisTemplate.setValueSerializer(protobufRedisSerializer);  recordRedisTemplate.setHashValueSerializer(protobufRedisSerializer);  StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();  recordRedisTemplate.setKeySerializer(stringRedisSerializer);  recordRedisTemplate.setHashKeySerializer(stringRedisSerializer);  return recordRedisTemplate;}

 

关于使用RedisTemplate API 操作数据 不再赘述。


文章转载自纯洁的明依,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论