Springboot集成Tile38客户端

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Springboot集成Tile38客户端

原理

为了能够在springboot项目中使用Tile38空间数据库,我们需要把Tile38客户端集成到springboot项目中。因为Tile38使用了redis协议,所以我们可以使用现有的redis客户端工具类集成Tile38的命令。

依赖

redis客户端工具中,我们首选lettuce,我们先把相关的依赖引进来:

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.2.0.RELEASE</version>
</dependency>
复制代码

实现自定义命令

因为Tile38有些命令和Redis命令不同,所以我们无法直接使用现有的redis命令来操作Tile38;因此我们需要在redis客户端的基础上实现自己的自定义命令。

  • 创建Tile38客户端链接
@Data
public class Client implements AutoCloseable {
  private static final StringCodec STRING_CODEC = new StringCodec(StandardCharsets.UTF_8);
  // redis客户端
  private RedisClient redisClient;
  // tile38链接
  private StatefulRedisConnection<String, String> conn;
  // 命令工具,主要用来发送命令,基于上面的链接来发送命令
  private RedisCommands<String, String> commands;
  // 构造一个客户端工具
  public Client(final String host, final int port) {
    this(host, port, StringUtils.EMPTY);
  }
  // 构造客户端工具
  public Client(final String host, final int port, final String password) {
    // 先构造redis客户端工具
    this.redisClient = RedisClient.create(RedisURI.create(host, port));
    // 获取链接
    this.conn = this.redisClient.connect();
    // 创建命令工具
    this.commands = this.conn.sync();
    if (StringUtils.isNotBlank(password)) {
      // 校验密码
      auth(password);
    }
    // 修改当前通道返回的数据格式
    output(OutPutType.JSON);
  }
}
复制代码
  • 在上面的代码中,总共做了三步操作:
  1. 通过host和端口号建立redis客户端,其实底层是基于Netty client实现的,此时还没有与Tile38服务器建立链接;
  2. 调用connect()方法,这个时候依然没有建立链接,只是把需要建立链接的参数设置好,直到sync()后才真正地与Tile38建立了链接;
  3. 在建立链接后,做了校验密码的操作和设置返回数据格式的操作;其实这两步操作就已经是在执行相应的Tile38命令了;
  • 执行Tile38命令
    下面这种执行命令的方式是最简单的一种方式,适用于执行不带任何参数的命令,比如PING
// 执行Tile38命令
private String execute(Tile38Command command) {
    // 执行指定命令并返回字符串
    return commands.dispatch(command, new ValueOutput<>(STRING_CODEC));
}
复制代码
  • 为了满足需要执行带参数的命令,我们还要重载execute方法,给它补上一个args参数;
    同样的,我们还可以做其他的重载,下面针对数组和列表各重载了一次。
    比如创建链接成功后,需要校验密码的时候,就可以使用这个重载后的方法执行AUTH password命令;
private String execute(Tile38Command command, String... args) {
    CommandArgs<String, String> commandArgs = new CommandArgs<>(STRING_CODEC);
    if (ArrayUtils.isNotEmpty(args)) {
        for (String arg : args) {
            commandArgs.add(arg);
        }
    }
    return commands.dispatch(command, new ValueOutput<>(STRING_CODEC), commandArgs);
}
private String execute(Tile38Command command, List<String> args) {
    CommandArgs<String, String> commandArgs = new CommandArgs<>(STRING_CODEC);
    if (!CollectionUtils.isEmpty(args)) {
        for (String arg : args) {
            commandArgs.add(arg);
        }
    }
    return commands.dispatch(command, new ValueOutput<>(STRING_CODEC), commandArgs);
}
复制代码
  • 从上面的代码中,可以看出,通过redis客户端调用Tile38命令就跟拼接参数一样,只要把对应的参数按顺序放到对应的数组或者列表中去,就可以通过redis客户端发送给Tile38服务器去执行。那么根据上面得到的规律,我们再次重载execute方法,以便让我们再更复杂的命令中使用起来更加方便:
private String execute(Tile38Command command, List<String>... args) {
    CommandArgs<String, String> commandArgs = new CommandArgs<>(STRING_CODEC);
    if (ArrayUtils.isNotEmpty(args)) {
      for (List<String> argList : args) {
        for (String arg : argList) {
          commandArgs.add(arg);
        }
      }
    }
    return commands.dispatch(command, new ValueOutput<>(STRING_CODEC), commandArgs);
  }
  private String execute(Tile38Command command, String[]... args) {
    CommandArgs<String, String> commandArgs = new CommandArgs<>(STRING_CODEC);
    if (ArrayUtils.isNotEmpty(args)) {
      for (String[] argList : args) {
        for (String arg : argList) {
          commandArgs.add(arg);
        }
      }
    }
    return commands.dispatch(command, new ValueOutput<>(STRING_CODEC), commandArgs);
  }
复制代码
  • 关闭链接
    我们为了在客户端使用完毕后能够及时地释放掉,需要实现AutoCloseable接口,以便我们能够通过close方法释放资源:
@Override
public void close() {
    // 先把commands置为null,以便解除对conn的依赖
    if (Objects.nonNull(this.commands)) {
        this.commands = null;
    }
    // 关闭链接
    if (Objects.nonNull(this.conn)) {
        this.conn.close();
    }
    // 关闭Netty的线程池
    if (Objects.nonNull(redisClient)) {
        redisClient.shutdown();
    }
}
复制代码

至此,我们就完成了一个最简单的Tile38客户端的集成。为了让开发人员能够更好地使用我们集成的客户端工具,我们还需要在此基础上最一些封装、优化的工作。后续我将逐步补充如何封装Tile38命令,让这个工具更好使用。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
17天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
63 1
|
27天前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
27 1
|
17天前
|
XML 存储 Java
SpringBoot集成Flowable:构建强大的工作流引擎
在企业级应用开发中,工作流管理是核心功能之一。Flowable是一个开源的工作流引擎,它提供了BPMN 2.0规范的实现,并且与SpringBoot框架完美集成。本文将探讨如何使用SpringBoot和Flowable构建一个强大的工作流引擎,并分享一些实践技巧。
46 0
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
303 11
|
2月前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
2月前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
2月前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0

热门文章

最新文章

下一篇
无影云桌面